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
 
        具體代碼:
 

[csharp]  view plain  copy
 
  1. private void button1_Click(object sender, EventArgs e)  
  2.  {  
  3.      MemoryStream ms = new MemoryStream();  
  4.      XWPFDocument m_Docx = new XWPFDocument();  
  5.      m_Docx = CreatDocxTable();   
  6.     m_Docx.Write(ms);  
  7.      ms.Flush();  
  8.      SaveToFile(ms,"d:\\test.docx");  
  9.  }  
  10.  protected XWPFDocument CreatDocxTable()  
  11.  {  
  12.      XWPFDocument m_Docx = new XWPFDocument();  
  13.      XWPFParagraph p0 = m_Docx.CreateParagraph();  
  14.      XWPFRun r0 = p0.CreateRun();  
  15.      r0.SetText("DOCX表");  
  16.   
  17.     XWPFTable table = m_Docx.CreateTable(1, 3);//創建一行3列表  
  18.      table.GetRow(0).GetCell(0).SetText("111");  
  19.      table.GetRow(0).GetCell(1).SetText("222");  
  20.      table.GetRow(0).GetCell(2).SetText("333");  
  21.   
  22.     XWPFTableRow m_Row = table.CreateRow();//創建一行  
  23.      m_Row = table.CreateRow();//創建一行  
  24.      m_Row.GetCell(0).SetText("211");  
  25.   
  26.     //合並單元格  
  27.      m_Row = table.InsertNewTableRow(0);//表頭插入一行  
  28.      XWPFTableCell cell = m_Row.CreateCell();//創建一個單元格,創建單元格時就創建了一個CT_P  
  29.      CT_Tc cttc = cell.GetCTTc();  
  30.      CT_TcPr ctPr = cttc.AddNewTcPr();  
  31.      ctPr.gridSpan.val = "3";//合並3列  
  32.      cttc.GetPList()[0].AddNewPPr().AddNewJc().val= ST_Jc.center;  
  33.      cttc.GetPList()[0].AddNewR().AddNewT().Value = "abc";       
  34.   
  35.      XWPFTableRow td3 = table.InsertNewTableRow(table.Rows.Count - 1);//插入行  
  36.      cell = td3.CreateCell();  
  37.      cttc = cell.GetCTTc();  
  38.      ctPr = cttc.AddNewTcPr();  
  39.      ctPr.gridSpan.val = "3";  
  40.      cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;  
  41.      cttc.GetPList()[0].AddNewR().AddNewT().Value = "qqq";  
  42.   
  43.     //表增加行,合並列  
  44.      CT_Row m_NewRow = new CT_Row();  
  45.      m_Row = new XWPFTableRow(m_NewRow, table);  
  46.      table.AddRow(m_Row); //必須要!!!  
  47.      cell = m_Row.CreateCell();  
  48.      cttc = cell.GetCTTc();  
  49.      ctPr = cttc.AddNewTcPr();  
  50.      ctPr.gridSpan.val = "3";  
  51.      cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;  
  52.      cttc.GetPList()[0].AddNewR().AddNewT().Value = "sss";  
  53.   
  54.      //表未增加行,合並2列,合並2行  
  55.      //1行  
  56.      m_NewRow = new CT_Row();  
  57.      m_Row = new XWPFTableRow(m_NewRow, table);  
  58.      table.AddRow(m_Row);  
  59.      cell = m_Row.CreateCell();  
  60.      cttc = cell.GetCTTc();  
  61.      ctPr = cttc.AddNewTcPr();  
  62.      ctPr.gridSpan.val = "2";  
  63.      ctPr.AddNewVMerge().val = ST_Merge.restart;//合並行  
  64.      ctPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直居中  
  65.      cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;  
  66.      cttc.GetPList()[0].AddNewR().AddNewT().Value = "xxx";  
  67.      cell = m_Row.CreateCell();  
  68.      cell.SetText("ddd");  
  69.      //2行,多行合並類似  
  70.      m_NewRow = new CT_Row();  
  71.      m_Row = new XWPFTableRow(m_NewRow, table);  
  72.      table.AddRow(m_Row);  
  73.      cell = m_Row.CreateCell();  
  74.      cttc = cell.GetCTTc();  
  75.      ctPr = cttc.AddNewTcPr();  
  76.      ctPr.gridSpan.val = "2";  
  77.      ctPr.AddNewVMerge().val = ST_Merge.@continue;//合並行  
  78.      cell = m_Row.CreateCell();  
  79.      cell.SetText("kkk");  
  80.      ////3行  
  81.      //m_NewRow = new CT_Row();  
  82.      //m_Row = new XWPFTableRow(m_NewRow, table);  
  83.      //table.AddRow(m_Row);  
  84.      //cell = m_Row.CreateCell();  
  85.      //cttc = cell.GetCTTc();  
  86.      //ctPr = cttc.AddNewTcPr();  
  87.      //ctPr.gridSpan.val = "2";  
  88.      //ctPr.AddNewVMerge().val = ST_Merge.@continue;  
  89.      //cell = m_Row.CreateCell();  
  90.      //cell.SetText("hhh");  
  91.   
  92.     return m_Docx;  
  93.  }  
  94.  static void SaveToFile(MemoryStream ms, string fileName)  
  95.  {  
  96.      using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))  
  97.      {  
  98.          byte[] data = ms.ToArray();  
  99.   
  100.         fs.Write(data, 0, data.Length);  
  101.          fs.Flush();  
  102.          data = null;  
  103.      }  
  104.  }  



 上面代碼所創建的表見圖
========

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

[csharp]  view plain  copy
 
  1. XWPFParagraph p0 = doc.CreateParagraph();  
  2.  p0.SetAlignment(ParagraphAlignment.LEFT);  
  3.  XWPFRun r0 = p0.CreateRun();  
  4.  r0.SetFontFamily("宋體");  
  5.  r0.SetFontSize(18);  
  6.  r0.SetBold(true);  
  7.  r0.SetText("未登錄過學生的賬號密碼");  
  8.   
  9.  XWPFParagraph p1 = doc.CreateParagraph();  
  10.  p1.SetAlignment(ParagraphAlignment.LEFT);  
  11.  XWPFRun r1 = p1.CreateRun();  
  12.  r1.SetFontFamily("宋體");  
  13.  r1.SetFontSize(10);  
  14.  r1.SetBold(true);  
  15.  r1.SetText("(備注:已登錄過的學生密碼不顯示)");  
  16.   
  17.  XWPFParagraph p2 = doc.CreateParagraph();  
  18.  p2.SetAlignment(ParagraphAlignment.LEFT);  
  19.  XWPFRun r2 = p2.CreateRun();  
  20.  r2.SetFontFamily("宋體");  
  21.  r2.SetFontSize(10);  
  22.  r2.SetBold(true);  
  23.  r2.SetText("學校:XX一中");  
  24.   
  25.  XWPFParagraph p3 = doc.CreateParagraph();  
  26.  p3.SetAlignment(ParagraphAlignment.LEFT);  
  27.  XWPFRun r3 = p3.CreateRun();  
  28.  r3.SetFontFamily("宋體");  
  29.  r3.SetFontSize(10);  
  30.  r3.SetBold(true);  
  31.  r3.SetText("班級:(7)");  
  32.   
  33.  XWPFParagraph p4 = doc.CreateParagraph();  
  34.  p4.SetAlignment(ParagraphAlignment.LEFT);  
  35.  XWPFRun r4 = p4.CreateRun();  
  36.  r4.SetFontFamily("宋體");  
  37.  r4.SetFontSize(10);  
  38.  r4.SetBold(true);  
  39.  r4.SetText("班主任:ddd");  
  40.   
  41.   
  42.  XWPFParagraph p5 = doc.CreateParagraph();  
  43.  p5.SetAlignment(ParagraphAlignment.LEFT);  
  44.  XWPFRun r5 = p5.CreateRun();  
  45.  r5.SetFontFamily("宋體");  
  46.  r5.SetFontSize(10);  
  47.  r5.SetBold(true);  
  48.  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()方法直接生成一個專屬於表格的段落。

[csharp]  view plain  copy
 
  1. XWPFParagraph pIO = table.GetRow(i).GetCell(0).AddParagraph();  
  2. XWPFRun rIO = pIO.CreateRun();  
  3. rIO.SetFontFamily("微軟雅黑");  
  4. rIO.SetFontSize(12);  
  5. rIO.SetBold(true);  
  6. rIO.SetText(i.ToString());  
  7.   
  8.   
  9. XWPFParagraph pINo =table.GetRow(i).GetCell(1).AddParagraph();  
  10. XWPFRun rINo = pINo.CreateRun();  
  11. rINo.SetFontFamily("微軟雅黑");  
  12. rINo.SetFontSize(12);  
  13. rINo.SetBold(true);  
  14. rINo.SetText(notLoginStudents[i - 1].UserName);15   
  15.   
  16. XWPFParagraph pIMm = table.GetRow(i).GetCell(2).AddParagraph();  
  17. XWPFRun rIMm = pIMm.CreateRun();  
  18. rIMm.SetFontFamily("微軟雅黑");  
  19. rIMm.SetFontSize(12);  
  20. rIMm.SetBold(true);  
  21. rIMm.SetText(notLoginStudents[i - 1].PassWord);23                       
  22.   
  23. XWPFParagraph pIName = table.GetRow(i).GetCell(3).AddParagraph();  
  24. XWPFRun rIName = pIName.CreateRun();  
  25. rIName.SetFontFamily("微軟雅黑");  
  26. rIName.SetFontSize(12);  
  27. rIName.SetBold(true);  
  28. 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時,發現無法實現段落格式化功能,故推薦使用本文版本。
需要添加的命名空間:

[csharp]  view plain  copy
 
  1. using System.IO;  
  2. using NPOI.XWPF.UserModel;  
  3.   
  4. XWPFDocument doc = new XWPFDocument();      //創建新的word文檔  
  5.   
  6. XWPFParagraph p1 = doc.CreateParagraph();   //向新文檔中添加段落  
  7. p1.SetAlignment(ParagraphAlignment.CENTER); //段落對其方式為居中  
  8.   
  9. XWPFRun r1 = p1.CreateRun();                //向該段落中添加文字  
  10. r1.SetText("測試段落一");  
  11.   
  12. XWPFParagraph p2 = doc.CreateParagraph();  
  13. p2.SetAlignment(ParagraphAlignment.LEFT);  
  14.   
  15. XWPFRun r2 = p2.CreateRun();  
  16. r2.SetText("測試段落二");  
  17.   
  18. FileStream sw = File.Create("cutput.docx"); //...  
  19. doc.Write(sw);                              //...  
  20. sw.Close();                                 //在服務端生成文件  
  21.   
  22. FileInfo file = new FileInfo("cutput.docx");//文件保存路徑及名稱    
  23. //注意: 文件保存的父文件夾需添加Everyone用戶,並給予其完全控制權限  
  24. Response.Clear();  
  25. Response.ClearHeaders();  
  26. Response.Buffer = false;  
  27. Response.ContentType = "application/octet-stream";  
  28. Response.AppendHeader("Content-Disposition", "attachment;filename="   
  29. + HttpUtility.UrlEncode("output.docx", System.Text.Encoding.UTF8));  
  30. Response.AppendHeader("Content-Length", file.Length.ToString());  
  31. Response.WriteFile(file.FullName);  
  32. Response.Flush();                           //以上將生成的word文件發送至用戶瀏覽器  
  33.   
  34. File.Delete("cutput.docx");                 //清除服務端生成的word文件  



 

========

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM