大名鼎鼎的NPOI用來導出EXCEL的文章園子里面有很多,可是用來導出WORD文檔的文章大都含糊不清,最近剛好完成一個導出WORD文檔的需求,在此分享下。
NPOI里面認為word文檔的最基本的結構是段落,代表這個段落的類就是XWPFParagraph,使用這個類可以設置段落里面的字體、大小、以及是否加粗等。
代表整個文檔的的類XWPFDocument,是最外層的容器相當於一個word文檔的實例,代表表格的類XWPFTable,是較小級別的段落容器相當於一個表格的實例。
一個XWPFDocument可以添加多個XWPFTable和多個XWPFParagraph,一個XWPFTable可以添加多個XWPFParagraph
現在我們要創建一個有幾個段落和表格的word文檔,其中,表格里面要顯示帶格式的文字(微軟雅黑,小四),形如

首先,需要創建一個XWPFDocument doc = new XWPFDocument(),隨后用文檔實例doc創建段落1~段落n
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()方法直接生成一個專屬於表格的段落。
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 16 17 XWPFParagraph pIMm = table.GetRow(i).GetCell(2).AddParagraph(); 18 XWPFRun rIMm = pIMm.CreateRun(); 19 rIMm.SetFontFamily("微軟雅黑"); 20 rIMm.SetFontSize(12); 21 rIMm.SetBold(true); 22 rIMm.SetText(notLoginStudents[i - 1].PassWord); 23 24 25 XWPFParagraph pIName = table.GetRow(i).GetCell(3).AddParagraph(); 26 XWPFRun rIName = pIName.CreateRun(); 27 rIName.SetFontFamily("微軟雅黑"); 28 rIName.SetFontSize(12); 29 rIName.SetBold(true); 30 rIName.SetText(notLoginStudents[i - 1].StudentName);
隨后,把文檔寫入流doc.Write(new MemoryStream()),接着你想干神馬就都OK了。
