精华内容
下载资源
问答
  • C#编程实现动态生成word文档

    千次阅读 2017-06-15 21:34:45
    C#编程实现动态生成word文档。代码较多。仅供参考。 http://blog.sina.com.cn/s/blog_149e9d2ec0102vume.html

    C#编程实现动态生成word文档。代码较多。仅供参考。

    http://blog.sina.com.cn/s/blog_149e9d2ec0102vume.html


    如何用C#编程实现动态生成Word文档并填充数据的效果呢?要使用C#操作word,首先要添加引用:

       1、添加引用->COM->Microsoft Word 11.0 ObjectLibrary

       2、在.cs文件中添加

       using  Word;

       下面的例子中包括C#对Word文档的创建、插入表格、设置样式等操作:

       (例子中代码有些涉及数据信息部分被省略,重要是介绍一些C#操作word文档的方法)

       public   string CreateWordFile( string  CheckedInfo)

        ...{

       string  message =   "" ;

       try

        ...{

       Object Nothing  = System.Reflection.Missing.Value;

       Directory.CreateDirectory( " C:/CNSI ");   // 创建文件所在目录

       string  name =   " CNSI_"   + DateTime.Now.ToShortString() + " .doc " ;

       object  filename =   " C://CNSI//"   + name;   // 文件保存路径

       // 创建Word文档

       Word.Application WordApp =   new Word.ApplicationClass();

       Word.Document WordDoc  = WordApp.Documents.Add( ref Nothing,  ref Nothing,  ref Nothing,  ref Nothing);

       // 添加页眉

       WordApp.ActiveWindow.View.Type =  WdViewType.wdOutlineView;

       WordApp.ActiveWindow.View.SeekView =  WdSeekView.wdSeekPrimaryHeader;

       WordApp.ActiveWindow.ActivePane.Selection.InsertAfter( "[页眉内容] " );

       WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight; //设置右对齐

       WordApp.ActiveWindow.View.SeekView =  WdSeekView.wdSeekMainDocument; //跳出页眉设置

       WordApp.Selection.ParagraphFormat.LineSpacing =  15f; // 设置文档的行间距

       // 移动焦点并换行

       object  count =   14 ;

       object  WdLine =  Word.WdUnits.wdLine; //换一行;

       WordApp.Selection.MoveDown( ref WdLine,  ref count,  ref  Nothing); //移动焦点

       WordApp.Selection.TypeParagraph(); // 插入段落

       // 文档中创建表格

       Word.Table newTable  = WordDoc.Tables.Add(WordApp.Selection.Range,  12,  3 ,  ref Nothing,  ref Nothing);

       // 设置表格样式

       newTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleThickThinLargeGap;

       newTable.Borders.InsideLineStyle =  Word.WdLineStyle.wdLineStyleSingle;

       newTable.Columns[ 1 ].Width  = 100f;

       newTable.Columns[ 2 ].Width  = 220f;

       newTable.Columns[ 3 ].Width  = 105f;

       // 填充表格内容

       newTable.Cell( 1 ,  1).Range.Text =   " 产品详细信息表 ";

       newTable.Cell( 1 ,  1).Range.Bold =   2 ; // 设置单元格中字体为粗体

       // 合并单元格

       newTable.Cell( 1 ,  1 ).Merge(newTable.Cell( 1,  3 ));

       WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; //垂直居中

       WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; //水平居中

    // 填充表格内容

       newTable.Cell( 2 ,  1).Range.Text =   " 产品基本信息 ";

       newTable.Cell( 2 ,  1).Range.Font.Color  = Word.WdColor.wdColorDarkBlue; // 设置单元格内字体颜色

       // 合并单元格

       newTable.Cell( 2 ,  1 ).Merge(newTable.Cell( 2,  3 ));

       WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;

       // 填充表格内容

       newTable.Cell( 3 ,  1).Range.Text =   " 品牌名称: ";

       newTable.Cell( 3 ,  2).Range.Text  = BrandName;

       // 纵向合并单元格

       newTable.Cell( 3 ,  3 ).Select(); //选中一行

       object  moveUnit =  Word.WdUnits.wdLine;

       object  moveCount =   5 ;

       object  moveExtend =  Word.WdMovementType.wdExtend;

       WordApp.Selection.MoveDown( ref moveUnit,  ref moveCount,  ref moveExtend);

       WordApp.Selection.Cells.Merge();

       // 插入图片

       string  FileName =  Picture; // 图片所在路径

       object  LinkToFile =   false ;

       object  SaveWithDocument =   true ;

       object  Anchor =  WordDoc.Application.Selection.Range;

       WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref  LinkToFile, ref  SaveWithDocument, ref  Anchor);

       WordDoc.Application.ActiveDocument.InlineShapes[ 1].Width  =  100f; //图片宽度

       WordDoc.Application.ActiveDocument.InlineShapes[ 1].Height  =  100f; //图片高度

       // 将图片设置为四周环绕型

       Word.Shape s  = WordDoc.Application.ActiveDocument.InlineShapes[ 1].ConvertToShape();

       s.WrapFormat.Type  = Word.WdWrapType.wdWrapSquare;

       newTable.Cell( 12 ,  1).Range.Text =   " 产品特殊属性 ";

       newTable.Cell( 12 ,  1 ).Merge(newTable.Cell( 12,  3 ));

       // 在表格中增加行

       WordDoc.Content.Tables[ 1 ].Rows.Add( ref Nothing);

       WordDoc.Paragraphs.Last.Range.Text =   " 文档创建时间:"   + DateTime.Now.ToString(); // “落款”

       WordDoc.Paragraphs.Last.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;

       // 文件保存

       WordDoc.SaveAs( ref  filename, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing);

       WordDoc.Close( ref  Nothing, ref  Nothing, ref  Nothing);

       WordApp.Quit( ref  Nothing, ref  Nothing, ref  Nothing);

       message = name + " 文档生成成功,以保存到C:CNSI下 ";

       }

       catch

        ...{

       message  =  " 文件导出异常! " ;

       }

       return  message;

       }

     

     

    usingSystem;

    usingSystem.Collections.Generic;

    usingSystem.ComponentModel;

    usingSystem.Data;

    usingSystem.Drawing;

    usingSystem.Linq;

    usingSystem.Text;

    usingSystem.Windows.Forms;

    usingWord;

    usingSystem.IO;

     

    namespaceWindowsForms_Word

    {

       public partial classForm1 : Form

       {

           public Form1()

           {

               InitializeComponent();

           }

     

           private void Form1_Load(object sender, EventArgs e)

           {

     

           }

     

           public string CreateWordFile(string ChenkedInfo)

           {

               string message = "";

               try

               {

                   object Nothing =System.Reflection.Missing.Value;

                   //创建文件目录

                   Directory.CreateDirectory("d:/Test");

                   string name = "Test_" + DateTime.Now.ToShortDateString() +".doc";

                   //文件保存路径

                   object filename = "d://Test//" + name;

                   //创建word文档

                   Word.ApplicationWordApp = new Word.ApplicationClass();

                   Word.Document WordDoc =WordApp.Documents.Add(ref Nothing,ref Nothing, ref Nothing, ref Nothing);

                   //添加页眉

                   WordApp.ActiveWindow.View.Type = WdViewType.wdOutlineView;

                   WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekCurrentPageHeader;

                   WordApp.ActiveWindow.ActivePane.Selection.InsertAfter("[页眉内容]");

     

                   //设置右对齐

                   WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;

     

                   //跳出页眉设置

                   WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;

     

                   //设置文档的行间距

                   WordApp.Selection.ParagraphFormat.LineSpacing = 15f;

     

                   //移动焦点并换行

                   object count = 14;

                   object WdLine = Word.WdUnits.wdLine;//换一行

                   WordApp.Selection.MoveDown(refWdLine, ref count, ref Nothing);//移动焦点

                   WordApp.Selection.TypeParagraph();//插入段落

     

                   //文档中创建表格

                   Word.Table newTable =WordDoc.Tables.Add(WordApp.Selection.Range, 12, 3, ref Nothing, ref Nothing);

     

                   //设置表格样式

                   newTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleThickThinMedGap;

                   newTable.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;

                   newTable.Columns[1].Width = 100f;

                   newTable.Columns[2].Width = 220f;

                   newTable.Columns[3].Width = 105f;

     

                   //填充表格内容

                   newTable.Cell(1, 1).Range.Text = "产品详细信息表";

                   newTable.Cell(1, 1).Range.Bold = 2;//设置单元格中字体为粗体

     

                   //合并单元格

                   newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));

                   WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;//垂直居中

                   WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中

     

                   //填充表格内容

                   newTable.Cell(2, 1).Range.Text = "产品基本信息";

                   newTable.Cell(2, 1).Range.Font.Color = Word.WdColor.wdColorDarkBlue;//设置单元格内字体颜色

     

                   //合并单元格

                   newTable.Cell(2, 1).Merge(newTable.Cell(2, 3));

                   WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;

     

                   //填充表格内容

                   newTable.Cell(3, 1).Range.Text = "品牌名称:";

                   newTable.Cell(3, 2).Range.Text = "BrandName";//?

     

                   //纵向合并单元格

                   newTable.Cell(3, 3).Select();//选中一行

                   object moveUnit =Word.WdUnits.wdLine;

                   object moveCount = 5;

                   object moveExtend =Word.WdMovementType.wdExtend;

                   WordApp.Selection.MoveDown(refmoveUnit, ref moveCount,ref moveExtend);

                   WordApp.Selection.Cells.Merge();

     

                   //插入图片

                   string FileName = "d:/";//图片所在路径

                   object LinkToFile = false;

                   objectSaveWithDocument = true;

                   object Anchor =WordDoc.Application.Selection.Range;

                   WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName,ref LinkToFile, ref SaveWithDocument, ref Anchor);

                   WordDoc.Application.ActiveDocument.InlineShapes[1].Width= 100f;//图片高度

     

                   //将图片设置为四周环绕型

                   Word.Shape s =WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();

                   s.WrapFormat.Type = Word.WdWrapType.wdWrapSquare;

                   newTable.Cell(12, 1).Range.Text = "产品特殊属性";

                   newTable.Cell(12, 1).Merge(newTable.Cell(12, 3));

     

                   //在表格中增加行

                   WordDoc.Content.Tables[1].Rows.Add(ref Nothing);

                   WordDoc.Paragraphs.Last.Range.Text = "文档创建时间:"+DateTime.Now.ToString();//落款

                   WordDoc.Paragraphs.Last.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;

     

                   //文件保存

                   WordDoc.SaveAs(ref  filename, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing, ref  Nothing);

                   WordDoc.Close(ref Nothing,ref Nothing, ref Nothing);

                   WordApp.Quit(ref Nothing,ref Nothing, ref Nothing);

                   message = name + "文档生成成功,已保存到c:Test下";

     

               }

               catch

               {

                   message = "文件导出异常!";

               }

               return message;

           }

     

           private void button1_Click(object sender, EventArgs e)

           {

               CreateWordFile("aa");

           }

       }

    }

     

     

     

    整个程序算是将要完成了。可是就是在你高兴的时候,突然出现了问题,程序无法正确的保存成word格式的数据。所以我在此给大家一个解决方案。

    出现问题:

    错误 13无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”。请改用适用的接口。
    无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”。请改用适用的接口。

    类型“Microsoft.Office.Interop.Word.ApplicationClass”未定义构造函数

     

     

    解决办法:

    在Visual Studio中点击菜单项“视图->解决方案资源管理器”,在其中点开“引用”文件夹,在"Microsoft.Office.Interop.Word"上点击鼠标右键,选择“属性”,将属性中的“嵌入互操作类型”的值改为“false”即可。


    展开全文
  • VB.NET2010 编程实现Word双面打印

    千次阅读 2014-05-18 15:20:22
     家里有一台激光打印机,便宜货,无法实现自动双面打印,由于要打印资料,本着节约纸张,绿色生活的理念(其实纸张很贵 - -||,不双面打不行哇),手动送纸,翻页,实现双面打印,非常麻烦 解决方案:   1、先...

    先上成品图一张。



    起因:

           家里有一台激光打印机,便宜货,无法实现自动双面打印,由于要打印资料,本着节约纸张,绿色生活的理念(其实纸张很贵 - -||,不双面打不行哇),手动送纸,翻页,实现双面打印,非常麻烦

    解决方案:

         1、先顺序打印奇数页;

         2、后逆序打印偶数页;

        按照以上方法,打印完到手上的纸张为正确的顺序。

    难点:

         VB.NET操作word打印。

    核心Code:

        Private Sub btnBroswer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBroswer.Click
            Dim dlg As New OpenFileDialog
            dlg.Title = "请选择一个待打印的Word文档"
            dlg.Filter = "所有文件|*.*|Word2003|*.doc|Word2007|*.docx"
            dlg.InitialDirectory = Environment.SpecialFolder.DesktopDirectory
            dlg.ShowDialog()
            If dlg.FileName <> "" Then
                txtPath.Text = dlg.FileName
                strPrintFirst = ""
                strPrintSecond = ""
                strPrintThird = ""
                btnPrint1.Enabled = False
                btnPrint2.Enabled = False
                btnPrint3.Enabled = False
    
                '隐藏word程序
                oWordApplic.Visible = False
    
                oDocument.Close(Word.WdSaveOptions.wdDoNotSaveChanges)
    
                '打印待打印的word文档
                oDocument = oWordApplic.Documents.Open(txtPath.Text, Missing, True, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, True, Missing, Missing, Missing, Missing)
    
                '获取页面总页数
                iTotalPages = oDocument.ComputeStatistics(WdStatistic.wdStatisticPages)
    
    
                If iTotalPages Mod 2 Then
                    '页面为奇数
                    For i = 1 To iTotalPages - 1 Step 2
                        strPrintFirst &= i & ","
                    Next
    
                    For i = iTotalPages - 1 To 2 Step -2
                        strPrintSecond &= i & ","
                    Next
    
                    strPrintThird = iTotalPages.ToString()
                Else
                    '页面为偶数
                    For i = 1 To iTotalPages Step 2
                        strPrintFirst &= i & ","
                    Next
    
                    For i = iTotalPages To 2 Step -2
                        strPrintSecond &= i & ","
                    Next
    
                End If
    
                strPrintFirst = strPrintFirst.Substring(0, strPrintFirst.Length - 1)
                strPrintSecond = strPrintSecond.Substring(0, strPrintSecond.Length - 1)
    
                If iTotalPages = 1 Then
                    GroupBox1.Text = "打印信息:" & iTotalPages & "页/1次打印"
                    btnPrint1.Enabled = True
                    btnPrint2.Enabled = False
                    btnPrint3.Enabled = False
                    Exit Sub
                End If
    
    
                If strPrintThird <> "" Then
                    GroupBox1.Text = "打印信息:" & iTotalPages & "页/3次打印"
                    btnPrint1.Enabled = True
                    btnPrint2.Enabled = True
                    btnPrint3.Enabled = True
                Else
                    GroupBox1.Text = "打印信息:" & iTotalPages & "页/2次打印"
                    btnPrint1.Enabled = True
                    btnPrint2.Enabled = True
                    btnPrint3.Enabled = False
                End If
    
            End If
        End Sub
        Private Sub btnPrint1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint1.Click
            If MsgBoxResult.Yes = MsgBox("请确认打印机已经打开,纸张足够?", MsgBoxStyle.YesNo + MsgBoxStyle.Information, "无痕软件") Then
                btnPrint1.Enabled = False
                oDocument.PrintOut(Range:=4, Pages:=strPrintFirst)
            End If
        End Sub

    源码+编译程序下载地址

    百度网盘编译程序下载(无源码)

    注意:需要安装office2007方可正常运行。


    展开全文
  • SAP ABAP里提供了一个标准的类CL_DOCX_DOCUMENT,提供了本地以”.docx”结尾的微软Office word文档的读和写操作。 本文介绍了ABAP类CL_DOCX_DOCUMENT的简单用法。 Office OpenXML 从微软 Office2007开始, 当...

    SAP ABAP里提供了一个标准的类CL_DOCX_DOCUMENT,提供了本地以”.docx”结尾的微软Office word文档的读和写操作。

    本文介绍了ABAP类CL_DOCX_DOCUMENT的简单用法。

    Office OpenXML

    从微软 Office2007开始, 当我们新建一个word文档时,其扩展名从“.doc”变为了”.docx”,后者是基上遵循了一个开源的规范:Office openXML格式。

    例如下图,我创建了一个最简单的word文档,包含了一个Header 区域,一个由三行彩色文字组成的段落,还有一张图片。

    我们把这个文档保存到本地,将其扩展名从.docx改成.zip, 然后双击,就可以用解压软件比如winrar打开。

    于是发现这一个最简单的word文档实际上由如此多的xml和文件夹构成。

    使用CL_DOCX_DOCUMENT读取word文件内容

    示例代码如下:

    DATA: lv_content TYPE xstring,
    
    lo_document TYPE REF TO cl_docx_document.
    
    PERFORM get_doc_binary USING 'C:Usersi042416Desktop est.docx' CHANGING lv_content.
    
    lo_document = cl_docx_document=>load_document( lv_content ).
    
    CHECK lo_document IS NOT INITIAL.
    
    DATA(lo_core_part) = lo_document->get_corepropertiespart( ).
    
    DATA(lv_core_data) = lo_core_part->get_data( ).
    
    DATA(lo_main_part) = lo_document->get_maindocumentpart( ).
    
    DATA(lo_image_parts) = lo_main_part->get_imageparts( ).
    
    DATA(lv_image_count) = lo_image_parts->get_count( ).
    
    DO lv_image_count TIMES.
    
    DATA(lo_image_part) = lo_image_parts->get_part( sy-index - 1 ).
    
    DATA(lv_image_data) = lo_image_part->get_data( ).
    
    ENDDO.
    
    DATA(lo_header_parts) = lo_main_part->get_headerparts( ).
    
    DATA(lv_header_count) = lo_header_parts->get_count( ).
    
    DO lv_header_count TIMES.
    
    DATA(lo_header_part) = lo_header_parts->get_part( sy-index - 1 ).
    
    DATA(lv_header_data) = lo_header_part->get_data( ).
    
    ENDDO.

    上述代码的简要说明

    1. 将word文档的二进制内容传入方法cl_docx_document=>load_document,得到一个文档对象引用,然后就可以借助该对象引用调用各种方法了。

    2. word文档的创建者,创建时间,最后修改时间等信息都存储在所谓的“Core property part”内,可以通过方法lo_document->get_corepropertiespart获得”Core property part”的引用,再使用该引用调用方法get_data获得实际内容。

    下图是get_data返回的内容的一个例子,可以看出是xml格式。

    3. 现在我们准备读取word文档的正文了。使用方法lo_document->get_maindocumentpart得到word文档正文,文字的字体类型,颜色也包含在内。如下图所示:

    4. Word文档里插入的图片的二进制内容当然也是可以读取出来的。使用方法:lo_image_parts->get_part返回。

    同样的思路,微软Office 2007之后版本的其他格式的办公文档,比如Powerpoint和Excel等,均遵循Office OpenXML标准,因此将其后缀名改为.zip后同样可以看到大量xml和文件夹。ABAP也同样提供了标准代码来读写这些Office文档,例如CL_PPTX_DOCUMENT, CL_XLSX_DOCUMENT等等,如下图所示。

    要获取更多Jerry的原创技术文章,请关注公众号”汪子熙”或者扫描下面二维码:

    展开全文
  • NPOI Word 编程学习总结

    万次阅读 2017-04-06 11:23:06
    NPOI创建Word ... NPOI已出现一段时间了,目前版本2.0 Beta 2 [v2.0.5],网上关于NPOI操作xlsx文章较多,而...有,尽管NPOI对于Word还不稳定,经过一阵捣鼓后终于实现了表的简单操作:创建表、创建行、创建单元,单元行和

    NPOI创建Word

    http://www.cnblogs.com/sunbobohu/p/4914999.html
            NPOI已出现一段时间了,目前版本2.0 Beta 2 [v2.0.5],网上关于NPOI操作xlsx文章较多,而关于docx的几乎没

    有,尽管NPOI对于Word还不稳定,经过一阵捣鼓后终于实现了表的简单操作:创建表、创建行、创建单元,单元行和

    列的合并。
     
            环境:vs2010,netframework4
     
            具体代码:
     
            private void button1_Click(object sender, EventArgs e)
             {
                 MemoryStream ms = new MemoryStream();
                 XWPFDocument m_Docx = new XWPFDocument();
                 m_Docx = CreatDocxTable(); 
                m_Docx.Write(ms);
                 ms.Flush();
                 SaveToFile(ms,"d:\\test.docx");
             }
             protected XWPFDocument CreatDocxTable()
             {
                 XWPFDocument m_Docx = new XWPFDocument();
                 XWPFParagraph p0 = m_Docx.CreateParagraph();
                 XWPFRun r0 = p0.CreateRun();
                 r0.SetText("DOCX表");
     
                XWPFTable table = m_Docx.CreateTable(1, 3);//创建一行3列表
                 table.GetRow(0).GetCell(0).SetText("111");
                 table.GetRow(0).GetCell(1).SetText("222");
                 table.GetRow(0).GetCell(2).SetText("333");
     
                XWPFTableRow m_Row = table.CreateRow();//创建一行
                 m_Row = table.CreateRow();//创建一行
                 m_Row.GetCell(0).SetText("211");
     
                //合并单元格
                 m_Row = table.InsertNewTableRow(0);//表头插入一行
                 XWPFTableCell cell = m_Row.CreateCell();//创建一个单元格,创建单元格时就创建了一个CT_P
                 CT_Tc cttc = cell.GetCTTc();
                 CT_TcPr ctPr = cttc.AddNewTcPr();
                 ctPr.gridSpan.val = "3";//合并3列
                 cttc.GetPList()[0].AddNewPPr().AddNewJc().val= ST_Jc.center;
                 cttc.GetPList()[0].AddNewR().AddNewT().Value = "abc";     
      
                 XWPFTableRow td3 = table.InsertNewTableRow(table.Rows.Count - 1);//插入行
                 cell = td3.CreateCell();
                 cttc = cell.GetCTTc();
                 ctPr = cttc.AddNewTcPr();
                 ctPr.gridSpan.val = "3";
                 cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                 cttc.GetPList()[0].AddNewR().AddNewT().Value = "qqq";
     
                //表增加行,合并列
                 CT_Row m_NewRow = new CT_Row();
                 m_Row = new XWPFTableRow(m_NewRow, table);
                 table.AddRow(m_Row); //必须要!!!
                 cell = m_Row.CreateCell();
                 cttc = cell.GetCTTc();
                 ctPr = cttc.AddNewTcPr();
                 ctPr.gridSpan.val = "3";
                 cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                 cttc.GetPList()[0].AddNewR().AddNewT().Value = "sss";
      
                 //表未增加行,合并2列,合并2行
                 //1行
                 m_NewRow = new CT_Row();
                 m_Row = new XWPFTableRow(m_NewRow, table);
                 table.AddRow(m_Row);
                 cell = m_Row.CreateCell();
                 cttc = cell.GetCTTc();
                 ctPr = cttc.AddNewTcPr();
                 ctPr.gridSpan.val = "2";
                 ctPr.AddNewVMerge().val = ST_Merge.restart;//合并行
                 ctPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直居中
                 cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                 cttc.GetPList()[0].AddNewR().AddNewT().Value = "xxx";
                 cell = m_Row.CreateCell();
                 cell.SetText("ddd");
                 //2行,多行合并类似
                 m_NewRow = new CT_Row();
                 m_Row = new XWPFTableRow(m_NewRow, table);
                 table.AddRow(m_Row);
                 cell = m_Row.CreateCell();
                 cttc = cell.GetCTTc();
                 ctPr = cttc.AddNewTcPr();
                 ctPr.gridSpan.val = "2";
                 ctPr.AddNewVMerge().val = ST_Merge.@continue;//合并行
                 cell = m_Row.CreateCell();
                 cell.SetText("kkk");
                 3行
                 //m_NewRow = new CT_Row();
                 //m_Row = new XWPFTableRow(m_NewRow, table);
                 //table.AddRow(m_Row);
                 //cell = m_Row.CreateCell();
                 //cttc = cell.GetCTTc();
                 //ctPr = cttc.AddNewTcPr();
                 //ctPr.gridSpan.val = "2";
                 //ctPr.AddNewVMerge().val = ST_Merge.@continue;
                 //cell = m_Row.CreateCell();
                 //cell.SetText("hhh");
     
                return m_Docx;
             }
             static void SaveToFile(MemoryStream ms, string fileName)
             {
                 using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                 {
                     byte[] data = ms.ToArray();
     
                    fs.Write(data, 0, data.Length);
                     fs.Flush();
                     data = null;
                 }
             }


     上面代码所创建的表见图
    ========

    NPOI 2.0导出word(docx格式)

    http://www.tuicool.com/articles/JFZzUj

    主题 NPOI
    大名鼎鼎的NPOI用来导出EXCEL的文章园子里面有很多,可是用来导出WORD文档的文章大都含糊不清,最近刚好完
    成一个导出WORD文档的需求,在此分享下。

    NPOI里面认为word文档的最基本的结构是段落,代表这个段落的类就是 XWPFParagraph ,使用这个类可以设置段落
    里面的字体、大小、以及是否加粗等。

    代表整个文档的的类 XWPFDocument ,是最外层的容器相当于一个word文档的实例,代表表格的类 XWPFTable ,
    是较小级别的段落容器相当于一个表格的实例。

    一个 XWPFDocument 可以添加多个 XWPFTable 和多个 XWPFParagraph ,一个 XWPFTable 可以添加多个 
    XWPFParagraph

    现在我们要创建一个有几个段落和表格的word文档,其中,表格里面要显示带格式的文字(微软雅黑,小四),形如

    首先,需要创建一个 XWPFDocument doc = new XWPFDocument (),随后用文档实例doc创建段落1~段落n
                XWPFParagraph p0 = doc.CreateParagraph();
                 p0.SetAlignment(ParagraphAlignment.LEFT);
                 XWPFRun r0 = p0.CreateRun();
                 r0.SetFontFamily("宋体");
                 r0.SetFontSize(18);
                 r0.SetBold(true);
                 r0.SetText("未登录过学生的账号密码");
     
                 XWPFParagraph p1 = doc.CreateParagraph();
                 p1.SetAlignment(ParagraphAlignment.LEFT);
                 XWPFRun r1 = p1.CreateRun();
                 r1.SetFontFamily("宋体");
                 r1.SetFontSize(10);
                 r1.SetBold(true);
                 r1.SetText("(备注:已登录过的学生密码不显示)");
     
                 XWPFParagraph p2 = doc.CreateParagraph();
                 p2.SetAlignment(ParagraphAlignment.LEFT);
                 XWPFRun r2 = p2.CreateRun();
                 r2.SetFontFamily("宋体");
                 r2.SetFontSize(10);
                 r2.SetBold(true);
                 r2.SetText("学校:XX一中");
     
                 XWPFParagraph p3 = doc.CreateParagraph();
                 p3.SetAlignment(ParagraphAlignment.LEFT);
                 XWPFRun r3 = p3.CreateRun();
                 r3.SetFontFamily("宋体");
                 r3.SetFontSize(10);
                 r3.SetBold(true);
                 r3.SetText("班级:(7)");
     
                 XWPFParagraph p4 = doc.CreateParagraph();
                 p4.SetAlignment(ParagraphAlignment.LEFT);
                 XWPFRun r4 = p4.CreateRun();
                 r4.SetFontFamily("宋体");
                 r4.SetFontSize(10);
                 r4.SetBold(true);
                 r4.SetText("班主任:ddd");
     
     
                 XWPFParagraph p5 = doc.CreateParagraph();
                 p5.SetAlignment(ParagraphAlignment.LEFT);
                 XWPFRun r5 = p5.CreateRun();
                 r5.SetFontFamily("宋体");
                 r5.SetFontSize(10);
                 r5.SetBold(true);
                 r5.SetText("可以在此处添加备注:");

    然后用doc创建个4行4列 XWPFTable table = doc.CreateTable(4, 4)


    接着很多人根据vs的点出来的方法或者是NPOI原作者tonyqus的教程 http://tonyqus.sinaapp.com/archives/614 ,使
    用table的单元格的SetParagraph()方法直接设置构造好的段落就行了, 但是,事实证明这样做是不对的,这样的话会
    使得构造出来的段落不光会显示在table里面,而且还会显示在其他地方。正确的方法应该是使用table单元格的
    AddParagraph()方法直接生成一个专属于表格的段落。
                         XWPFParagraph pIO = table.GetRow(i).GetCell(0).AddParagraph();
                         XWPFRun rIO = pIO.CreateRun();
                         rIO.SetFontFamily("微软雅黑");
                         rIO.SetFontSize(12);
                         rIO.SetBold(true);
                         rIO.SetText(i.ToString());
                         
     
                         XWPFParagraph pINo =table.GetRow(i).GetCell(1).AddParagraph();
                         XWPFRun rINo = pINo.CreateRun();
                         rINo.SetFontFamily("微软雅黑");
                         rINo.SetFontSize(12);
                         rINo.SetBold(true);
                         rINo.SetText(notLoginStudents[i - 1].UserName);15 
     
                         XWPFParagraph pIMm = table.GetRow(i).GetCell(2).AddParagraph();
                         XWPFRun rIMm = pIMm.CreateRun();
                         rIMm.SetFontFamily("微软雅黑");
                         rIMm.SetFontSize(12);
                         rIMm.SetBold(true);
                         rIMm.SetText(notLoginStudents[i - 1].PassWord);23                     
     
                         XWPFParagraph pIName = table.GetRow(i).GetCell(3).AddParagraph();
                         XWPFRun rIName = pIName.CreateRun();
                         rIName.SetFontFamily("微软雅黑");
                         rIName.SetFontSize(12);
                         rIName.SetBold(true);
                         rIName.SetText(notLoginStudents[i - 1].StudentName);


    随后,把文档写入流doc.Write(new MemoryStream()),接着你想干神马就都OK了。
    ========

    NPOI创建DOCX常用操作

    http://blog.csdn.net/gltide/article/details/39929259

    NPOI创建DOCX常用操作

    1、  创建文档
    XWPFDocument m_Docx = new XWPFDocument();

    2、  页面设置
               //1‘=1440twip=25.4mm=72pt(磅point)=96px(像素pixel)
              //1px(像素pixel)=0.75pt(磅point)
    // A4:W=11906 twip=8.269''=210mm,h=16838twip=11.693''=297mm
              //A5:W=8390 twip=5.827''=148mm,h=11906 twip=8.269''=210mm
              //A6:W=5953 twip=4.134''=105mm,h=8390twip=5.827''=1148mm
               //16k195mmX270mm:
               //16k184mmX260mm:
               //16k197mmX273mm:
               CT_SectPr m_SectPr = newCT_SectPr();


               //页面设置A4横向

              m_SectPr.pgSz.w = (ulong)16838;
              m_SectPr.pgSz.h = (ulong)11906;
              m_Docx.Document.body.sectPr = m_SectPr; 

    3、  创建段落

    1) XWPFParagraph gp = m_Docx.CreateParagraph();
    2)      CT_Pm_p = m_Docx.Document.body.AddNewP();
               m_p.AddNewPPr().AddNewJc().val = ST_Jc.center;//段落水平居中
                XWPFParagraph gp = newXWPFParagraph(m_p, m_Docx); //创建XWPFParagraph

    4、  段首行缩进
    gp.IndentationFirstLine=(int)100;
    可以用一个函数计算
        protected int Indentation(Stringfontname, int fontsize, int Indentationfonts, FontStylefs)
        {
                //字显示宽度,用于段首行缩进

             //字号与fontsize关系
            //初号(0号)=84,小初=72,1号=52,2号=44,小2=36,3号=32,小3=30,4号=28,
    //小4=24,5号=21,小5=18,6号=15,小6=13,7号=11,8号=10

           Graphicsm_tmpGr = this.CreateGraphics();
            m_tmpGr.PageUnit = GraphicsUnit.Point;
             SizeF size = m_tmpGr.MeasureString("好", new Font(fontname,fontsize * 0.75F, fs));
             return (int)size.Width* Indentationfonts * 10;
       }
    gp.IndentationFirstLine= Indentation("宋体", 21, 2, FontStyle.Regular);//段首行缩进2字符

    5、  行距设置
    //单倍为默认值(240twip)不需设置,1.5倍=240X1.5=360twip,2倍=240X2=480twip
    m_p.AddNewPPr().AddNewSpacing().line = "400";//行距固定20磅
         m_p.AddNewPPr().AddNewSpacing().lineRule= ST_LineSpacingRule.exact;

    6、  创建RUN
            1)  XWPFRun gr= gp.CreateRun();
               gr.GetCTR().AddNewRPr().AddNewRFonts().ascii = "黑体";
               gr.GetCTR().AddNewRPr().AddNewRFonts().eastAsia = "黑体";
               gr.GetCTR().AddNewRPr().AddNewRFonts().hint = ST_Hint.eastAsia;
               gr.GetCTR().AddNewRPr().AddNewSz().val = (ulong)44;//2号字体
               gr.GetCTR().AddNewRPr().AddNewSzCs().val = (ulong)44;
               gr.GetCTR().AddNewRPr().AddNewB().val = true;//加粗
               gr.GetCTR().AddNewRPr().AddNewColor().val= "red";//字体颜色
               gr.SetText("DOCX表");

            2) CT_R= m_p.AddNewR();

    7、  创建表

    1)  创建表

    有两种方法:

    a.方法1

    XWPFTabletable = m_Docx.CreateTable(1, 1);//创建1行1列表
    CT_Tblm_CTTbl = m_Docx.Document.body.GetTblArray()[0];//获得文档第一张表

    b.方法2

     CT_Tblm_CTTbl = m_Docx.Document.body.AddNewTbl();
     XWPFTabletable = new XWPFTable(m_CTTbl,m_Docx);//创建1行1列表

    2)  表水平居中

    m_CTTbl.AddNewTblPr().jc = new CT_Jc();
    m_CTTbl.AddNewTblPr().jc.val = ST_Jc.center;//表在页面水平居中

    3)  表宽度

    m_CTTbl.AddNewTblPr().AddNewTblW().w = "2000";//表宽度
    m_CTTbl.AddNewTblPr().AddNewTblW().type = ST_TblWidth.dxa;

    4)  表定位
    //若tblpXSpec、tblpX同时存在,则tblpXSpec优先tblpX;
    //若tblpYSpec、tblpY同时存在,则tblpYSpec优先tblpY;
    m_CTTblPr.tblpPr = new CT_TblPPr();//表定位
    m_CTTblPr.tblpPr.tblpX = "4003";//表左上角坐标
    m_CTTblPr.tblpPr.tblpY = "365";
    //m_CTTblPr.tblpPr.tblpXSpec = ST_XAlign.center;// tblpXSpec优先tblpX
    //m_CTTblPr.tblpPr.tblpYSpec = ST_YAlign.top;// tblpYSpec优先tblpY
    m_CTTblPr.tblpPr.leftFromText = (ulong)180;
    m_CTTblPr.tblpPr.rightFromText = (ulong)180;
    m_CTTblPr.tblpPr.vertAnchor = ST_VAnchor.text;
    m_CTTblPr.tblpPr.horzAnchor = ST_HAnchor.page;

    5)  列宽设置
    //列宽设置
    CT_TcPr m_Pr =table.GetRow(0).GetCell(0).GetCTTc().AddNewTcPr();
    m_Pr.tcW = new CT_TblWidth();
    m_Pr.tcW.w = "1500";//单元格宽
    m_Pr.tcW.type = ST_TblWidth.dxa;
    m_Pr = table.GetRow(0).GetCell(1).GetCTTc().AddNewTcPr();
    m_Pr.tcW = new CT_TblWidth();
    m_Pr.tcW.w = "1000";//单元格宽
    m_Pr.tcW.type = ST_TblWidth.dxa;

    6)  创建行
    a. XWPFTableRow m_Row = table.CreateRow();//创建一行
    b. XWPFTableRow m_Row = table.InsertNewTableRow(0);//表头插入一行
    c. XWPFTableRow td3 = table.InsertNewTableRow(table.Rows.Count - 1);//插入行
    d. CT_Row m_NewRow = new CT_Row();
    XWPFTableRow  m_Row = new XWPFTableRow(m_NewRow, table);
    table.AddRow(m_Row);

    7)  行高设置
    a. m_Row.GetCTRow().AddNewTrPr().AddNewTrHeight().val= (ulong)426;
    b. m_NewRow.AddNewTrPr().AddNewTrHeight().val= (ulong)426;

    8)  创建单元格
    a.      XWPFTableCell cell = m_Row.CreateCell();//创建一单元格,创建单元格时就创建了一个CT_P
    b.      XWPFTableCell cell = m_Row.AddNewTableCell();//创建单元格时创建了一个CT_P

    9)  单元格设置文字
    table.GetRow(0).GetCell(0).SetText("111");

    10)  列合并
    //表增加行,合并列
    CT_Row m_NewRow = new CT_Row(); 
    XWPFTableRow m_Row = new XWPFTableRow(m_NewRow,table);
    table.AddRow(m_Row);
    XWPFTableCell cell = m_Row.CreateCell();
    CT_Tc cttc = cell.GetCTTc();
    CT_TcPr ctPr = cttc.AddNewTcPr();
    ctPr.gridSpan = new CT_DecimalNumber();
    ctPr.gridSpan.val = "3"; //合并3列
    cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
    cttc.GetPList()[0].AddNewR().AddNewT().Value = "sss";

    11)  行合并
    //1行
    CT_Row m_NewRow = new CT_Row();
    XWPFTableRow m_Row = new XWPFTableRow(m_NewRow,table);
    table.AddRow(m_Row);
    XWPFTableCell cell = m_Row.CreateCell();
    CT_Tc cttc = cell.GetCTTc();
    CT_TcPr ctPr = cttc.AddNewTcPr();
    ctPr.AddNewVMerge().val = ST_Merge.restart;//合并行
    ctPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
    cttc.GetPList()[0].AddNewR().AddNewT().Value = "xxx";


    //2行,多行合并类似

    m_NewRow = new CT_Row();
    m_Row = new XWPFTableRow(m_NewRow,table);
    table.AddRow(m_Row);
    cell = m_Row.CreateCell();
    cttc = cell.GetCTTc();
    ctPr = cttc.AddNewTcPr();
    ctPr.AddNewVMerge().val = ST_Merge.@continue;//合并行

    8、  插图

    1)  内联式插图(inline)
    此种插图方式对插入的图片位置不能灵活控制,只能通过段设置,对应word的嵌入型插图。宽和高数值换算:
    1cm=360000 EMUS(English Metric Unit)。
    FileStream gfs = null;
    gfs = new FileStream("f:\\pic\\1.jpg", FileMode.Open, FileAccess.Read);
    m_p = m_Docx.Document.body.AddNewP();
    m_p.AddNewPPr().AddNewJc().val = ST_Jc.center;//段落水平居中
    gp = new XWPFParagraph(m_p,m_Docx);
    gr = gp.CreateRun();
    gr.AddPicture(gfs, (int)NPOI.XWPF.UserModel.PictureType.JPEG, "1.jpg",1000000, 1000000);
    gfs.Close();

    2)  锚式插图(anchor)
    此种插图方式对插入的图片位置能灵活控制,对应word的四周型、紧密型、穿越型等。图的左上角坐标及宽和高数值换
    算:1cm=360000 EMUS(English Metric Unit)。
    gfs = new FileStream("f:\\pic\\1.jpg", FileMode.Open, FileAccess.Read);
    m_p = m_Docx.Document.body.AddNewP();
    m_p.AddNewPPr().AddNewJc().val = ST_Jc.center;
    gp = new XWPFParagraph(m_p,m_Docx);
    gr = gp.CreateRun();
    CT_Anchor an = newCT_Anchor();

    //图片距正文上(distT)、下(distB)、左(distL)、右(distR)的距离。114300EMUS=3.1mm
    an.distB = (uint)(0);
    an.distL = 114300u;
    an.distR = 114300U;
    an.distT = 0U;
    an.relativeHeight = 251658240u;
    an.behindDoc = false; //"0",图与文字的上下关系
    an.locked = false;  //"0"
    an.layoutInCell = true;  //"1"
    an.allowOverlap = true;  //"1"

    CT_Positive2D simplePos = new CT_Positive2D();
    simplePos.x = (long)0;
    simplePos.y = (long)0;

    CT_EffectExtent effectExtent = new CT_EffectExtent();
    effectExtent.b = 0L;
    effectExtent.l = 0L;
    effectExtent.r = 0L;
    effectExtent.t = 0L;

              //图左上角坐标
              CT_PosH posH = newCT_PosH();
              posH.relativeFrom = ST_RelFromH.column;
              posH.posOffset = 4000000;//单位:EMUS,1CM=360000EMUS

              CT_PosV posV = newCT_PosV();
              posV.relativeFrom = ST_RelFromV.paragraph;
              posV.posOffset = 200000;

    a)      四周型

    CT_WrapSquare wrapSquare = new CT_WrapSquare();
    wrapSquare.wrapText = ST_WrapText.bothSides;
    gr.AddPicture(gfs, (int)NPOI.XWPF.UserModel.PictureType.JPEG, "1.jpg",1000000, 1000000,
    posH, posV, wrapSquare,anchor,simplePos,effectExtent);

    b)      紧密型
    CT_WrapTight wrapTight = new CT_WrapTight();
    wrapTight.wrapText = ST_WrapText.bothSides;
    wrapTight.wrapPolygon = new CT_WrapPath();
    wrapTight.wrapPolygon.edited = false;
    wrapTight.wrapPolygon.start = new CT_Positive2D();
    wrapTight.wrapPolygon.start.x = 0;
    wrapTight.wrapPolygon.start.y = 0;
    CT_Positive2D lineTo = new CT_Positive2D();
    wrapTight.wrapPolygon.lineTo = new List<CT_Positive2D>();
    lineTo = new CT_Positive2D();
    lineTo.x = 0;
    lineTo.y = 21394;
    wrapTight.wrapPolygon.lineTo.Add(lineTo);
    lineTo = new CT_Positive2D();
    lineTo.x = 21806;
    lineTo.y = 21394;

    wrapTight.wrapPolygon.lineTo.Add(lineTo);
    lineTo = new CT_Positive2D();
    lineTo.x = 21806;
    lineTo.y = 0;
    wrapTight.wrapPolygon.lineTo.Add(lineTo);
    lineTo = new CT_Positive2D();
    lineTo.x = 0;
    lineTo.y = 0;

    wrapTight.wrapPolygon.lineTo.Add(lineTo);
    gr.AddPicture(gfs, (int)NPOI.XWPF.UserModel.PictureType.JPEG, "1.jpg",720000, 720000,
    posH, posV, wrapTight, anchor, simplePos, effectExtent);

    c)      穿越型

    CT_WrapThrough wrapThrough = new CT_WrapThrough();
    wrapThrough.wrapText = ST_WrapText.bothSides;
    wrapThrough.wrapPolygon = new CT_WrapPath();
    wrapThrough.wrapPolygon.edited = false;
    wrapThrough.wrapPolygon.start = new CT_Positive2D();
    wrapThrough.wrapPolygon.start.x = 0;
    wrapThrough.wrapPolygon.start.y = 0;


    CT_Positive2D lineTo = new CT_Positive2D();

    wrapThrough.wrapPolygon.lineTo = new List<CT_Positive2D>();
    lineTo = new CT_Positive2D();
    lineTo.x = 0;
    lineTo.y = 21394;
    wrapThrough.wrapPolygon.lineTo.Add(lineTo);
    lineTo = new CT_Positive2D();
    lineTo.x = 21806;
    lineTo.y = 21394;
    wrapThrough.wrapPolygon.lineTo.Add(lineTo);
    lineTo = new CT_Positive2D();
    lineTo.x = 21806;
    lineTo.y = 0;
    wrapThrough.wrapPolygon.lineTo.Add(lineTo);
    lineTo = new CT_Positive2D();
    lineTo.x = 0;
    lineTo.y = 0;
    wrapThrough.wrapPolygon.lineTo.Add(lineTo);
    gr.AddPicture(gfs, (int)NPOI.XWPF.UserModel.PictureType.JPEG, "1.jpg",720000, 720000,
    posH, posV, wrapThrough, anchor, simplePos, effectExtent);

    9、  页眉页脚设置
    1)  页眉设置
    XWPFDocument m_Docx = new XWPFDocument();
    m_Docx.Document.body.sectPr = new CT_SectPr();
    CT_SectPr m_SectPr =m_Docx.Document.body.sectPr;

    //创建页眉
    CT_Hdr m_Hdr = new CT_Hdr();
    m_Hdr.AddNewP().AddNewR().AddNewT().Value = "hhh";//页眉内容

    //创建页眉关系(headern.xml)
    XWPFRelation Hrelation = XWPFRelation.HEADER;
    XWPFHeader m_h = (XWPFHeader)m_Docx.CreateRelationship(Hrelation,XWPFFactory.GetInstance(),
    m_Docx.HeaderList.Count + 1);

    //设置页眉
    m_h.SetHeaderFooter(m_Hdr);
    CT_HdrFtrRef m_HdrFtr =m_SectPr.AddNewHeaderReference();
    m_HdrFtr.type = ST_HdrFtr.@default;
    m_HdrFtr.id = m_h.GetPackageRelationship().Id;

    2)  页脚设置
    XWPFDocument m_Docx = new XWPFDocument();
    //页面设置
    m_Docx.Document.body.sectPr = new CT_SectPr();
    CT_SectPr m_SectPr =m_Docx.Document.body.sectPr;

    //创建页脚
    CT_Ftr m_ftr = new CT_Ftr();
    m_ftr.AddNewP().AddNewR().AddNewT().Value = "fff";//页脚内容

    //创建页脚关系(footern.xml)
    XWPFRelation Frelation = XWPFRelation.FOOTER;
    XWPFFooter m_f = (XWPFFooter)m_Docx.CreateRelationship(Frelation,XWPFFactory.GetInstance(),
    m_Docx.FooterList.Count + 1);

    //设置页脚
    m_f.SetHeaderFooter(m_ftr);
    CT_HdrFtrRef m_HdrFtr =m_SectPr.AddNewFooterReference();
    m_HdrFtr.type = ST_HdrFtr.@default;
    m_HdrFtr.id = m_f.GetPackageRelationship().Id;

    10、             脚注尾注

    创建脚注和尾注,首先要设置格式,其次创建脚注和尾注内容,最后在正文中标注。

    1)  格式设置

    在正文中标注脚注采用阿拉伯数字且为上标,而标注尾注采用罗马数字且为上标,在word中可以事先用格式存储在格式

    xml中,以后可以在正文引用其格式即可。

    创建格式文件(styles.xml):XWPFStyles m_styles = m_Docx.CreateStyles();

    创建格式xml:CT_Styles m_ctstyles = new CT_Styles();可以根据需要创建相应的格式。在此只列举与脚注有关的格式

    a6和a7。

    格式a6设置如下,其中需要格式a和Char2。

                //footnote text
               m_ctstyle = new CT_Style();
               m_ctstyle.type = ST_StyleType.paragraph;
               m_ctstyle.customStyle = ST_OnOff.True;
               m_ctstyle.styleId = "a6";
               m_ctstyle.name = new CT_String();
               m_ctstyle.name.val = "footnotetext";
               m_ctstyle.basedOn = new CT_String();
               m_ctstyle.basedOn.val = "a";
               m_ctstyle.link = new CT_String();
               m_ctstyle.link.val = "Char2";
               m_ctstyle.uiPriority = new CT_DecimalNumber();
               m_ctstyle.uiPriority.val = "99";
               m_ctstyle.semiHidden = new CT_OnOff();
               m_ctstyle.semiHidden.val = true;
               m_ctstyle.unhideWhenUsed = new CT_OnOff();
               m_ctstyle.unhideWhenUsed.val = true;
               m_ctstyle.rsid = new CT_LongHexNumber();
               byte[] m_bytefootnoteText = { 0x00, 0xF0, 0x43, 0x96};
               m_ctstyle.rsid.val = m_bytefootnoteText;
               m_ctstyle.pPr = new CT_PPr();
               m_ctstyle.pPr.snapToGrid = new CT_OnOff();
               m_ctstyle.pPr.snapToGrid.val= false;
               m_ctstyle.pPr.jc = new CT_Jc();
               m_ctstyle.pPr.jc.val = ST_Jc.left;
               m_ctstyle.rPr = new CT_RPr();
               m_ctstyle.rPr.sz = new CT_HpsMeasure();
               m_ctstyle.rPr.sz.val = 18;
               m_ctstyle.rPr.szCs = new CT_HpsMeasure();
               m_ctstyle.rPr.szCs.val = 18;
               m_ctstyles.style.Add(m_ctstyle);

    格式a7设置如下,其中需要格式a0。
                //footnote reference
               m_ctstyle = new CT_Style();
               m_ctstyle.type= ST_StyleType.character;
               m_ctstyle.styleId = "a7";
               m_ctstyle.name = new CT_String();
               m_ctstyle.name.val = "footnotereference";
               m_ctstyle.basedOn = new CT_String();
               m_ctstyle.basedOn.val= "a0";
               m_ctstyle.uiPriority = new CT_DecimalNumber();
               m_ctstyle.uiPriority.val = "99";
               m_ctstyle.semiHidden = new CT_OnOff();
               m_ctstyle.semiHidden.val = true;
               m_ctstyle.unhideWhenUsed = new CT_OnOff();
               m_ctstyle.unhideWhenUsed.val = true;
               m_ctstyle.rsid = new CT_LongHexNumber();
               m_ctstyle.rsid.val = m_bytefootnoteText;
               m_ctstyle.rPr = new CT_RPr();
               m_ctstyle.rPr.vertAlign = new CT_VerticalAlignRun();
               m_ctstyle.rPr.vertAlign.val = ST_VerticalAlignRun.superscript;
               m_ctstyles.style.Add(m_ctstyle);   

    把格式添加到格式文件中:m_styles.SetStyles(m_ctstyles);

    2)  脚注

    a.      创建脚注内容

    实际上脚注内容的格式就是引用前面所述的格式设置中的定义,即格式a6和a7。

    创建脚注内容文件:XWPFFootnotes m_ftns =m_Docx.CreateFootnotes()。

                   //创建脚注内容

    int Id =m_ftns.GetFootnotesList().Count;
                   CT_FtnEdn m_ftnedn = new CT_FtnEdn();
                   m_ftnedn.id = Id.ToString();
                   CT_P m_FtnEdnxmlP =m_ftnedn.AddNewP();
                   CT_PPr m_FtnEdnxmlPPr =m_FtnEdnxmlP.AddNewPPr();
                   m_FtnEdnxmlPPr.AddNewPStyle().val = "a6";
                   m_FtnEdnxmlPPr.AddNewRPr().rFonts = new CT_Fonts();
                   m_FtnEdnxmlPPr.AddNewRPr().rFonts.hint = ST_Hint.eastAsia;
                   CT_R m_FtnEdnxmlR =m_FtnEdnxmlP.AddNewR();
                   m_FtnEdnxmlR.AddNewRPr().rStyle = new CT_String();
                   m_FtnEdnxmlR.AddNewRPr().rStyle.val = "a7";
                   m_FtnEdnxmlR.Items = newSystem.Collections.ArrayList();
                   m_FtnEdnxmlR.Items.Add(new CT_Empty());
                   m_FtnEdnxmlR.ItemsElementName = new List<RunItemsChoiceType>();
                   m_FtnEdnxmlR.ItemsElementName.Add(RunItemsChoiceType.footnoteRef);
                   m_FtnEdnxmlR = m_FtnEdnxmlP.AddNewR();
                   m_FtnEdnxmlR.AddNewT().Value = " ";
                   m_FtnEdnxmlR = m_FtnEdnxmlP.AddNewR();
                   m_FtnEdnxmlR.AddNewT().Value = strFtnEdn; //"脚注test内容
                    XWPFFootnotem_fn = m_ftns.AddFootnote(m_ftnedn);

    b.      在正文中标注

    最好用CT_P m_p = m_Docx.Document.body.AddNewP();方式创建段,在m_p中可以不断创建CT_R。
    CT_R m_r = m_p.AddNewR(); 
    m_r.AddNewT().Value = "NPOI";

    //标注脚注
             CT_R m_FtnEdnR = m_p.AddNewR();
            m_FtnEdnR.AddNewRPr().rStyle= new CT_String();
            m_FtnEdnR.AddNewRPr().rStyle.val = "a7";
            m_FtnEdnR.Items = newSystem.Collections.ArrayList();
             CT_FtnEdnRef m_ftnref = newCT_FtnEdnRef();
            m_ftnref.id = m_FtnId;//创建脚注内容得到的Id
            m_FtnEdnR.Items.Add(m_ftnref);
            m_FtnEdnR.ItemsElementName = new List<RunItemsChoiceType>();
            m_FtnEdnR.ItemsElementName.Add(RunItemsChoiceType.footnoteReference);
            m_r =m_p.AddNewR();
            m_r.AddNewT().Value= "……";

    3)  尾注

    NPOI中的OpenXmlFormats提供了较为完善的尾注所有功能,但在XWPF中没有提供创建尾注的方法。

    11、             超链接书签

    利用NPOI创建超链接书签分两个步骤。一是创建与书签关联的超链接;二是创建书签。

    1)  创建与书签关联的超链接

    NPOI提供两种超链接,一种是超链接到另一文件;另一种是超链接到书签。下面仅介绍创建超链接到书签的方法。

    创建文档:XWPFDocument m_Docx = new XWPFDocument();

    创建段落:CT_P m_p = m_Docx.Document.body.AddNewP();

    创建超链接集合:m_p.Items = newSystem.Collections.ArrayList();

    创建超链接:

                CT_Hyperlink1 m_hyperlink = new CT_Hyperlink1();
               m_hyperlink.anchor = "NPOI1";//书签名
               m_hyperlink.history = ST_OnOff.True;
               m_hyperlink.Items = newSystem.Collections.ArrayList();
                CT_R m_r = new CT_R();
               m_r.AddNewT().Value = "书签1";
               m_hyperlink.Items.Add(m_r);
               m_hyperlink.ItemsElementName = new List<ItemsChoiceType12>();
                m_hyperlink.ItemsElementName.Add(ItemsChoiceType12.hyperlink);
               m_p.Items.Add(m_hyperlink);

    2)  创建书签

    书签分开始和结束两部分组成。

    //书签0开始
                int m_bookId = 0;//同一段内有多个书签,需要不同的Id,不同段的书签Id可以相同
                m_p= m_Docx.Document.body.AddNewP();
                m_p.AddNewPPr().AddNewJc().val= ST_Jc.both;
               m_p.AddNewPPr().AddNewSpacing().line = "400";//固定行距20磅
               m_p.AddNewPPr().AddNewSpacing().lineRule = ST_LineSpacingRule.exact;
               m_p.Items = new System.Collections.ArrayList();
                CT_Bookmark m_ctbook1 = newCT_Bookmark();
               m_bookId = m_p.Items.Count;
               m_ctbook1.id = m_bookId.ToString(); //"0";
               m_ctbook1.name = "NPOI1";//书签名,超链接用
               m_p.Items.Add(m_ctbook1);
               m_p.ItemsElementName = new List<ParagraphItemsChoiceType>();
               m_p.ItemsElementName.Add(ParagraphItemsChoiceType.bookmarkStart);
               m_p.AddNewR().AddNewT().Value = "1、NPOI介绍";

                //书签0结束
               m_ctbook1 = new CT_Bookmark();
               m_ctbook1.id = m_bookId.ToString();//"0";
               m_p.Items.Add(m_ctbook1);
               m_p.ItemsElementName.Add(ParagraphItemsChoiceType.bookmarkEnd);

    12、             插入图表

    在docx中插入图表分三步实现。一是创建xlsx格式的图表原始数据,二是创建图表类型,三是在正文中插入图表。每一
    个图表对应一个xlsx文件,下面以饼图为例说明。

    1)      创建xlsx格式的图表原始数据

    //创建xlsx
                       XSSFWorkbook workbook = newXSSFWorkbook();
             //创建表单1(饼图)
               I       Sheet sheet =workbook.CreateSheet("Sheet1");
                       //表单1饼图数据
    //销售额
               //第一季度 8.2
               //第二季度 3.2
               //第三季度 1.4
               //第四季度 1.2
               IRow row = sheet.CreateRow(0);
               ICell cell = row.CreateCell(0);
               cell = row.CreateCell(0);
               cell = row.CreateCell(1);
               cell.SetCellValue("销售额");
               row = sheet.CreateRow(1);
               cell = row.CreateCell(0);
               cell.SetCellValue("第一季度");
               cell = row.CreateCell(1);
               cell.SetCellValue(8.2);
               row = sheet.CreateRow(2);
               cell = row.CreateCell(0);
               cell.SetCellValue("第二季度");
               cell = row.CreateCell(1);
               cell.SetCellValue(3.2);
               row = sheet.CreateRow(3);
               cell = row.CreateCell(0);
               cell.SetCellValue("第三季度");
               cell = row.CreateCell(1);
               cell.SetCellValue(1.4);
               row = sheet.CreateRow(4);
               cell = row.CreateCell(0);
               cell.SetCellValue("第四季度");
               cell = row.CreateCell(1);
               cell.SetCellValue(1.2);

    2)      创建图表类型
    //创建\word\charts\chartn.xml内容(简单饼图)
               CT_ChartSpace ctpiechartspace = new CT_ChartSpace();
               ctpiechartspace.date1904 = new CT_Boolean();
               ctpiechartspace.date1904.val = 1;
               ctpiechartspace.lang = new CT_TextLanguageID();
               ctpiechartspace.lang.val = "zh-CN";
               CT_Chart m_chart = ctpiechartspace.AddNewChart();
               m_chart.plotArea = new CT_PlotArea();
               m_chart.plotArea.pieChart = new List<CT_PieChart>();


               //饼图

               CT_PieChart m_piechart = new CT_PieChart();
               m_piechart.varyColors = new CT_Boolean();
               m_piechart.varyColors.val = 1;
               m_piechart.ser = new List<CT_PieSer>();
               CT_PieSer m_pieser = new CT_PieSer();


               //标题

               m_pieser.tx = new CT_SerTx();

               m_pieser.tx.strRef = new CT_StrRef();
               m_pieser.tx.strRef.f = "Sheet1!$B$1";
               m_pieser.tx.strRef.strCache = new CT_StrData();
               m_pieser.tx.strRef.strCache.ptCount = new CT_UnsignedInt();
               m_pieser.tx.strRef.strCache.ptCount.val = 1;
               CT_StrVal m_strval = new CT_StrVal();

               m_strval.idx = 0;
               m_strval.v = "销售额";
               m_pieser.tx.strRef.strCache.pt = new List<CT_StrVal>();
               m_pieser.tx.strRef.strCache.pt.Add(m_strval);

               //行标题
               m_pieser.cat = new CT_AxDataSource();
               m_pieser.cat.strRef = new CT_StrRef();
               m_pieser.cat.strRef.f = "Sheet1!$A$2:$A$5";
               m_pieser.cat.strRef.strCache = new CT_StrData();
               m_pieser.cat.strRef.strCache.ptCount = new CT_UnsignedInt();
               m_pieser.cat.strRef.strCache.ptCount.val = 4;
               m_pieser.cat.strRef.strCache.pt = new List<CT_StrVal>();
               m_strval = new CT_StrVal();
               m_strval.idx = 0;
               m_strval.v = "第一季度";
               m_pieser.cat.strRef.strCache.pt.Add(m_strval);
               m_strval = new CT_StrVal();
               m_strval.idx = 1;
               m_strval.v = "第二季度";
               m_pieser.cat.strRef.strCache.pt.Add(m_strval);
               m_strval = new CT_StrVal();
               m_strval.idx = 2;
               m_strval.v = "第三季度";
               m_pieser.cat.strRef.strCache.pt.Add(m_strval);
               m_strval = new CT_StrVal();
               m_strval.idx = 3;
               m_strval.v = "第四季度";
               m_pieser.cat.strRef.strCache.pt.Add(m_strval);

               //值
               m_pieser.val = new CT_NumDataSource();
               m_pieser.val.numRef = new CT_NumRef();
               m_pieser.val.numRef.f = "Sheet1!$B$2:$B$5";
               m_pieser.val.numRef.numCache = new CT_NumData();
               m_pieser.val.numRef.numCache.formatCode = "General";
               m_pieser.val.numRef.numCache.ptCount = new CT_UnsignedInt();
               m_pieser.val.numRef.numCache.ptCount.val = 4;
               m_pieser.val.numRef.numCache.pt = new List<CT_NumVal>();
               CT_NumVal m_numval = new CT_NumVal();
               m_numval.idx = 0;
               m_numval.v = "8.2";
               m_pieser.val.numRef.numCache.pt.Add(m_numval);
               m_numval = new CT_NumVal();
               m_numval.idx = 1;
               m_numval.v = "3.2";
               m_pieser.val.numRef.numCache.pt.Add(m_numval);
               m_numval = new CT_NumVal();
               m_numval.idx = 2;
               m_numval.v = "1.4";
               m_pieser.val.numRef.numCache.pt.Add(m_numval);
               m_numval = new CT_NumVal();
               m_numval.idx = 3;
               m_numval.v = "1.2";
               m_pieser.val.numRef.numCache.pt.Add(m_numval);
               m_piechart.ser.Add(m_pieser);
               m_chart.plotArea.pieChart.Add(m_piechart);
               m_chart.legend = new CT_Legend();
               m_chart.legend.legendPos = new CT_LegendPos();
               m_chart.legend.legendPos.val = ST_LegendPos.r;
               m_chart.plotVisOnly = new CT_Boolean();
               m_chart.plotVisOnly.val = 1;

    3)      页面中插入图表

    以inline式为例。

               XWPFParagraph gp = m_Docx.CreateParagraph();
               XWPFRun gr = gp.CreateRun();
               gp = m_Docx.CreateParagraph();
               gr = gp.CreateRun();
               gr.AddChartSpace(workbook , ctpiechartspace, 5274310, 3076575);


    NPOI是tonyqus提供的2.1.1.0源码经过新修改编译。

    测试例子下载:http://download.csdn.NET/detail/gltide/8016349。例中提供了创建表、插图和图表实现的代码。
    ========

    使用NOPI读取Word、Excel文档内容

    http://www.cnblogs.com/mahongbiao/p/3760878.html
    使用NOPI读取Excel的例子很多,读取Word的例子不多。

    Excel的解析方式有多中,可以使用ODBC查询,把Excel作为一个数据集对待。也可以使用文档结构模型的方式进行解析

    ,即解析Workbook(工作簿)、Sheet、Row、Column。

    Word的解析比较复杂,因为Word的文档结构模型定义较为复杂。解析Word或者Excel,关键是理解Word、Excel的文

    档对象模型。

    Word、Excel文档对象模型的解析,可以通过COM接口调用,此类方式使用较广。(可以录制宏代码,然后替换为对应

    的语言)

    也可以使用XML模型解析,尤其是对于2007、2010版本的文档的解析。

    using NPOI.POIFS.FileSystem;
    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    using NPOI.XWPF.UserModel;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.IO;
    using System.Text;

    namespace eyuan
    {
        public static class NOPIHandler
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public static List<List<List<string>>> ReadExcel(string fileName)
            {
                //打开Excel工作簿
                XSSFWorkbook hssfworkbook = null;
                 try
                {
                    using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                    {
                        hssfworkbook = new XSSFWorkbook(file);
                    }
                }
                catch (Exception e)
                {
                    LogHandler.LogWrite(string.Format("文件{0}打开失败,错误:{1}", new string[] { fileName, 
    e.ToString() }));
                }
                //循环Sheet页
                int sheetsCount = hssfworkbook.NumberOfSheets;
                List<List<List<string>>> workBookContent = new List<List<List<string>>>();
                for (int i = 0; i < sheetsCount; i++)
                {
                    //Sheet索引从0开始
                    ISheet sheet = hssfworkbook.GetSheetAt(i);
                    //循环行
                    List<List<string>> sheetContent = new List<List<string>>();
                    int rowCount = sheet.PhysicalNumberOfRows;
                    for (int j = 0; j < rowCount; j++)
                    {
                        //Row(逻辑行)的索引从0开始
                        IRow row = sheet.GetRow(j);
                        //循环列(各行的列数可能不同)
                        List<string> rowContent = new List<string>();
                        int cellCount = row.PhysicalNumberOfCells;
                        for (int k = 0; k < cellCount; k++)
                        {
                            //ICell cell = row.GetCell(k);
                            ICell cell = row.Cells[k];
                            if (cell == null)
                            {
                                rowContent.Add("NIL");
                            }
                            else
                            {
                                rowContent.Add(cell.ToString());
                                //rowContent.Add(cell.StringCellValue);
                            }
                        }
                        //添加行到集合中
                        sheetContent.Add(rowContent);
                    }
                    //添加Sheet到集合中
                    workBookContent.Add(sheetContent);
                }

                return workBookContent;
            }

            /// <summary>
            /// 
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public static string ReadExcelText(string fileName)
            {
                string ExcelCellSeparator = ConfigurationManager.AppSettings["ExcelCellSeparator"];
                string ExcelRowSeparator = ConfigurationManager.AppSettings["ExcelRowSeparator"];
                string ExcelSheetSeparator = ConfigurationManager.AppSettings["ExcelSheetSeparator"];
                //
                List<List<List<string>>> excelContent = ReadExcel(fileName);
                string fileText = string.Empty;
                StringBuilder sbFileText = new StringBuilder();
                //循环处理WorkBook中的各Sheet页
                List<List<List<string>>>.Enumerator enumeratorWorkBook = excelContent.GetEnumerator();
                while (enumeratorWorkBook.MoveNext())
                {

                    //循环处理当期Sheet页中的各行
                    List<List<string>>.Enumerator enumeratorSheet = 
    enumeratorWorkBook.Current.GetEnumerator();
                    while (enumeratorSheet.MoveNext())
                    {

                        string[] rowContent = enumeratorSheet.Current.ToArray();
                        sbFileText.Append(string.Join(ExcelCellSeparator, rowContent));
                        sbFileText.Append(ExcelRowSeparator);
                    }
                    sbFileText.Append(ExcelSheetSeparator);
                }
                //
                fileText = sbFileText.ToString();
                return fileText;
            }

            /// <summary>
            /// 读取Word内容
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public static string ReadWordText(string fileName)
            {
                string WordTableCellSeparator = ConfigurationManager.AppSettings["WordTableCellSeparator"];
                string WordTableRowSeparator = ConfigurationManager.AppSettings["WordTableRowSeparator"];
                string WordTableSeparator = ConfigurationManager.AppSettings["WordTableSeparator"];
                //
                string CaptureWordHeader = ConfigurationManager.AppSettings["CaptureWordHeader"];
                string CaptureWordFooter = ConfigurationManager.AppSettings["CaptureWordFooter"];
                string CaptureWordTable = ConfigurationManager.AppSettings["CaptureWordTable"];
                string CaptureWordImage = ConfigurationManager.AppSettings["CaptureWordImage"];
                //
                string CaptureWordImageFileName = ConfigurationManager.AppSettings
    ["CaptureWordImageFileName"];
                //
                string fileText = string.Empty;
                StringBuilder sbFileText = new StringBuilder();

                #region 打开文档
                XWPFDocument document = null;
                try
                {
                    using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                    {
                        document = new XWPFDocument(file);
                    }
                }
                catch (Exception e)
                {
                    LogHandler.LogWrite(string.Format("文件{0}打开失败,错误:{1}", new string[] { fileName, 
    e.ToString() }));
                }
                #endregion

                #region 页眉、页脚
                //页眉
                if (CaptureWordHeader == "true")
                {
                    sbFileText.AppendLine("Capture Header Begin");
                    foreach (XWPFHeader xwpfHeader in document.HeaderList)
                    {
                        sbFileText.AppendLine(string.Format("{0}", new string[] { xwpfHeader.Text }));
                    }
                    sbFileText.AppendLine("Capture Header End");
                }
                //页脚
                if (CaptureWordFooter == "true")
                {
                    sbFileText.AppendLine("Capture Footer Begin");
                    foreach (XWPFFooter xwpfFooter in document.FooterList)
                    {
                        sbFileText.AppendLine(string.Format("{0}", new string[] { xwpfFooter.Text }));
                    }
                    sbFileText.AppendLine("Capture Footer End");
                }
                #endregion

                #region 表格
                if (CaptureWordTable == "true")
                {
                    sbFileText.AppendLine("Capture Table Begin");
                    foreach (XWPFTable table in document.Tables)
                    {
                        //循环表格行
                        foreach (XWPFTableRow row in table.Rows)
                        {
                            foreach (XWPFTableCell cell in row.GetTableCells())
                            {
                                sbFileText.Append(cell.GetText());
                                //
                                sbFileText.Append(WordTableCellSeparator);
                            }

                            sbFileText.Append(WordTableRowSeparator);
                        }
                        sbFileText.Append(WordTableSeparator);
                    }
                    sbFileText.AppendLine("Capture Table End");
                }
                #endregion

                #region 图片
                if (CaptureWordImage == "true")
                {
                    sbFileText.AppendLine("Capture Image Begin");
                    foreach (XWPFPictureData pictureData in document.AllPictures)
                    {
                        string picExtName = pictureData.suggestFileExtension();
                        string picFileName = pictureData.GetFileName();
                        byte[] picFileContent = pictureData.GetData();
                        //
                        string picTempName = string.Format(CaptureWordImageFileName, new string[] { 
    Guid.NewGuid().ToString() + "_" + picFileName + "." + picExtName });
                        //
                        using (FileStream fs = new FileStream(picTempName, FileMode.Create, FileAccess.Write))
                        {
                            fs.Write(picFileContent, 0, picFileContent.Length);
                            fs.Close();
                        }
                        //
                        sbFileText.AppendLine(picTempName);
                    }
                    sbFileText.AppendLine("Capture Image End");
                }
                #endregion

                //正文段落
                sbFileText.AppendLine("Capture Paragraph Begin");
                foreach (XWPFParagraph paragraph in document.Paragraphs)
                {
                    sbFileText.AppendLine(paragraph.ParagraphText);
                }
                sbFileText.AppendLine("Capture Paragraph End");
                //

                //
                fileText = sbFileText.ToString();
                return fileText;
            }

        }
    }

    ========

    C# WebForm 使用NPOI 2 生成简单的word文档(.docx)


    http://doc.okbase.net/LFDX/archive/98909.html
     
      使用NPOI可以方便的实现服务端对Word、Excel的读写。要实现对Word的读写操作,需要引用NPOI.OOXML.dll,应用命名空间XWPF。

      本文使用NPOI 2.0实现对Word的基本生成、下载操作。 NOPI 2.0 下载地址:http://npoi.codeplex.com/downloads/get/764162
    虽然现在最新版本为NPOI 2.1.1 ,但笔者使用2.1.1的NPOI.OOXML.dll时,发现无法实现段落格式化功能,故推荐使用本文版本。
    需要添加的命名空间:
    using System.IO;
    using NPOI.XWPF.UserModel;
    
    XWPFDocument doc = new XWPFDocument();      //创建新的word文档
    
    XWPFParagraph p1 = doc.CreateParagraph();   //向新文档中添加段落
    p1.SetAlignment(ParagraphAlignment.CENTER); //段落对其方式为居中
    
    XWPFRun r1 = p1.CreateRun();                //向该段落中添加文字
    r1.SetText("测试段落一");
    
    XWPFParagraph p2 = doc.CreateParagraph();
    p2.SetAlignment(ParagraphAlignment.LEFT);
    
    XWPFRun r2 = p2.CreateRun();
    r2.SetText("测试段落二");
    
    FileStream sw = File.Create("cutput.docx"); //...
    doc.Write(sw);                              //...
    sw.Close();                                 //在服务端生成文件
    
    FileInfo file = new FileInfo("cutput.docx");//文件保存路径及名称  
    //注意: 文件保存的父文件夹需添加Everyone用户,并给予其完全控制权限
    Response.Clear();
    Response.ClearHeaders();
    Response.Buffer = false;
    Response.ContentType = "application/octet-stream";
    Response.AppendHeader("Content-Disposition", "attachment;filename=" 
    + HttpUtility.UrlEncode("output.docx", System.Text.Encoding.UTF8));
    Response.AppendHeader("Content-Length", file.Length.ToString());
    Response.WriteFile(file.FullName);
    Response.Flush();                           //以上将生成的word文件发送至用户浏览器
    
    File.Delete("cutput.docx");                 //清除服务端生成的word文件


    ========


    展开全文
  • Word2000/XP中内部COM插件的编程实现

    千次阅读 2003-04-19 09:44:00
    Word2000/XP中内部COM插件的编程实现编译:徐景周下载示例源码(http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=734)简介Office2000/XP中Word下的内部COM插件的实现方法和前面我的文章Office2000下内部...
  • 用C#编程实现Word文档中搜索文本在word应用程序中搜索和替换文本是举手之劳的事情,通过word的对象模型,我们也可以使用编程方式来实现。Word的对象模型有比较详细的帮助文档,放在office安装程序目录,office ...
  • 操作WORD配置说明 引入:Word的对象库文件“MSWORD.OLB”(word 2000为MSWORD9.OLB) 1.运行Dcomcnfg.exe 2.组件服务――计算机――我的电脑――DCOM配置――找到microsoft word 文档 3.点击属性 4.选择“安全...
  • java语言编程实现,打开exe文件的功能,代码如下: public class OpenSpecialFile{ public static void main(final String[] args) throws IOException {   openWindowsExe();   openExe();   open...
  • Delphi和Word编程集锦

    千次阅读 2006-09-13 16:03:00
    用Delphi合并Word表格中单元格//合并Word 表格中单元格procedure mergeWordCell;var WordApp: TWordApplication; WordDoc: TWordDocument; DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,...
  • 小弟是一名计算机专业大三学生,老师布置项目让完成,其中让实现在VS2008下建一个web窗体,在此页面下能实现把本地word上传到服务器端,小弟是一个编程菜鸟,完全不知道如何下手,还请各位大神指教
  • 本文参考http://blog.csdn.net/gongpulin/article/details/51534754,不同的是本文以Java语言实现实例的编程实现。a、案例分析 对于词频数统计,用 Spark 提供的算子来实现,我们首先需要将文本文件中的每一行转化...
  • word宏、宏编程以及VBA

    万次阅读 多人点赞 2018-12-03 19:55:37
    word宏是什么呢? 宏是一个批量处理程序命令,正确地运用它可以提高工作效率。微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力。 如完成一个一打开word文件同时要打开某个文件...
  • 编程实现绘制表格

    千次阅读 2015-05-03 23:08:16
    之前只知道word等文本工具可以绘图,但只是知其然不知其所以然。下面就粗略的讲一下它的原理。首先我们要了解的是表格的绘制都是有一些制表符构成的,那么下面就简单了,我们只要知道光标是如何判断怎么来显示这些...
  • /*************************************************...输入联想功能是非常实用的一个功能,请编程实现类似功能。 要求实现函数:  void auto_complete(char *str, char *tmp,char *output)  【输入】 char *str,候
  • 对文字字体样式进行修改 run.font.样式 = xxx import os os.chdir('D:\\python_major\\auto_office15') from docx import Document ...from docx.shared import Pt, RGBColor ...doc = Document('这是一个文档....
  • C#编程实现在Excel文档中搜索文本

    千次阅读 2007-03-22 00:22:00
    有了在word文档中编程实现搜索文本的经验,在excel中实现这个功能也并非难事。 打开Excel的VBA帮助,查看Excel的对象模型,很容易找到完成这个功能需要的几个集合和对象:Application、Workbooks、Workbook、...
  • VC++编程实现修改EXE文件图标

    千次阅读 2017-08-22 19:05:36
    VC++编程实现修改EXE文件图标 刚才发现论坛上面有网友问:如何通过编程实现修改EXE文件的图标,类似于 熊猫烧香 的效果!自己也对这个比较感兴趣网上找了找,找到了两种方法,可以满足大家都要求了,这里面收集...
  • 首先我们新建一个VS2005的工程,然后选择创建OFFICE的WORD文档 。等待创建。。。。好了!我们创建了一个新的OFFICE文档,然后我们开始进行编写相应的代码。首先我们先拖过来相应的控件,包括textbox,label,button,...
  • // Inserts a word into the trie. void insert(string word) { TrieNode* p = root; int len = word.length(); for (int i = 0; i < len; i++){ char c = word[i]; int index = c - 'a'; if(p-...
  • 用vb编程语言实现连杆机构的运动仿真,不用软件运行,要用word运行,求编程语言及运动仿真设计
  • VC++编程实现对火焰的计算机动态仿真来源: 天极网摘要:本文通过对真实火焰物理特性的分析,建立了火焰动态燃烧的数学模型,并在此数学模型基础之上借助于DirectDraw技术对图形显示的加速,在VC++ 6.0下对火焰作了...
  • 共享访问在.NET中的编程实现

    千次阅读 2007-08-08 22:46:00
    共享访问在.NET中的编程实现 发布日期:2007-08-08 | 更新日期:2009-03-15作者:郑佐摘要:本文简单介绍在.NET中如何通过API实现局域网共享访问编程。 本页内容概述API介绍代码实现应用示例结束语 概述一般用户...
  • 最近在写一个DEMO,一个安卓应用,实现本机从服务器下载各类office(word,execel等)文件,然后点击浏览。 目前已经实现了下载功能,在浏览上遇到了问题。想求教各位大神,是否有第三方的应用。或者JAR包之类的。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,023
精华内容 45,609
关键字:

word编程实现