一个项目,要做一个从数据库读取数据,然后导出到word,因为涉及到后台数据库的读取,决定用npoi来导出word。

         NPOI源码地址:http://npoi.codeplex.com/

        NPOI 2.0 api文档: http://www.npoi.info/npoi2tutorial

       因为npoi操作word的文章比较少,在由于版本不同,相关的函数可能不一样,这个就需要大家自己去慢慢的探索了。

      例如:作者的api文档中

c.字体加粗

r1.SetBold(true);

实际我在调用时,调用的接口是 r1c1.IsBold = 12;

我使用的版本是:NPOI v2.2.0.0

需要引用的命名空间如下

using NPOI.XWPF.UserModel;
using NPOI.OpenXmlFormats.Wordprocessing;

        

        最终效果图如下:

     

NPOI导出xlsx格式文件 FileResult npoi导出word_Text

     关键代码如下:

     

1. /// <summary>  
2. /// 新增  
3. /// </summary>  
4. /// <param name="sender"></param>  
5. /// <param name="e"></param>  
6. protected void btnPrint_Click(object sender, EventArgs e)  
7.   {  
8. //创建document对象  
9. new XWPFDocument();  
10. //创建段落对象  
11.       XWPFParagraph p1 = doc.CreateParagraph();  
12. //字体居中  
13. //创建run对象  
14. //本节提到的所有样式都是基于XWPFRun的,  
15. //你可以把XWPFRun理解成一小段文字的描述对象,  
16. //这也是Word文档的特征,即文本描述性文档。  
17. //来自Tony Qu http://tonyqus.sinaapp.com/archives/609  
18.       XWPFRun runTitle = p1.CreateRun();  
19. true;  
20. "军检验收单");  
21.       runTitle.FontSize = 16;  
22. "宋体", FontCharRange.None);//设置雅黑字体  
23.   
24.       XWPFParagraph p2 = doc.CreateParagraph();  
25.       XWPFRun run1 = p2.CreateRun();  
26. " 军检项目号:");  
27.       run1.FontSize = 12;  
28. "华文楷体", FontCharRange.None);//设置雅黑字体  
29.  
30.       #region 头部(6 rows)  
31.   
32. //基本row12,列5;头部6行,4列  
33.       XWPFTable tableTop = doc.CreateTable(6, 5);  
34.       tableTop.Width = 1000 * 5;  
35. /* 设置列宽 */  
36. /* 设置列宽 */  
37. /* 设置列宽 */  
38. /* 设置列宽 */  
39. /* 设置列宽 */  
40.   
41.   
42. /* 合并行 */  
43. "产品名称"));  
44. "              "));  
45.   
46.       tableTop.GetRow(1).MergeCells(1, 4);  
47. "项目名称"));  
48. "              "));  
49.   
50.       tableTop.GetRow(2).MergeCells(1, 4);  
51. "施工依据", ParagraphAlignment.CENTER, 45));  
52. "              ", ParagraphAlignment.CENTER, 45));  
53.   
54. "检验方式"));  
55. "独立检验"));  
56. "              "));  
57. "联合检验"));  
58. "              "));  
59.   
60.       tableTop.GetRow(4).MergeCells(3, 4);  
61. "设备名称及编号"));  
62. "              "));  
63. "设备制造厂"));  
64. "              "));  
65. //tableTop.GetRow(4).GetCell(3).SetBorderBottom(XWPFtableTop.XWPFBorderType.NONE,0,0,"");  
66.   
67.       tableTop.GetRow(5).MergeCells(0, 4);  
68. new CT_P();  
69. new XWPFParagraph(para, tableTop.Body);  
70. //字体居中  
71.   
72.       XWPFRun r1c1 = pCell.CreateRun();  
73. "检验要素共9项");  
74.       r1c1.FontSize = 12;  
75. "华文楷体", FontCharRange.None);//设置雅黑字体  
76.       tableTop.GetRow(5).GetCell(0).SetParagraph(pCell);  
77.   
78. //table.GetRow(6).GetCell(0).SetParagraph(SetCellText(doc, table, "序号"));  
79. //table.GetRow(6).GetCell(1).SetParagraph(SetCellText(doc, table, "检验要素"));  
80. //table.GetRow(6).GetCell(2).SetParagraph(SetCellText(doc, table, "指标要求"));  
81. //table.GetRow(6).GetCell(3).SetParagraph(SetCellText(doc, table, "实测值"));  
82. //table.GetRow(6).GetCell(4).SetParagraph(SetCellText(doc, table, "测量工具编号及有效期"));  
83.  
84.       #endregion  
85.  
86.       #region 检验要素列表部分(数据库读取循环显示)  
87.   
88. /* 打印1页:小于8行数据,创建9行; 
89.            * 打印2页:大于8小于26行数据,创建27行。增加18 
90.            * 打印3页:大于26小于44行数据,创建45行。增加18 
91.            */  
92.       XWPFTable tableContent = doc.CreateTable(45, 5);  
93.       tableContent.Width = 1000 * 5;  
94. /* 设置列宽 */  
95. /* 设置列宽 */  
96. /* 设置列宽 */  
97. /* 设置列宽 */  
98. /* 设置列宽 */  
99.   
100. "序号"));  
101. "检验要素"));  
102. "指标要求"));  
103. "实测值"));  
104. "测量工具编号及有效期"));  
105.   
106. for (int i = 1; i < 45; i++)  
107.       {  
108.           tableContent.GetRow(i).GetCell(0).SetParagraph(SetCellText(doc, tableContent, i.ToString(), ParagraphAlignment.CENTER, 50));  
109. "检验要素", ParagraphAlignment.CENTER, 50));  
110. "指标要求", ParagraphAlignment.CENTER, 50));  
111. "实测值", ParagraphAlignment.CENTER, 50));  
112. "测量工具编号及有效期", ParagraphAlignment.CENTER, 50));  
113.       }  
114.  
115.       #endregion  
116.  
117.       #region 底部内容  
118.   
119.       XWPFTable tableBottom = doc.CreateTable(5, 4);  
120.       tableBottom.Width = 1000 * 5;  
121.   
122. /* 设置列宽 */  
123. /* 设置列宽 */  
124. /* 设置列宽 */  
125. /* 设置列宽 */  
126.   
127. /* 合并行 */  
128. "附件:", ParagraphAlignment.LEFT, 80));  
129.       tableBottom.GetRow(0).Height = 30;  
130.   
131. /* 合并行 */  
132. "检验结论:", ParagraphAlignment.LEFT, 80));  
133.       tableBottom.GetRow(1).Height = 30;  
134.   
135.   
136. "施工部门"));  
137. "        "));  
138. "报验日期"));  
139. "        "));  
140.   
141. "军检次数"));  
142. "        "));  
143. "军检日期"));  
144. "        "));  
145.   
146. "检验员"));  
147. "        "));  
148. "军代表"));  
149. "        "));  
150.  
151.       #endregion  
152.   
153. //保存文件到磁盘WinForm  
154. //string docPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "DocxWord");  
155.   
156. //if (!Directory.Exists(docPath)) { Directory.CreateDirectory(docPath); }  
157.   
158.   
159. //string fileName = string.Format("{0}.doc", HttpUtility.UrlEncode("jjysd" + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff"), System.Text.Encoding.UTF8));  
160.   
161. //FileStream out1 = new FileStream(Path.Combine(docPath, fileName), FileMode.Create);  
162. //doc.Write(out1);  
163. //out1.Close();  
164.  
165.       #region 保存导出WebForm  
166.   
167. //Response.Redirect(ResolveUrl(string.Format(@"~\DocxWord\{0}", fileName)));  
168.   
169. new System.IO.MemoryStream();  
170.       doc.Write(ms);  
171. "Content-Disposition", string.Format("attachment; filename={0}.doc", HttpUtility.UrlEncode("文件名" + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff"), System.Text.Encoding.UTF8)));  
172.       Response.BinaryWrite(ms.ToArray());  
173.       Response.End();  
174.   
175.       ms.Close();  
176.       ms.Dispose();  
177.   
178. //using (MemoryStream ms = new MemoryStream())  
179. //{  
180. //    doc.Write(ms);  
181. //    Response.ClearContent();  
182. //    Response.Buffer = true;  
183. //    Response.ContentType = "application/octet-stream";  
184. //    Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.doc", HttpUtility.UrlEncode("军检验收单" + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff"), System.Text.Encoding.UTF8)));  
185. //    Response.BinaryWrite(ms.ToArray());  
186. //    //Response.End();  
187. //    Response.Flush();  
188. //    doc = null;  
189. //    ms.Close();  
190. //    ms.Dispose();  
191. //}  
192.  
193.       #endregion  
194.   }

 

 

 


1. /// <summary>  
2. /// 设置字体格式  
3. /// </summary>  
4. /// <param name="doc"></param>  
5. /// <param name="table"></param>  
6. /// <param name="setText"></param>  
7. /// <returns></returns>  
8. public XWPFParagraph SetCellText(XWPFDocument doc, XWPFTable table, string setText)  
9. {  
10. //table中的文字格式设置  
11. new CT_P();  
12. new XWPFParagraph(para, table.Body);  
13. //字体居中  
14. //字体居中  
15.   
16.     XWPFRun r1c1 = pCell.CreateRun();  
17.     r1c1.SetText(setText);  
18.     r1c1.FontSize = 12;  
19. "华文楷体", FontCharRange.None);//设置雅黑字体  
20. //r1c1.SetTextPosition(20);//设置高度  
21.   
22. return pCell;  
23. }  
24.   
25. /// <summary>  
26. /// 设置单元格格式  
27. /// </summary>  
28. /// <param name="doc">doc对象</param>  
29. /// <param name="table">表格对象</param>  
30. /// <param name="setText">要填充的文字</param>  
31. /// <param name="align">文字对齐方式</param>  
32. /// <param name="textPos">rows行的高度</param>  
33. /// <returns></returns>  
34. public XWPFParagraph SetCellText(XWPFDocument doc, XWPFTable table, string setText, ParagraphAlignment align, int textPos)  
35. {  
36. new CT_P();  
37. new XWPFParagraph(para, table.Body);  
38. //pCell.Alignment = ParagraphAlignment.LEFT;//字体  
39.     pCell.Alignment = align;  
40.   
41.     XWPFRun r1c1 = pCell.CreateRun();  
42.     r1c1.SetText(setText);  
43.     r1c1.FontSize = 12;  
44. "华文楷体", FontCharRange.None);//设置雅黑字体  
45. //设置高度  
46.   
47. return pCell;  
48. }


 

设置table的宽度,以及没列的宽度代码如下:

 

 

    1. XWPFTable tableTop = doc.CreateTable(6, 5);  
    2. /* 设置table宽度,必须设置width,SetColumnWidth才有效 */  
    3. /* 设置第一列宽 */  
    4. /* 设置第二列宽 */  
    5. /* 设置列宽 */  
    6. /* 设置列宽 */  
    7. /* 设置列宽 */

     

    和并列以及设置列的高度:

    tableTop.GetRow(0).MergeCells(1, 4);/* 合并列 */
     
    XWPFRun r1c1 = pCell.CreateRun();
            r1c1.SetText(setText);
            r1c1.FontSize = 12;
            r1c1.SetFontFamily("华文楷体", FontCharRange.None);//设置雅黑字体
            r1c1.SetTextPosition(textPos);//设置高度