环境:net framework 4.5.2


    效果图

    1. public class WordTool {
    2. /// <summary>
    3. /// 生成会议记录
    4. /// </summary>
    5. /// <param name="date">记录日期时间</param>
    6. /// <param name="markUser">记录人员</param>
    7. /// <param name="address">地点</param>
    8. /// <param name="title">议题</param>
    9. /// <param name="customer">客户人员</param>
    10. /// <param name="dw">均维人员</param>
    11. /// <param name="contentArray">会议记录</param>
    12. public static string Init(string date, string markUser, string address, string title, string customer, string dw, string[] contentArray) {
    13. //路径验证
    14. var currentName = $"File/PreViewWord/{DateTime.Now.ToString("yyyyMMdd-HHssmm")}.docx";
    15. DirectoryInfo dir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "File/PreViewWord");
    16. if (!dir.Exists) dir.Create();
    17. var relativeName = AppDomain.CurrentDomain.BaseDirectory + currentName;
    18. FileInfo file = new FileInfo(relativeName);
    19. if (file.Exists) file.Delete();
    20. using (FileStream fs = new FileStream(relativeName, FileMode.OpenOrCreate)) {
    21. #region 初始化
    22. //1、初始化文档
    23. XWPFDocument m_Doc = new XWPFDocument();
    24. CT_SectPr m_SectPrs = new CT_SectPr(); //设置页面格式(宽度) A4横向
    25. m_SectPrs.pgSz.w = (ulong)11906;
    26. m_SectPrs.pgSz.h = (ulong)16838;
    27. //创建页眉
    28. CT_Hdr m_Hdr = new CT_Hdr();
    29. m_Hdr.AddNewP().AddNewPPr().AddNewSpacing().lineRule = ST_LineSpacingRule.auto;
    30. //页眉内容
    31. m_Hdr.AddNewP().AddNewR().AddNewT().Value = "东莞均维";
    32. XWPFRelation Hrelation = XWPFRelation.HEADER;
    33. XWPFHeader m_h = (XWPFHeader)m_Doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(),
    34. m_Doc.HeaderList.Count + 1);
    35. m_h.SetHeaderFooter(m_Hdr);
    36. CT_HdrFtrRef m_HdrFtr = m_SectPrs.AddNewHeaderReference();
    37. m_HdrFtr.type = ST_HdrFtr.@default;
    38. m_HdrFtr.id = m_h.GetPackageRelationship().Id;
    39. XWPFParagraph pHeader = m_h.Paragraphs[1];
    40. pHeader.Alignment = ParagraphAlignment.CENTER; //居中
    41. pHeader.Runs[0].FontSize = 7;
    42. //创建页脚
    43. CT_Ftr m_ftr = new CT_Ftr();
    44. m_ftr.AddNewP().AddNewR().AddNewT().Value = (m_Doc.FooterList.Count + 1) + "";
    45. //创建页脚关系(footern.xml)
    46. XWPFRelation Frelation = XWPFRelation.FOOTER;
    47. XWPFFooter m_f = (XWPFFooter)m_Doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), m_Doc.FooterList.Count + 1);
    48. //设置页脚
    49. m_f.SetHeaderFooter(m_ftr);
    50. CT_HdrFtrRef m_HdrFtr1 = m_SectPrs.AddNewFooterReference();
    51. m_HdrFtr1.type = ST_HdrFtr.@default;
    52. m_HdrFtr1.id = m_f.GetPackageRelationship().Id;
    53. XWPFParagraph pFooter = m_f.Paragraphs[0];
    54. pFooter.Alignment = ParagraphAlignment.CENTER; //居中
    55. pFooter.Runs[0].FontSize = 7;
    56. m_Doc.Document.body.sectPr = m_SectPrs;
    57. #endregion
    58. #region 标题段落
    59. //2、创建主标题段落
    60. XWPFParagraph p1 = m_Doc.CreateParagraph();
    61. p1.Alignment = ParagraphAlignment.LEFT;
    62. XWPFRun row1 = p1.CreateRun();
    63. row1.FontFamily = "黑体";
    64. row1.FontSize = 22;
    65. row1.IsBold = true;
    66. //主标题
    67. row1.SetText("MEETING MINUTES");
    68. CT_P doc_p1 = m_Doc.Document.body.GetPArray(0);
    69. //段落水平居中 标题
    70. doc_p1.AddNewPPr().AddNewJc().val = ST_Jc.center;
    71. #endregion
    72. //空格
    73. XWPFParagraph space1 = m_Doc.CreateParagraph();
    74. space1.Alignment = ParagraphAlignment.CENTER;
    75. XWPFRun spaceRow1 = space1.CreateRun();
    76. #region 纪要详情
    77. //创建表格牵扯到合并表格所以这里一行行创建
    78. XWPFTable table = m_Doc.CreateTable(1, 3);//1⾏3列
    79. table.RemoveRow(0);//去掉第⼀⾏空⽩的
    80. table.Width = 1000 * 5;
    81. table.SetColumnWidth(0, 600);/* 设置列宽 */
    82. table.SetColumnWidth(1, 600);/* 设置列宽 */
    83. table.SetColumnWidth(2, 600);/* 设置列宽 */
    84. //table.SetColumnWidth(1, 1200);
    85. #region 表格第一行
    86. CT_Row nr = new CT_Row();
    87. XWPFTableRow mr = new XWPFTableRow(nr, table);//创建⾏
    88. //设置行高
    89. mr.GetCTRow().AddNewTrPr().AddNewTrHeight().val = (ulong)426;
    90. table.AddRow(mr);//将⾏添加到table中
    91. XWPFTableCell c1 = mr.CreateCell();//创建单元格
    92. CT_Tc ct = c1.GetCTTc();
    93. CT_TcPr cp = ct.AddNewTcPr();
    94. cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
    95. cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    96. ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
    97. //ct.GetPList()[0].AddNewR().AddNewT().Value = "日期:2022-05-26";
    98. ct.RemoveP(0);
    99. XWPFParagraph par = c1.AddParagraph();
    100. //首行缩进
    101. //par.IndentationFirstLine = Indentation("宋体", 8, 2, FontStyle.Regular);
    102. XWPFRun run = par.CreateRun();
    103. run.FontFamily = "宋体";
    104. run.IsBold = true;
    105. run.FontSize = 8;
    106. run.SetText(" 日期:" + date);
    107. c1 = mr.CreateCell();//创建单元格
    108. ct = c1.GetCTTc();
    109. cp = ct.AddNewTcPr();
    110. cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
    111. cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    112. ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
    113. //ct.GetPList()[0].AddNewR().AddNewT().Value = "记录人:梁非凡";
    114. //移除标题
    115. ct.RemoveP(0);
    116. par = c1.AddParagraph();
    117. run = par.CreateRun();
    118. run.FontFamily = "宋体";
    119. run.FontSize = 8;
    120. run.IsBold = true;
    121. run.SetText(" 记录人:" + markUser);
    122. c1 = mr.CreateCell();//创建单元格
    123. ct = c1.GetCTTc();
    124. cp = ct.AddNewTcPr();
    125. cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
    126. cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    127. ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
    128. //ct.GetPList()[0].AddNewR().AddNewT().Value = "地点:均维";
    129. //移除标题
    130. ct.RemoveP(0);
    131. par = c1.AddParagraph();
    132. run = par.CreateRun();
    133. run.FontFamily = "宋体";
    134. run.IsBold = true;
    135. run.FontSize = 8;
    136. run.SetText(" 地点:" + address);
    137. #endregion
    138. #region 表格第二行
    139. // 2行
    140. nr = new CT_Row();
    141. mr = new XWPFTableRow(nr, table);
    142. mr.GetCTRow().AddNewTrPr().AddNewTrHeight().val = (ulong)426;
    143. table.AddRow(mr);
    144. c1 = mr.CreateCell();//创建单元格
    145. ct = c1.GetCTTc();
    146. cp = ct.AddNewTcPr();
    147. cp.gridSpan = new CT_DecimalNumber();
    148. cp.gridSpan.val = "3"; //合并 3列
    149. cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
    150. ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;//文字左对齐
    151. cp.AddNewVAlign().val = ST_VerticalJc.center;//文字垂直
    152. //移除标题
    153. ct.RemoveP(0);
    154. //使用中转方法
    155. par = c1.AddParagraph();
    156. //首行缩进
    157. //par.IndentationFirstLine = Indentation("宋体", 8, 2, FontStyle.Regular);
    158. run = par.CreateRun();
    159. run.FontFamily = "黑体";
    160. run.IsBold = true;
    161. run.FontSize = 9;
    162. run.SetText(" 标题:" + title);
    163. //run.AddBreak();
    164. #endregion
    165. #region 表格第三行
    166. // 3⾏,多⾏合并类似
    167. nr = new CT_Row();
    168. mr = new XWPFTableRow(nr, table);
    169. mr.GetCTRow().AddNewTrPr().AddNewTrHeight().val = (ulong)800;
    170. table.AddRow(mr);
    171. c1 = mr.CreateCell();//创建单元格
    172. ct = c1.GetCTTc();
    173. cp = ct.AddNewTcPr();
    174. cp.gridSpan = new CT_DecimalNumber();
    175. cp.gridSpan.val = "3"; //合并 3列
    176. ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
    177. cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    178. ct.RemoveP(0);
    179. //这里标题就不设置了
    180. //ct.GetPList()[0].AddNewR().AddNewT().Value = @"议题:";
    181. //标题
    182. par = c1.AddParagraph();
    183. //首行缩进
    184. par.IndentationFirstLine = Indentation("黑体", 8, 2, FontStyle.Regular);
    185. run = par.CreateRun();
    186. run.FontFamily = "黑体";
    187. run.IsBold = true;
    188. run.FontSize = 8;
    189. run.SetText("与会人员:");
    190. //run.AddBreak();
    191. //run.AddCarriageReturn(); //换行会多出一行配合addbreak()使用
    192. par = c1.AddParagraph();
    193. //首行缩进
    194. par.IndentationFirstLine = Indentation("宋体", 8, 2, FontStyle.Regular);
    195. run = par.CreateRun();
    196. run.FontFamily = "宋体";
    197. run.IsBold = false;
    198. run.FontSize = 8;
    199. run.SetText("客户:" + customer);
    200. //run.AddBreak();
    201. //run.AddCarriageReturn();
    202. par = c1.AddParagraph();
    203. //首行缩进
    204. par.IndentationFirstLine = Indentation("宋体", 8, 2, FontStyle.Regular);
    205. run = par.CreateRun();
    206. run.FontFamily = "宋体";
    207. run.IsBold = false;
    208. run.FontSize = 8;
    209. run.SetText("均维:" + dw);
    210. #endregion
    211. #endregion
    212. //创建空行
    213. space1 = m_Doc.CreateParagraph();
    214. space1.Alignment = ParagraphAlignment.CENTER;
    215. spaceRow1 = space1.CreateRun();
    216. //创建空行
    217. space1 = m_Doc.CreateParagraph();
    218. space1.Alignment = ParagraphAlignment.CENTER;
    219. spaceRow1 = space1.CreateRun();
    220. #region 会议纪要
    221. //创建表格
    222. table = m_Doc.CreateTable(1, 1);//1⾏3列
    223. table.RemoveRow(0);//去掉第⼀⾏空⽩的
    224. table.Width = 1000 * 5;
    225. table.SetColumnWidth(0, 1800);/* 设置列宽 */
    226. #region 标题
    227. nr = new CT_Row();
    228. mr = new XWPFTableRow(nr, table);//创建⾏
    229. mr.GetCTRow().AddNewTrPr().AddNewTrHeight().val = (ulong)426;
    230. table.AddRow(mr);//将⾏添加到table中
    231. c1 = mr.CreateCell();//创建单元格
    232. ct = c1.GetCTTc();
    233. cp = ct.AddNewTcPr();
    234. cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
    235. cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    236. ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
    237. ct.RemoveP(0);
    238. mr.GetCell(0).SetColor("#EEEEEE");
    239. par = mr.GetCell(0).AddParagraph();
    240. run = par.CreateRun();
    241. run.FontFamily = "宋体";
    242. run.FontSize = 8;
    243. run.IsBold = true;
    244. run.SetText("会议记录");
    245. #endregion
    246. #region 内容
    247. nr = new CT_Row();
    248. mr = new XWPFTableRow(nr, table);//创建⾏
    249. table.AddRow(mr);//将⾏添加到table中
    250. c1 = mr.CreateCell();//创建单元格
    251. ct = c1.GetCTTc();
    252. cp = ct.AddNewTcPr();
    253. cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
    254. cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    255. ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
    256. ct.RemoveP(0);
    257. foreach (var item in contentArray) {
    258. par = mr.GetCell(0).AddParagraph();
    259. par.IndentationFirstLine = Indentation("宋体", 7, 2, FontStyle.Regular);
    260. par.SpacingBeforeLines = 20;
    261. par.SpacingBeforeLines = 20;
    262. par.FirstLineIndent = 20;
    263. run = par.CreateRun();
    264. run.FontFamily = "宋体";
    265. run.FontSize = 7;
    266. run.IsBold = true;
    267. run.SetText(item);
    268. run.AddBreak();
    269. //run.AddCarriageReturn();
    270. }
    271. #endregion
    272. #endregion
    273. //5、写入到文件
    274. m_Doc.Write(fs);
    275. }
    276. return currentName;
    277. }
    278. //设置字体样式
    279. public XWPFParagraph SetCellText(XWPFDocument doc, XWPFTable table, string setText) {
    280. //table中的⽂字格式设置
    281. CT_P para = new CT_P();
    282. XWPFParagraph pCell = new XWPFParagraph(para, table.Body);
    283. pCell.Alignment = ParagraphAlignment.CENTER;//字体居中
    284. pCell.VerticalAlignment = TextAlignment.CENTER;//字体居中
    285. XWPFRun r1c1 = pCell.CreateRun();
    286. r1c1.SetText(setText);
    287. r1c1.FontSize = 12;
    288. r1c1.FontFamily = "华⽂楷体";
    289. //r1c1.SetTextPosition(20);//设置⾼度
    290. return pCell;
    291. }
    292. protected static int Indentation(String fontname, int fontsize, int Indentationfonts, FontStyle fs) {
    293. //字显示宽度,用于段首行缩进
    294. //字号与fontsize关系
    295. //初号(0号)=84,小初=72,1号=52,2号=44,小2=36,3号=32,小3=30,4号=28,
    296. //小4=24,5号=21,小5=18,6号=15,小6=13,7号=11,8号=10
    297. Bitmap bmp = new Bitmap(1000, 800);
    298. Graphics m_tmpGr = Graphics.FromImage(bmp);
    299. m_tmpGr.PageUnit = GraphicsUnit.Point;
    300. SizeF size = m_tmpGr.MeasureString("好", new Font(fontname, fontsize * 0.75F, fs));
    301. return (int)size.Width * Indentationfonts * 10;
    302. }
    303. }