一个项目,要做一个从数据库读取数据,然后导出到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;
最终效果图如下:
关键代码如下:
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);//设置高度