好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#实现HTML转WORD及WORD转PDF的方法

本文实例讲述了C#实现HTML转WORD及WORD转PDF的方法。分享给大家供大家参考。具体如下:

功能:实现HTML转WORD,WORD转PDF

具体代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Word = Microsoft.Office.Interop.Word;

using oWord = Microsoft.Office.Interop.Word;

using System.Reflection;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using Microsoft.Office.Core;

using System.Text.RegularExpressions;

namespace WindowsApplication2

{

  public partial class Form1 : Form

  {

   public Form1()

   {

    InitializeComponent();

   }

   private void button1_Click( object sender, EventArgs e)

   {

    object oMissing = System.Reflection.Missing.Value;

    object oEndOfDoc = "\\endofdoc" ; /* \endofdoc is a predefined bookmark */

    //Start Word and create a new document.

    Word._Application oWord;

    Word._Document oDoc;

    oWord = new Word.Application();

    oWord.Visible = true ;

    oDoc = oWord.Documents.Add( ref oMissing, ref oMissing,

     ref oMissing, ref oMissing);

    //Insert a paragraph at the beginning of the document.

    Word.Paragraph oPara1;

    oPara1 = oDoc.Content.Paragraphs.Add( ref oMissing);

    oPara1.Range.Text = "Heading 1" ;

    oPara1.Range.Font.Bold = 1;

    oPara1.Format.SpaceAfter = 24; //24 pt spacing after paragraph.

    oPara1.Range.InsertParagraphAfter();

    //Insert a paragraph at the end of the document.

    Word.Paragraph oPara2;

    object oRng = oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range;

    oPara2 = oDoc.Content.Paragraphs.Add( ref oRng);

    oPara2.Range.Text = "Heading 2" ;

    oPara2.Format.SpaceAfter = 6;

    oPara2.Range.InsertParagraphAfter();

    //Insert another paragraph.

    Word.Paragraph oPara3;

    oRng = oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range;

    oPara3 = oDoc.Content.Paragraphs.Add( ref oRng);

    oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:" ;

    oPara3.Range.Font.Bold = 0;

    oPara3.Format.SpaceAfter = 24;

    oPara3.Range.InsertParagraphAfter();

    //Insert a 3 x 5 table, fill it with data, and make the first row

    //bold and italic.

    Word.Table oTable;

    Word.Range wrdRng = oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range;

    oTable = oDoc.Tables.Add(wrdRng, 3, 5, ref oMissing, ref oMissing);

    oTable.Range.ParagraphFormat.SpaceAfter = 6;

    int r, c;

    string strText;

    for (r = 1; r <= 3; r++)

     for (c = 1; c <= 5; c++)

     {

      strText = "r" + r + "c" + c;

      oTable.Cell(r, c).Range.Text = strText;

     }

    oTable.Rows[1].Range.Font.Bold = 1;

    oTable.Rows[1].Range.Font.Italic = 1;

    //Add some text after the table.

    Word.Paragraph oPara4;

    oRng = oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range;

    oPara4 = oDoc.Content.Paragraphs.Add( ref oRng);

    oPara4.Range.InsertParagraphBefore();

    oPara4.Range.Text = "And here's another table:" ;

    oPara4.Format.SpaceAfter = 24;

    oPara4.Range.InsertParagraphAfter();

    //Insert a 5 x 2 table, fill it with data, and change the column widths.

    wrdRng = oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range;

    oTable = oDoc.Tables.Add(wrdRng, 5, 2, ref oMissing, ref oMissing);

    oTable.Range.ParagraphFormat.SpaceAfter = 6;

    for (r = 1; r <= 5; r++)

     for (c = 1; c <= 2; c++)

     {

      strText = "r" + r + "c" + c;

      oTable.Cell(r, c).Range.Text = strText;

     }

    oTable.Columns[1].Width = oWord.InchesToPoints(2); //Change width of columns 1 & 2

    oTable.Columns[2].Width = oWord.InchesToPoints(3);

    //Keep inserting text. When you get to 7 inches from top of the

    //document, insert a hard page break.

    object oPos;

    double dPos = oWord.InchesToPoints(7);

    oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range.InsertParagraphAfter();

    do

    {

     wrdRng = oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range;

     wrdRng.ParagraphFormat.SpaceAfter = 6;

     wrdRng.InsertAfter( "A line of text" );

     wrdRng.InsertParagraphAfter();

     oPos = wrdRng.get_Information

         (Word.WdInformation.wdVerticalPositionRelativeToPage);

    }

    while (dPos >= Convert.ToDouble(oPos));

    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;

    object oPageBreak = Word.WdBreakType.wdPageBreak;

    wrdRng.Collapse( ref oCollapseEnd);

    wrdRng.InsertBreak( ref oPageBreak);

    wrdRng.Collapse( ref oCollapseEnd);

    wrdRng.InsertAfter( "We're now on page 2. Here's my chart:" );

    wrdRng.InsertParagraphAfter();

    //Insert a chart.

    Word.InlineShape oShape;

    object oClassType = "MSGraph.Chart.8" ;

    wrdRng = oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range;

    oShape = wrdRng.InlineShapes.AddOLEObject( ref oClassType, ref oMissing,

     ref oMissing, ref oMissing, ref oMissing,

     ref oMissing, ref oMissing, ref oMissing);

    //Demonstrate use of late bound oChart and oChartApp objects to

    //manipulate the chart object with MSGraph.

    object oChart;

    object oChartApp;

    oChart = oShape.OLEFormat.Object;

    oChartApp = oChart.GetType().InvokeMember( "Application" ,

     BindingFlags.GetProperty, null , oChart, null );

    //Change the chart type to Line.

    object [] Parameters = new Object[1];

    Parameters[0] = 4; //xlLine = 4

    oChart.GetType().InvokeMember( "ChartType" , BindingFlags.SetProperty,

     null , oChart, Parameters);

    //Update the chart image and quit MSGraph.

    oChartApp.GetType().InvokeMember( "Update" ,

     BindingFlags.InvokeMethod, null , oChartApp, null );

    oChartApp.GetType().InvokeMember( "Quit" ,

     BindingFlags.InvokeMethod, null , oChartApp, null );

    //... If desired, you can proceed from here using the Microsoft Graph

    //Object model on the oChart and oChartApp objects to make additional

    //changes to the chart.

    //Set the width of the chart.

    oShape.Width = oWord.InchesToPoints(6.25f);

    oShape.Height = oWord.InchesToPoints(3.57f);

    //Add text after the chart.

    wrdRng = oDoc.Bookmarks.get_Item( ref oEndOfDoc).Range;

    wrdRng.InsertParagraphAfter();

    wrdRng.InsertAfter( "THE END." );

    //Close this form.

    this .Close();

   }

   private void button2_Click( object sender, EventArgs e)

   {

    string s = "" ;

    if (openFileDialog1.ShowDialog() == DialogResult.OK)

    {

     s = openFileDialog1.FileName;

    }

    else

    {

     return ;

    }

    // 在此处放置用户代码以初始化页面

    Word.ApplicationClass word = new Word.ApplicationClass();

    Type wordType = word.GetType();

    Word.Documents docs = word.Documents;

    // 打开文件

    Type docsType = docs.GetType();

    object fileName = s;

    Word.Document doc = (Word.Document)docsType.InvokeMember( "Open" ,

    System.Reflection.BindingFlags.InvokeMethod, null , docs, new Object[] { fileName, false , false });

    // 转换格式,另存为

    Type docType = doc.GetType();

    object saveFileName = "d:\\Reports\\aaa.doc" ;

    //下面是Microsoft Word 9 Object Library的写法,如果是10,可能写成:

    /*

    docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod,

     null, doc, new object[]{saveFileName, Word.WdSaveFormat.wdFormatFilteredHTML});

    */

    ///其它格式:

    ///wdFormatHTML

    ///wdFormatDocument

    ///wdFormatDOSText

    ///wdFormatDOSTextLineBreaks

    ///wdFormatEncodedText

    ///wdFormatRTF

    ///wdFormatTemplate

    ///wdFormatText

    ///wdFormatTextLineBreaks

    ///wdFormatUnicodeText

    docType.InvokeMember( "SaveAs" , System.Reflection.BindingFlags.InvokeMethod,

     null , doc, new object [] { saveFileName, Word.WdSaveFormat.wdFormatDocument });

    // 退出 Word

    wordType.InvokeMember( "Quit" , System.Reflection.BindingFlags.InvokeMethod,

     null , word, null );

   }

   private void WordConvert( string s)

   {

    oWord.ApplicationClass word = new Microsoft.Office.Interop.Word.ApplicationClass();

    Type wordType = word.GetType();

    //打开WORD文档

    /*对应脚本中的

     var word = new ActiveXObject("Word.Application");

     var doc = word.Documents.Open(docfile);

    */

    oWord.Documents docs = word.Documents;

    Type docsType = docs.GetType();

    object objDocName =s;

    oWord.Document doc = (oWord.Document)docsType.InvokeMember( "Open" , System.Reflection.BindingFlags.InvokeMethod, null , docs, new Object[] { objDocName, true , true });

    //打印输出到指定文件

    //你可以使用 doc.PrintOut();方法,次方法调用中的参数设置较繁琐,建议使用 Type.InvokeMember 来调用时可以不用将PrintOut的参数设置全,只设置4个主要参数

    Type docType = doc.GetType();

    object printFileName = @"c:\aaa.ps" ;

    docType.InvokeMember( "PrintOut" , System.Reflection.BindingFlags.InvokeMethod, null , doc, new object [] { false , false , oWord.WdPrintOutRange.wdPrintAllDocument, printFileName });

    //new object[]{false,false,oWord.WdPrintOutRange.wdPrintAllDocument,printFileName}

    //对应脚本中的word.PrintOut(false, false, 0, psfile);的参数

    //退出WORD

    //对应脚本中的word.Quit();

    wordType.InvokeMember( "Quit" , System.Reflection.BindingFlags.InvokeMethod, null , word, null );

    object o1 = "c:\\aaa.ps" ;

    object o2 = "c:\\aaa.pdf" ;

    object o3 = "" ;

    //引用将PS转换成PDF的对象

    //try catch之间对应的是脚本中的 PDF.FileToPDF(psfile,pdffile,"");  //你可以使用 pdfConvert.FileToPDF("c:\\test.ps","c:\\test.pdf","");这样的转换方法,本人只是为了保持与WORD相同的调用方式

    try

    {

     ACRODISTXLib.PdfDistillerClass pdf = new ACRODISTXLib.PdfDistillerClass();

     Type pdfType = pdf.GetType();

     pdfType.InvokeMember( "FileToPDF" , System.Reflection.BindingFlags.InvokeMethod, null , pdf, new object [] { o1, o2, o3 });

     pdf = null ;

    }

    catch { } //读者自己补写错误处理

    //为防止本方法调用多次时发生错误,必须停止acrodist.exe进程

    foreach (System.Diagnostics .Process proc in System.Diagnostics.Process.GetProcesses())

    {

     int begpos;

     int endpos;

     string sProcName = proc.ToString();

     begpos = sProcName.IndexOf( "(" ) + 1;

     endpos = sProcName.IndexOf( ")" );

     sProcName = sProcName.Substring(begpos, endpos - begpos);

     if (sProcName.ToLower().CompareTo( "acrodist" ) == 0)

     {

      try

      {

       proc.Kill(); //停止进程

      }

      catch { } //读者自己补写错误处理

      break ;

     }

    }

   }

   private void button3_Click( object sender, EventArgs e)

   {

    if (openFileDialog1.ShowDialog() == DialogResult.OK)

    {

     string s = openFileDialog1.FileName;

     WordConvert(s);

    }

   }

   //getnextcode

   private void button4_Click( object sender, EventArgs e)

   {

    WorkCell myWorkCell = new WorkCell(textBox2.Text,textBox1.Text);

    textBox3.Text = myWorkCell.GetNextCode();

   }

  }

  public class WorkCell

  {

   private string workCellCode;

   private string parentCellCode;

   private string commonCode;

   private char [] code;

   private char [] pCode;

   private char [] standCode;

   private string s;

   public WorkCell( string mycode, string parentcode)

   {

    workCellCode = mycode;

    parentCellCode = parentcode;

    standCode = new char [] { '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'W' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z' };

    commonCode = Regex.Replace(parentCellCode, @"0+" , "" );

    code = workCellCode.Substring(commonCode.Length).ToCharArray();

   }

   public string WorkCellCode

   {

    set

    {

     workCellCode = value;

    }

    get

    {

     return workCellCode;

    }

   }

   public string ParentCellCode

   {

    set

    {

     workCellCode = value;

    }

    get

    {

     return workCellCode;

    }

   }

   public string GetNextCode()

   {

    string s= "" ;

    if (code.Length > 0)

    {

     int i = 0;

     for (i = code.Length - 1; i >= 0; i--)

     {

      if (code[i] != '0' )

      {

       GetNextChar(i);

       break ;

      }

     }

     for (i=0;i<code.Length;i++)

     {

      s+=code[i].ToString();

     }

     return commonCode + s;

    }

    else

    {

     return "null" ;

    }

   }

   //设置code中的下一个代码,从右边起,找到第一个非0字符,将其按标准代码自加1,溢出则进位

   private char GetNextChar( int j)

   {

    int i = -1;

    int flag = 0;

    for (i = 0; i < standCode.Length; i++)

    {

     if (code[j] == standCode[i])

     {

      flag = 1;

      break ;

     }

    }

    //MessageBox.Show(code[j].ToString()+" "+standCode[i].ToString()+" "+i.ToString());

    if (i >= standCode.Length-1 || flag==0)

    {

     code[j] = standCode[0];

     if (j > 0)

      code[j - 1] = GetNextChar(j - 1);

    }

    else

    {

     code[j] = standCode[i + 1];

    }

    return code[j];

   }

  }

}

希望本文所述对大家的C#程序设计有所帮助。

dy("nrwz");

查看更多关于C#实现HTML转WORD及WORD转PDF的方法的详细内容...

  阅读:81次