使用NPOI导出复杂Word详解

724 阅读9分钟

首先导入Nuget包NPOI;


1.使用NPOI生成Word
2.读取word模板填充数据

ps:第一次写,请见谅

1.使用NPOI生成word
//里面使用的方法都在下面
      public bool GenerateWord()
          try
            {
            string currentDate = DateTime.Now.ToString("yyyyMMdd");
            string checkTime = DateTime.Now.ToString("yymmddss");//检查时间
            var uploadPath = @"D:\MyCode\Words\Files\";
            string workFileName = checkTime + "Test";
            string fileName = string.Format("{0}.docx", workFileName, System.Text.Encoding.UTF8);
            if (!Directory.Exists(uploadPath))
            {
                Directory.CreateDirectory(uploadPath);
            }
            //TODO:使用FileStream文件流来写入数据(传入参数为:文件所在路径,对文件的操作方式,对文件内数据的操作)
            //通过使用文件流,创建文件流对象,向文件流中写入内容,并保存为Word文档格式
            using (var stream = new FileStream(Path.Combine(uploadPath, fileName), FileMode.Create, FileAccess.Write))
            {

                //创建document文档对象对象实例
                XWPFDocument document = new XWPFDocument();
                #region 页脚
                document.Document.body.sectPr = new CT_SectPr();

                var with = document.Document.body.sectPr.pgSz.w;
                //设置为纵向
                document.Document.body.sectPr.pgSz.w = document.Document.body.sectPr.pgSz.h;
                document.Document.body.sectPr.pgSz.h = with;

                //页面边距
                document.Document.body.sectPr.pgMar.left = 800;//左边距
                document.Document.body.sectPr.pgMar.right = 800;//右边距
                document.Document.body.sectPr.pgMar.top = "850";//上边距
                document.Document.body.sectPr.pgMar.bottom = "850";//下边距

                CT_SectPr m_SectPr = document.Document.body.sectPr;
                //创建页脚
                CT_Ftr m_ftr = new CT_Ftr();

                m_ftr.AddNewP().AddNewR().AddNewT().Value = "Wuxi XDC ADC Contract Proposal";
                //创建页脚关系(footern.xml)
                XWPFRelation Frelation = XWPFRelation.FOOTER;
                XWPFFooter m_f = (XWPFFooter)document.CreateRelationship(Frelation, XWPFFactory.GetInstance(), document.FooterList.Count + 1);

                //设置页脚
                m_f.SetHeaderFooter(m_ftr);
                m_f.SetXWPFDocument(document);
                CT_HdrFtrRef m_HdrFtr1 = m_SectPr.AddNewFooterReference();
                m_HdrFtr1.type = ST_HdrFtr.@default;
                m_HdrFtr1.id = m_f.GetPackageRelationship().Id;

                #endregion
                /**
                 *这里我通过设置公共的Word文档中SetParagraph(段落)实例创建和段落样式格式设置,大大减少了代码的冗余,
                 * 避免每使用一个段落而去创建一次段落实例和设置段落的基本样式
                 *(如下,ParagraphInstanceSetting为段落实例创建和样式设置,后面索引表示为当前是第几行段落,索引从0开始)
                 */
                #region 头部
                int pos = 1;
                //图片标题
                document.SetParagraph(ParagraphInsertImg(document), 0);

                //文本标题
                document.SetParagraph(ParagraphInstanceSetting(document, "", true, 18, "宋体", ParagraphAlignment.CENTER), pos++);
                //文本标题
                document.SetParagraph(ParagraphInstanceSetting(document, "", true, 18, "宋体", ParagraphAlignment.CENTER), pos++);
                //文本标题《项目编号》
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 18, "宋体", ParagraphAlignment.CENTER), pos++);

                //创建文档中的表格对象实例
                XWPFTable firstXwpfTable = document.CreateTable(8, 3);//显示的行列数rows:8行,cols:3列
                firstXwpfTable.Width = 6000;//总宽度
                firstXwpfTable.SetColumnWidth(0, 2000); /* 设置列宽 */
                firstXwpfTable.SetColumnWidth(1, 2000); /* 设置列宽 */
                firstXwpfTable.SetColumnWidth(2, 2000); /* 设置列宽 */
                firstXwpfTable.SetTopBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                firstXwpfTable.SetBottomBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                firstXwpfTable.SetLeftBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                firstXwpfTable.SetRightBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                firstXwpfTable.SetInsideHBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                firstXwpfTable.SetInsideVBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                firstXwpfTable.SetCellMargins(0, 100, 0, 0);

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "            ", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "委托方:", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"{"苏州光明生物制药有限公司"}", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "            ", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "            ", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(2).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(2).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable.GetRow(3).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "            ", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(3).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(3).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"{""}", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable.GetRow(4).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "            ", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(4).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(4).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable.GetRow(5).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "            ", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(5).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(5).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable.GetRow(6).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "            ", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(6).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(6).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable.GetRow(7).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "            ", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(7).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
                firstXwpfTable.GetRow(7).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));


                #endregion

                #region 内容
                //文本
                document.SetParagraph(ParagraphInstanceSetting(document, "xxxx.", false, 10, "宋体", ParagraphAlignment.LEFT), pos++);

                //下划线标题
                document.SetParagraph(ParagraphInstanceSetting(document, $"xxx", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, true), pos++);

                //文本
                document.SetParagraph(ParagraphInstanceSetting(document, "xxxx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);

                //文本
                document.SetParagraph(ParagraphInstanceSetting(document, @"xx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);

                //下划线标题
                document.SetParagraph(ParagraphInstanceSetting(document, $"xx", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, true), pos++);

                //文本
                document.SetParagraph(ParagraphInstanceSetting(document, @"xxx。", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);

                //下划线标题
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, "", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, "", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, "", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, "", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, "", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	(包括液体和冻干制剂)", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);


                //下划线标题
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, @"", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);

                document.SetParagraph(ParagraphInstanceSetting(document, $"表格1", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                #endregion

                #region 文档第一个表格对象实例
                //创建文档中的表格对象实例
                XWPFTable firstXwpfTable1 = document.CreateTable(2, 3);//显示的行列数rows:3行,cols:4列
                firstXwpfTable1.Width = 3000;//总宽度
                firstXwpfTable1.SetColumnWidth(0, 1000); /* 设置列宽 */
                firstXwpfTable1.SetColumnWidth(1, 1000); /* 设置列宽 */

                //Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
                firstXwpfTable1.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, " ", ParagraphAlignment.CENTER, 24, true));
                firstXwpfTable1.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xxxx", ParagraphAlignment.CENTER, 24, false));
                firstXwpfTable1.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xx", ParagraphAlignment.CENTER, 24, true));

                //Table 表格第二行
                firstXwpfTable1.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xx", ParagraphAlignment.CENTER, 24, true));
                firstXwpfTable1.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xx", ParagraphAlignment.CENTER, 24, false));
                firstXwpfTable1.GetRow(1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xx", ParagraphAlignment.CENTER, 24, true));

                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"xx", false, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);

                document.SetParagraph(ParagraphInstanceSetting(document, " •	xxx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	x", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	xx ", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	xxx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	xxx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	x", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	xx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	x", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);

                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);

                document.SetParagraph(ParagraphInstanceSetting(document, $"x", false, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);

                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);

                document.SetParagraph(ParagraphInstanceSetting(document, $"x", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, true), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $" x", false, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);

                document.SetParagraph(ParagraphInstanceSetting(document, " •	x", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " •	x", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, " ••••••", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);

                document.SetParagraph(ParagraphInstanceSetting(document, $"x", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
                document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);

                //创建文档中的表格对象实例
                XWPFTable firstXwpfTable2 = document.CreateTable(4, 3);//显示的行列数rows:3行,cols:4列
                firstXwpfTable2.Width = 3000;//总宽度
                firstXwpfTable2.SetColumnWidth(0, 1000); /* 设置列宽 */
                firstXwpfTable2.SetColumnWidth(1, 1000); /* 设置列宽 */
                firstXwpfTable2.SetColumnWidth(2, 1000); /* 设置列宽 */
                #endregion

                var checkPeopleNum = 0;//检查人数
                var totalScore = 0;//总得分

                #region 文档第二个表格对象实例(遍历表格项)
                //创建文档中的表格对象实例
                XWPFTable secoedXwpfTable = document.CreateTable(5, 4);//显示的行列数rows:8行,cols:4列
                secoedXwpfTable.Width = 5200;//总宽度
                secoedXwpfTable.SetColumnWidth(0, 1300); /* 设置列宽 */
                secoedXwpfTable.SetColumnWidth(1, 1100); /* 设置列宽 */
                secoedXwpfTable.SetColumnWidth(2, 1400); /* 设置列宽 */
                secoedXwpfTable.SetColumnWidth(3, 1400); /* 设置列宽 */

                //遍历表格标题
                secoedXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "员工姓名", ParagraphAlignment.CENTER, 24, true));
                secoedXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "性别", ParagraphAlignment.CENTER, 24, true));
                secoedXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "年龄", ParagraphAlignment.CENTER, 24, true));
                secoedXwpfTable.GetRow(0).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "综合评分", ParagraphAlignment.CENTER, 24, true));

                //遍历四条数据
                for (var i = 1; i < 5; i++)
                {
                    secoedXwpfTable.GetRow(i).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "小明" + i + "", ParagraphAlignment.CENTER, 24, false));
                    secoedXwpfTable.GetRow(i).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "", ParagraphAlignment.CENTER, 24, false));
                    secoedXwpfTable.GetRow(i).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, 20 + i + "", ParagraphAlignment.CENTER, 24, false));
                    secoedXwpfTable.GetRow(i).GetCell(3).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, 90 + i + "", ParagraphAlignment.CENTER, 24, false));

                    checkPeopleNum++;
                    totalScore += 90 + i;
                }

                #endregion

                #region 文档第三个表格对象实例
                //创建文档中的表格对象实例
                XWPFTable thirdXwpfTable = document.CreateTable(5, 4);//显示的行列数rows:5行,cols:4列
                thirdXwpfTable.Width = 5200;//总宽度
                thirdXwpfTable.SetColumnWidth(0, 1300); /* 设置列宽 */
                thirdXwpfTable.SetColumnWidth(1, 1100); /* 设置列宽 */
                thirdXwpfTable.SetColumnWidth(2, 1400); /* 设置列宽 */
                thirdXwpfTable.SetColumnWidth(3, 1400); /* 设置列宽 */
                //Table 表格第一行,后面的合并3列(注意关于表格中行合并问题,先合并,后填充内容)
                thirdXwpfTable.GetRow(0).MergeCells(0, 3);//从第一列起,合并3列
                thirdXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, thirdXwpfTable, "                                                                                         " + "检查内容: " +
                    $"于{checkTime}下午检查了企业员工培训考核并对员工的相关信息进行了相关统计,统计结果如下:                                                                                                                                                                                                                " +
                    "-------------------------------------------------------------------------------------" +
                    $"共对该企业({checkPeopleNum})人进行了培训考核,培训考核总得分为({totalScore})分。 " + "", ParagraphAlignment.LEFT, 30, false));
                //Table 表格第二行
                thirdXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, thirdXwpfTable, "检查结果: ", ParagraphAlignment.CENTER, 24, true));
                thirdXwpfTable.GetRow(1).MergeCells(1, 3);//从第二列起,合并三列
                thirdXwpfTable.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, thirdXwpfTable, "该企业非常优秀,坚持每天学习打卡,具有蓬勃向上的活力。", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第三行
                thirdXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, thirdXwpfTable, "处理结果: ", ParagraphAlignment.CENTER, 24, true));
                thirdXwpfTable.GetRow(2).MergeCells(1, 3);
                thirdXwpfTable.GetRow(2).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, thirdXwpfTable, "通过检查,评分为优秀!", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第四行,后面的合并3列(注意关于表格中行合并问题,先合并,后填充内容),额外说明
                thirdXwpfTable.GetRow(3).MergeCells(0, 3);//合并3列
                thirdXwpfTable.GetRow(3).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, thirdXwpfTable, "备注说明: 记住,坚持就是胜利,永远保持一种求知,好问的心理!", ParagraphAlignment.LEFT, 24, false));

                //Table 表格第五行
                thirdXwpfTable.GetRow(4).MergeCells(0, 1);
                thirdXwpfTable.GetRow(4).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, thirdXwpfTable, "                                                                                                                                                                                                 检查人员签名:              年 月 日", ParagraphAlignment.LEFT, 30, false));
                thirdXwpfTable.GetRow(4).MergeCells(1, 2);

                thirdXwpfTable.GetRow(4).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, thirdXwpfTable, "                                                                                                                                                                                                 企业法人签名:              年 月 日", ParagraphAlignment.LEFT, 30, false));

                //创建表格 
                var col = 5;
                XWPFTable table = document.CreateTable(1, 5);//思路,数据一行一行画
                table.RemoveRow(0);//去掉第一行空白的
                table.Width = 1000 * 5;
                table.SetColumnWidth(0, 1000);/* 设置列宽 */
                table.SetColumnWidth(1, 1000);

                for (int i = 0; i < col - 3; i++)
                {
                    table.SetColumnWidth(2 + i, 1000);/* 设置列宽 */
                }

                CT_Row nr = new CT_Row();
                XWPFTableRow mr = new XWPFTableRow(nr, table);//创建行 
                table.AddRow(mr);//将行添加到table中 

                XWPFTableCell c1 = mr.CreateCell();//创建单元格
                CT_Tc ct = c1.GetCTTc();
                CT_TcPr cp = ct.AddNewTcPr();

                //第1行
                cp.AddNewVMerge().val = ST_Merge.restart;//合并行
                cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ct.GetPList()[0].AddNewR().AddNewT().Value = "序号";

                c1 = mr.CreateCell();//创建单元格
                ct = c1.GetCTTc();
                cp = ct.AddNewTcPr();

                cp.AddNewVMerge().val = ST_Merge.restart;//合并行
                cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ct.GetPList()[0].AddNewR().AddNewT().Value = "指标名称";

                c1 = mr.CreateCell();//创建单元格
                ct = c1.GetCTTc();
                cp = ct.AddNewTcPr();
                cp.gridSpan = new CT_DecimalNumber();
                cp.gridSpan.val = Convert.ToString(col - 3); //合并列  
                cp.AddNewVAlign().val = ST_VerticalJc.center;
                ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;//单元格内容居中显示
                ct.GetPList()[0].AddNewR().AddNewT().Value = "年龄段";


                c1 = mr.CreateCell();//创建单元格
                ct = c1.GetCTTc();
                cp = ct.AddNewTcPr();

                cp.AddNewVMerge().val = ST_Merge.restart;//合并行
                cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ct.GetPList()[0].AddNewR().AddNewT().Value = "合计";
                //=====第一行表头结束=========


                //2行,多行合并类似
                nr = new CT_Row();
                mr = new XWPFTableRow(nr, table);
                table.AddRow(mr);

                c1 = mr.CreateCell();//创建单元格
                ct = c1.GetCTTc();
                cp = ct.AddNewTcPr();
                cp.AddNewVMerge().val = ST_Merge.@continue;//合并行 序号

                c1 = mr.CreateCell();//创建单元格
                ct = c1.GetCTTc();
                cp = ct.AddNewTcPr();
                cp.AddNewVMerge().val = ST_Merge.@continue;//合并行 指标名称
                                                           //年龄段分组
                                                           //["20岁以下","21-30","31-40","41-50","51-60","70岁以上"]
                var alAge = new List<string>() { "20岁以下", "21-30", "31-40", "41-50", "51-60", "70岁以上" };//年龄段数组
                for (int i = 0; i < alAge.Count; i++)
                {
                    mr.CreateCell().SetText(Convert.ToString(alAge[i]));//年龄段单元格
                }
                c1 = mr.CreateCell();//创建单元格
                ct = c1.GetCTTc();
                cp = ct.AddNewTcPr();
                cp.AddNewVMerge().val = ST_Merge.@continue;//合并行 合计
                #endregion
                //向文档流中写入内容,生成word
                document.Write(stream);

                savePath = "/SaveWordFile/" + currentDate + "/" + fileName;

                return true;
            }
        }
        catch (Exception ex)
        {
            //ignore
            savePath = ex.Message;
            return false;
        }
        
        }
        2.使用word模板填充数据
          /// <summary>
    /// 读取word文档,并保存文件
    /// </summary>
    /// <param name="savePath"></param>
    /// <returns></returns>
    public bool ReadWordFileAndSave<T>(out string savePath, T models)
    {
        savePath = "";
        //try
        //{
        string currentDate = DateTime.Now.ToString("yyyyMMdd");
        string checkTime = DateTime.Now.ToString("yymmddss");//检查时间
        var uploadPath = @"D:\MyCode\Aspose.Words\Files\";
        var readPath = @"D:\MyCode\Aspose.Words\Files\Test.docx";
        string workFileName = checkTime + "Test";
        string fileName = string.Format("{0}.docx", workFileName, System.Text.Encoding.UTF8);
        NPOIHellper NpoiWordParagraphTextStyleHelper = new NPOIHellper();
        if (!Directory.Exists(uploadPath))
        {
            Directory.CreateDirectory(uploadPath);
        }
        using (var stream = new FileStream(Path.Combine(uploadPath, fileName), FileMode.Create, FileAccess.Write))
        {
            FileStream fileStream = new FileStream(readPath, FileMode.Open, FileAccess.Read);
            //读取document文档对象对象实例
            XWPFDocument document = new XWPFDocument(fileStream);
            //写入document文档对象对象实例
            XWPFDocument newDocument = new XWPFDocument();

            newDocument = document;
            var counts = new ArrayList();
            foreach (var para in document.Paragraphs)
            {
                counts.Add(newDocument.GetPosOfParagraph(para));
            }
            foreach (var para in document.Tables)
            {
                counts.Add(newDocument.GetPosOfTable(para));
            }
            foreach (var c in counts)
            {
                newDocument.RemoveBodyElement((int)c);
            }
            var i = 0;
            var ii = 0;
            //遍历段落,替换内容
            foreach (var para in document.Paragraphs)
            {
                Type entityType = typeof(T);
                PropertyInfo[] properties = entityType.GetProperties();
                string paratext = para.ParagraphText;
                string text = paratext;

                if (!string.IsNullOrWhiteSpace(paratext))
                {
                    foreach (var p in properties)
                    {
                        string propteryName = p.Name;//Word模板中设定的需要替换的标签
                        object value = p.GetValue(models);
                        if (value == null)
                        {
                            value = "";
                        }
                        if (text.Contains(propteryName))
                        {
                            text = text.Replace(propteryName, value.ToString());
                        }
                    }
                }
                if (paratext != text)
                {
                    XWPFRun xwpfRunCopy = para.Runs[0];
                    for (var i1 = para.Runs.Count - 1; i1 >= 0; i1--)
                    {
                        para.RemoveRun(i1);
                    }
                    XWPFRun xwpfRun = para.CreateRun();//创建段落文本对象
                    xwpfRun = xwpfRunCopy;
                    xwpfRun.SetText(text);//填充内容
                }
                var newpara = para;
                newDocument.SetParagraph(newpara, i);
                i += 1;
            }
            //遍历table,替换单元格内容
            foreach (var table in document.Tables)
            {
                foreach (var row in table.Rows)
                {
                    foreach (var cell in row.GetTableCells())
                    {
                        foreach (var para in cell.Paragraphs)
                        {
                            Type entityType = typeof(T);
                            PropertyInfo[] properties = entityType.GetProperties();
                            string paratext = para.ParagraphText;
                            string text = paratext;

                            if (!string.IsNullOrWhiteSpace(paratext))
                            {
                                foreach (var p in properties)
                                {
                                    string propteryName = p.Name;//Word模板中设定的需要替换的标签
                                    object value = p.GetValue(models);
                                    if (value == null)
                                    {
                                        value = "";
                                    }
                                    if (text.Contains(propteryName))
                                    {
                                        text = text.Replace(propteryName, value.ToString());
                                    }
                                }
                            }
                            if (paratext != text)
                            {
                                XWPFRun xwpfRunCopy = para.Runs[0];
                                for (var i1 = para.Runs.Count - 1; i1 >= 0; i1--)
                                {
                                    para.RemoveRun(i1);
                                }
                                XWPFRun xwpfRun = para.CreateRun();//创建段落文本对象
                                xwpfRun = xwpfRunCopy;
                                xwpfRun.SetText(text);//填充内容
                            }
                        }
                    }
                }
                newDocument.SetTable(ii, table);
                ii += 1;
            }

            //向文档流中写入内容,生成word
            newDocument.Write(stream);

            savePath = "/SaveWordFile/" + currentDate + "/" + fileName;
        }
        return true;
        //}
        //catch (Exception ex)
        //{
        //    throw new Exception(ex.Message);
        //}
    }

    /// <summary>
    /// 读取word文档,并保存文件---当前使用
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="readPath">模板文件路径,绝对路径</param>
    /// <param name="uploadPath">保存文件路径,绝对路径</param>
    /// <param name="models"></param>
    /// <param name="list"></param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    public MemoryStream ReadWordFileAndSaves<T>(MemoryStream templateStream, T models, List<ActivityViewModel> list)
    {

        //读取document文档对象对象实例
        XWPFDocument document = new XWPFDocument(templateStream);

        var tablelist = new List<XWPFTable>();
        var tablelist2 = new List<XWPFTable>();
        list = list.OrderBy(c => c.ActivityType).ToList();

        var activityType = string.Empty;
        if (list.Count > 0 && list[0] != null && !string.IsNullOrWhiteSpace(list[0].ActivityType))
        {
            activityType = list[0].ActivityType;
        }
        var no = string.Empty;
        if (list.Count > 1 && list[0] != null)
        {
            no = "1";
        }
        //遍历段落,替换内容
        foreach (var para in document.Paragraphs)
        {
            if (para.ParagraphText.Contains("$ActivityDetalTableList$"))
            {
                para.ReplaceText("$ActivityDetalTableList$", activityType + ":");
                para.Alignment = ParagraphAlignment.CENTER;
            }
            else
                ReplaceKey(models, para, list);
        }
        //遍历table,替换单元格内容
        foreach (var table in document.Tables)
        {
            foreach (var row in table.Rows)
            {
                foreach (var cell in row.GetTableCells())
                {
                    foreach (var para in cell.Paragraphs)
                    {
                        if (para.ParagraphText.Contains("$ActivityType$"))
                        {
                            para.ReplaceText("$ActivityType$", activityType);
                            tablelist.Add(table);
                        }
                        else if (para.ParagraphText.Contains("$ActivityDetalTableListNo$"))
                        {
                            para.ReplaceText("$ActivityDetalTableListNo$", no);
                            tablelist2.Add(table);
                        }
                        else
                            ReplaceKey(models, para, list);
                    }
                }
            }
        }
        for (var i = 0; i < tablelist.Count; i++)
        {
            if (!list.Any())
            {
                break;
            }
            ReplaceKeyS(list, tablelist[i]);

            tablelist[i].SetTopBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist[i].SetBottomBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist[i].SetLeftBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist[i].SetRightBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist[i].SetInsideHBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist[i].SetInsideVBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
        }
        for (var i = 0; i < tablelist2.Count; i++)
        {
            if (!list.Any())
            {
                break;
            }
            ReplaceTable(list, tablelist2[i]);

            tablelist2[i].SetTopBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            //tablelist2[i].SetBottomBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist2[i].SetLeftBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist2[i].SetRightBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist2[i].SetInsideHBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
            tablelist2[i].SetInsideVBorder(XWPFTable.XWPFBorderType.SINGLE, 1, 1, "000000");
        }
        //向文档流中写入内容,生成word
        // 将创建好的文档对象写入流
        //templateStream.Flush();
        var resultStream = new MemoryStream();
        document.Write(resultStream);
        return resultStream;


    }

    /// <summary>
    /// word模板内容替换
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="etity">实体数据</param>
    /// <param name="para">段落</param>
    private static void ReplaceKey<T>(T etity, XWPFParagraph para, List<ActivityViewModel> list)
    {
        Type entityType = typeof(T);
        PropertyInfo[] properties = entityType.GetProperties();
        string paratext = para.ParagraphText;
        if (string.IsNullOrWhiteSpace(paratext))
        {
            return;
        }

        if (paratext.Contains("$ActivityList$"))
        {
            if (!list.Any())
            {
                para.ReplaceText("$ActivityList$", "暂无报价");
            }
            else
            {
                var first = true;
                var copyrun = para.Runs[0];

                var type = "FirstSpaceType";
                foreach (var ActivityViewModel in list)
                {

                    if (first)
                    {
                        para.ReplaceText("$ActivityList$", "  •  " + ActivityViewModel.ActivityName);
                        first = false;
                        type = ActivityViewModel.ActivityType;
                    }
                    else
                    {
                        XWPFRun xwpfRun = para.CreateRun();//创建段落文本对象
                        if (type != "FirstSpaceType" && type != ActivityViewModel.ActivityType)
                        {
                            xwpfRun.AddCarriageReturn();
                        }
                        type = ActivityViewModel.ActivityType;
                        xwpfRun.AddCarriageReturn();
                        xwpfRun.IsBold = copyrun.IsBold;//文字加粗
                        xwpfRun.FontSize = copyrun.FontSize;//设置文字大小
                        xwpfRun.IsItalic = copyrun.IsItalic;//是否设置斜体(字体倾斜)
                        xwpfRun.SetColor(copyrun.GetColor());//设置字体颜色--十六进制
                        xwpfRun.SetFontFamily(copyrun.FontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
                        xwpfRun.SetText("  •  " + ActivityViewModel.ActivityName);//填充内容

                    }
                }
            }
        }
        foreach (var p in properties)
        {
            object value = p.GetValue(etity);

            if (p.PropertyType.Name == "AccountViewModel" || p.PropertyType.Name == "CompanyViewModel")
            {
                if (value == null)
                {
                    value = "";
                }
                object valuedata = null;
                PropertyInfo[] properties2;
                if (p.PropertyType.Name == "AccountViewModel")
                {
                    if (!value.Equals(""))
                        valuedata = (AccountViewModel)value;
                    Type entity2Type = typeof(AccountViewModel);
                    properties2 = entity2Type.GetProperties();
                }
                else
                {
                    if (!value.Equals(""))
                        valuedata = (CompanyViewModel)value;
                    Type entity2Type = typeof(CompanyViewModel);
                    properties2 = entity2Type.GetProperties();
                }

                foreach (PropertyInfo pi in properties2)
                {
                    string propteryName2 = "$" + p.Name + "." + pi.Name + "$";//Word模板中设定的需要替换的标签


                    if (paratext.Contains(propteryName2))
                    {

                        if (value.Equals(""))
                        {
                            para.ReplaceText(propteryName2, "");
                            continue;
                        }
                        var value2 = pi.GetValue(valuedata);
                        if (value2 == null)
                        {
                            value2 = "";
                        }
                        if (pi.Name == "bankViewModels")
                        {
                            if (value2.Equals(""))
                            {
                                para.ReplaceText(propteryName2, "");
                                continue;
                            }
                            var banklist = (List<BankViewModel>)value2;
                            para.ReplaceText(propteryName2, "");
                            if (banklist.Any())
                            {
                                var copyrun = para.Runs[0];
                                foreach (var ActivityViewModel in banklist)
                                {
                                    XWPFRun xwpfRun = para.CreateRun();//创建段落文本对象
                                    xwpfRun.IsBold = copyrun.IsBold;//文字加粗
                                    xwpfRun.FontSize = copyrun.FontSize;//设置文字大小
                                    xwpfRun.IsItalic = copyrun.IsItalic;//是否设置斜体(字体倾斜)
                                    xwpfRun.SetColor(copyrun.GetColor());//设置字体颜色--十六进制
                                    xwpfRun.SetFontFamily(copyrun.FontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
                                    xwpfRun.SetText(ActivityViewModel == null ? "" : ActivityViewModel.BankName == null ? "" : ActivityViewModel.BankName);//填充内容
                                    xwpfRun.AddCarriageReturn();

                                    XWPFRun xwpfRun2 = para.CreateRun();//创建段落文本对象
                                    xwpfRun2.IsBold = copyrun.IsBold;//文字加粗
                                    xwpfRun2.FontSize = copyrun.FontSize;//设置文字大小
                                    xwpfRun2.IsItalic = copyrun.IsItalic;//是否设置斜体(字体倾斜)
                                    xwpfRun2.SetColor(copyrun.GetColor());//设置字体颜色--十六进制
                                    xwpfRun2.SetFontFamily(copyrun.FontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
                                    xwpfRun2.SetText(ActivityViewModel == null ? "" : ActivityViewModel.BankAddress == null ? "" : ActivityViewModel.BankAddress);//填充内容
                                    xwpfRun2.AddCarriageReturn();

                                    XWPFRun xwpfRun3 = para.CreateRun();//创建段落文本对象
                                    xwpfRun3.IsBold = copyrun.IsBold;//文字加粗
                                    xwpfRun3.FontSize = copyrun.FontSize;//设置文字大小
                                    xwpfRun3.IsItalic = copyrun.IsItalic;//是否设置斜体(字体倾斜)
                                    xwpfRun3.SetColor(copyrun.GetColor());//设置字体颜色--十六进制
                                    xwpfRun3.SetFontFamily(copyrun.FontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
                                    xwpfRun3.SetText(ActivityViewModel == null ? "" : ActivityViewModel.BankNo == null ? "" : ActivityViewModel.BankNo);//填充内容
                                    xwpfRun3.AddCarriageReturn();
                                }
                            }
                        }
                        else
                        {
                            //防止段落中出现多次字段
                            do
                            {
                                para.ReplaceText(propteryName2, value2.ToString());
                                paratext = para.ParagraphText;
                            } while (paratext.Contains(propteryName2));
                        }

                    }

                }
            }
            else if (p.GetType() == typeof(List<PlaceOfPerformanceViewModel>))
            {
                string propteryName = "$" + p.Name + "$";//Word模板中设定的需要替换的标签
                if (value == null)
                {
                    value = "";
                }
                if (paratext.Contains(propteryName))
                {
                    if (value.Equals(""))
                    {
                        para.ReplaceText(propteryName, "");
                        continue;
                    }
                    var plalist = (List<PlaceOfPerformanceViewModel>)value;
                    if (!plalist.Any())
                    {
                        para.ReplaceText(propteryName, "");
                    }
                    else
                    {
                        var copyrun = para.Runs[0];
                        foreach (var ActivityViewModel in plalist)
                        {
                            XWPFRun xwpfRun = para.CreateRun();//创建段落文本对象
                            xwpfRun.IsBold = copyrun.IsBold;//文字加粗
                            xwpfRun.FontSize = copyrun.FontSize;//设置文字大小
                            xwpfRun.IsItalic = copyrun.IsItalic;//是否设置斜体(字体倾斜)
                            xwpfRun.SetColor(copyrun.GetColor());//设置字体颜色--十六进制
                            xwpfRun.SetFontFamily(copyrun.FontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
                            xwpfRun.SetText(ActivityViewModel.new_address);//填充内容
                            xwpfRun.AddCarriageReturn();

                        }
                    }
                }
            }
            else
            {
                string propteryName = "$" + p.Name + "$";//Word模板中设定的需要替换的标签
                if (value == null)
                {
                    value = "";
                }
                if (paratext.Contains(propteryName))
                {
                    //防止段落中出现多次字段
                    do
                    {
                        para.ReplaceText(propteryName, value.ToString());
                        paratext = para.ParagraphText;
                    } while (paratext.Contains(propteryName));
                }
            }

        }
    }

    /// <summary>
    /// word模板内容替换
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="etity">实体数据</param>
    /// <param name="para">段落</param>
    private static void ReplaceKeyS(List<ActivityViewModel> list, XWPFTable table)
    {
        var newlist = list.GroupBy(c => c.ActivityType).ToList();
        var isfirst = true;
        var xuhao = 1;
        var colorstyle = true;
        foreach (var lists in newlist)
        {
            if (isfirst)
            {
                isfirst = false;
            }
            else
            {
                CT_Row nrtb = new CT_Row();
                XWPFTableRow mrtb = new XWPFTableRow(nrtb, table);//创建行 
                table.AddRow(mrtb);//将行添加到table中 

                var c1tb = mrtb.CreateCell();//创建单元格
                var cttb = c1tb.GetCTTc();
                var cptb = cttb.AddNewTcPr();
                cptb.gridSpan = new CT_DecimalNumber();
                cptb.gridSpan.val = "4"; //合并列  
                cptb.AddNewVAlign().val = ST_VerticalJc.center;
                cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;//单元格内容居中显示

                c1tb.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, lists.Key, ParagraphAlignment.CENTER, 24, true, 10));
                //cttb.GetPList()[0].AddNewR().AddNewT().Value = lists.Key;
            }
            if (lists.Count() > 1)
            {
                colorstyle = false;
            }
            foreach (var l in lists)
            {
                CT_Row nritem = new CT_Row();
                XWPFTableRow mritem = new XWPFTableRow(nritem, table);//创建行 
                table.AddRow(mritem);//将行添加到table中 

                XWPFTableCell c1item = mritem.CreateCell();//创建单元格
                CT_Tc ctitem = c1item.GetCTTc();
                CT_TcPr cpitem = ctitem.AddNewTcPr();
                //if (colorstyle)
                //{
                //    c1item.SetColor("33FF66");
                //}
                //第1行
                // cp.AddNewVMerge().val = ST_Merge.restart;//合并行
                cpitem.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ctitem.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
                //ctitem.GetPList()[0].AddNewR().AddNewT().Value = xuhao + "   " + l.ActivityName;

                c1item.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, xuhao + "   " + l.ActivityName, ParagraphAlignment.LEFT, 24, true, 10));
                c1item = mritem.CreateCell();//创建单元格
                ctitem = c1item.GetCTTc();
                cpitem = ctitem.AddNewTcPr();
                //if (colorstyle)
                //{
                //    c1item.SetColor("33FF66");
                //}
                cpitem.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ctitem.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ctitem.GetPList()[0].AddNewR().AddNewT().Value = l.ResAndDeveFee.ToString();
                c1item = mritem.CreateCell();//创建单元格
                ctitem = c1item.GetCTTc();
                cpitem = ctitem.AddNewTcPr();
                //if (colorstyle)
                //{
                //    c1item.SetColor("33FF66");
                //}
                cpitem.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ctitem.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ctitem.GetPList()[0].AddNewR().AddNewT().Value = l.OTimeMaterialCost.ToString();
                c1item = mritem.CreateCell();//创建单元格
                ctitem = c1item.GetCTTc();
                cpitem = ctitem.AddNewTcPr();
                //if (colorstyle)
                //{
                //    c1item.SetColor("33FF66");
                //}
                cpitem.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ctitem.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ctitem.GetPList()[0].AddNewR().AddNewT().Value = l.FillerPurchaseCost.ToString();

                xuhao++;
            }

            if (!colorstyle)
            {
                //临时总结
                var nrT = new CT_Row();
                var mrT = new XWPFTableRow(nrT, table);
                table.AddRow(mrT);

                XWPFTableCell cts = mrT.CreateCell();//创建单元格
                CT_Tc ct1 = cts.GetCTTc();
                CT_TcPr cp1 = ct1.AddNewTcPr();
                cts.SetColor(_xiaojicolor);
                //第1行
                cp1.AddNewVMerge().val = ST_Merge.restart;//合并行
                cp1.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ct1.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
                cts.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, lists.Key + "()", ParagraphAlignment.LEFT, 24, true, 10));
                //ct1.GetPList()[0].AddNewR().AddNewT().Value = lists.Key + "(-x)";
                //2
                cts = mrT.CreateCell();//创建单元格
                ct1 = cts.GetCTTc();
                cp1 = ct1.AddNewTcPr();
                cts.SetColor(_xiaojicolor);
                cp1.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ct1.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ct1.GetPList()[0].AddNewR().AddNewT().Value = lists.Sum(c => c.ResAndDeveFee.GetValueOrDefault(0)).ToString();
                //3
                cts = mrT.CreateCell();//创建单元格
                ct1 = cts.GetCTTc();
                cp1 = ct1.AddNewTcPr();
                cts.SetColor(_xiaojicolor);
                cp1.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ct1.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ct1.GetPList()[0].AddNewR().AddNewT().Value = lists.Sum(c => c.OTimeMaterialCost.GetValueOrDefault(0)).ToString();

                //4
                cts = mrT.CreateCell();//创建单元格
                ct1 = cts.GetCTTc();
                cp1 = ct1.AddNewTcPr();
                cts.SetColor(_xiaojicolor);
                cp1.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                ct1.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ct1.GetPList()[0].AddNewR().AddNewT().Value = lists.Sum(c => c.FillerPurchaseCost.GetValueOrDefault(0)).ToString();

                //2行,多行合并类似
                nrT = new CT_Row();
                mrT = new XWPFTableRow(nrT, table);
                table.AddRow(mrT);

                cts = mrT.CreateCell();//创建单元格
                ct1 = cts.GetCTTc();
                cp1 = ct1.AddNewTcPr();
                cp1.AddNewVMerge().val = ST_Merge.@continue;//合并行 序号
                cts.SetColor(_xiaojicolor);
                cts = mrT.CreateCell();//创建单元格
                ct1 = cts.GetCTTc();
                cp1 = ct1.AddNewTcPr();
                cts.SetColor(_xiaojicolor);
                cp1.gridSpan = new CT_DecimalNumber();
                cp1.gridSpan.val = "2"; //合并列  
                cp1.AddNewVAlign().val = ST_VerticalJc.center;//
                ct1.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;//单元格内容居中显示
                ct1.GetPList()[0].AddNewR().AddNewT().Value = (lists.Sum(c => c.ResAndDeveFee.GetValueOrDefault(0)) + lists.Sum(c => c.OTimeMaterialCost.GetValueOrDefault(0))).ToString();

                //2-4
                cts = mrT.CreateCell();//创建单元格
                ct1 = cts.GetCTTc();
                cp1 = ct1.AddNewTcPr();
                cts.SetColor(_xiaojicolor);
                cp1.AddNewVAlign().val = ST_VerticalJc.center;//
                ct1.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                ct1.GetPList()[0].AddNewR().AddNewT().Value = lists.Sum(c => c.FillerPurchaseCost.GetValueOrDefault(0)).ToString();

            }

        }

        #region 总计
        CT_Row nr = new CT_Row();
        XWPFTableRow mr = new XWPFTableRow(nr, table);//创建行 
        table.AddRow(mr);//将行添加到table中 

        XWPFTableCell c1 = mr.CreateCell();//创建单元格
        CT_Tc ct = c1.GetCTTc();
        CT_TcPr cp = ct.AddNewTcPr();
        c1.SetColor(_zongjicolor);
        //第1行
        // cp.AddNewVMerge().val = ST_Merge.restart;//合并行
        cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
        ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
        ct.GetPList()[0].AddNewR().AddNewT().Value = "小计(" + String.Join("+", list.Select(c => c.ActivityType).Distinct()) + ")";

        c1 = mr.CreateCell();//创建单元格
        ct = c1.GetCTTc();
        cp = ct.AddNewTcPr();
        c1.SetColor(_zongjicolor);
        cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
        ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
        ct.GetPList()[0].AddNewR().AddNewT().Value = list.Sum(c => c.ResAndDeveFee.GetValueOrDefault(0)).ToString();

        c1 = mr.CreateCell();//创建单元格
        ct = c1.GetCTTc();
        cp = ct.AddNewTcPr();
        c1.SetColor(_zongjicolor);
        cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
        ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
        ct.GetPList()[0].AddNewR().AddNewT().Value = list.Sum(c => c.OTimeMaterialCost.GetValueOrDefault(0)).ToString();

        c1 = mr.CreateCell();//创建单元格
        ct = c1.GetCTTc();
        cp = ct.AddNewTcPr();
        c1.SetColor(_zongjicolor);
        cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
        ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
        ct.GetPList()[0].AddNewR().AddNewT().Value = list.Sum(c => c.FillerPurchaseCost.GetValueOrDefault(0)).ToString();

        //第2行
        nr = new CT_Row();
        mr = new XWPFTableRow(nr, table);//创建行 
        table.AddRow(mr);//将行添加到table中

        c1 = mr.CreateCell();//创建单元格
        ct = c1.GetCTTc();
        cp = ct.AddNewTcPr();
        c1.SetColor(_zongjicolor);

        // cp.AddNewVMerge().val = ST_Merge.restart;//合并行
        cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
        ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
        ct.GetPList()[0].AddNewR().AddNewT().Value = "总计(可选项未计入)";
        c1 = mr.CreateCell();//创建单元格
        ct = c1.GetCTTc();
        cp = ct.AddNewTcPr();
        c1.SetColor(_zongjicolor);

        cp.gridSpan = new CT_DecimalNumber();
        cp.gridSpan.val = "2"; //合并列  
        cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
        ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
        ct.GetPList()[0].AddNewR().AddNewT().Value = (list.Sum(c => c.OTimeMaterialCost.GetValueOrDefault(0)) + list.Sum(c => c.ResAndDeveFee.GetValueOrDefault(0))).ToString();

        c1 = mr.CreateCell();//创建单元格
        ct = c1.GetCTTc();
        cp = ct.AddNewTcPr();
        c1.SetColor(_zongjicolor);
        cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
        ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
        ct.GetPList()[0].AddNewR().AddNewT().Value = list.Sum(c => c.FillerPurchaseCost.GetValueOrDefault(0)).ToString();
        #endregion
    }

    /// <summary>
    /// word模板内容替换为表格
    /// </summary>
    /// <param name="para"></param>
    /// <param name="list"></param>
    private static void ReplaceTable(List<ActivityViewModel> list, XWPFTable table)
    {
        var newlist = list.GroupBy(c => c.ActivityType).ToList();
        var xuhao = 1;
        var isFirst = true;
        foreach (var lists in newlist)
        {
            var sublis = lists.Where(a => a.SubActivities != null && a.SubActivities.Count > 0).ToList();

            if (sublis == null || sublis.Count <= 0)
                continue;
            if (isFirst)
            {
                isFirst = false;
            }
            else
            {
                CT_Row nrtbstar = new CT_Row();
                XWPFTableRow mrtbstar = new XWPFTableRow(nrtbstar, table);//创建行 
                table.AddRow(mrtbstar);//将行添加到table中

                var c1tbstar = mrtbstar.CreateCell();//创建单元格
                var cttbstar = c1tbstar.GetCTTc();
                var cptbstar = cttbstar.AddNewTcPr();
                cptbstar.gridSpan = new CT_DecimalNumber();
                cptbstar.gridSpan.val = "6"; //合并列  
                cptbstar.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                cttbstar.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                c1tbstar.SetBorderLeft(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                c1tbstar.SetBorderTop(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                c1tbstar.SetBorderBottom(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                c1tbstar.SetBorderRight(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                c1tbstar.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, lists.Key + ":", ParagraphAlignment.CENTER, 24, true, 14));

                nrtbstar = new CT_Row();
                mrtbstar = new XWPFTableRow(nrtbstar, table);//创建行 
                table.AddRow(mrtbstar);//将行添加到table中

                c1tbstar = mrtbstar.CreateCell();//创建单元格
                cttbstar = c1tbstar.GetCTTc();
                cptbstar = cttbstar.AddNewTcPr();
                xuhao++;
                cptbstar.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                cttbstar.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                c1tbstar.SetColor(_toubucolor);
                c1tbstar.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, "研究内容 " + xuhao, ParagraphAlignment.CENTER, 24, true, 10));
                //cttbstar.GetPList()[0].AddNewR().AddNewT().Value = "研究内容 " + xuhao;

                c1tbstar = mrtbstar.CreateCell();//创建单元格
                cttbstar = c1tbstar.GetCTTc();
                cptbstar = cttbstar.AddNewTcPr();

                cptbstar.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                cttbstar.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                c1tbstar.SetColor(_toubucolor);
                c1tbstar.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, " ", ParagraphAlignment.CENTER, 24, true, 10));
                //cttbstar.GetPList()[0].AddNewR().AddNewT().Value = " ";

                c1tbstar = mrtbstar.CreateCell();//创建单元格
                cttbstar = c1tbstar.GetCTTc();
                cptbstar = cttbstar.AddNewTcPr();

                cptbstar.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                cttbstar.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                c1tbstar.SetColor(_toubucolor);
                c1tbstar.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, "工作内容描述 ", ParagraphAlignment.CENTER, 24, true, 10));
                //cttbstar.GetPList()[0].AddNewR().AddNewT().Value = "工作内容描述 ";

                c1tbstar = mrtbstar.CreateCell();//创建单元格
                cttbstar = c1tbstar.GetCTTc();
                cptbstar = cttbstar.AddNewTcPr();

                cptbstar.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                cttbstar.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                c1tbstar.SetColor(_toubucolor);
                c1tbstar.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, "阶段验收资料 ", ParagraphAlignment.CENTER, 24, true, 10));
                //cttbstar.GetPList()[0].AddNewR().AddNewT().Value = "阶段验收资料 ";

                c1tbstar = mrtbstar.CreateCell();//创建单元格
                cttbstar = c1tbstar.GetCTTc();
                cptbstar = cttbstar.AddNewTcPr();

                cptbstar.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                cttbstar.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                c1tbstar.SetColor(_toubucolor);
                c1tbstar.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, "预计开发时间(月) ", ParagraphAlignment.CENTER, 24, true, 10));
                //cttbstar.GetPList()[0].AddNewR().AddNewT().Value = "预计开发时间(月) ";

                c1tbstar = mrtbstar.CreateCell();//创建单元格
                cttbstar = c1tbstar.GetCTTc();
                cptbstar = cttbstar.AddNewTcPr();

                cptbstar.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                cttbstar.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                c1tbstar.SetColor(_toubucolor);
                c1tbstar.SetParagraph(SetTableParagraphInstanceSetting(table.Body.GetXWPFDocument(), table, "合同金额(万元人民币 / 不含税) ", ParagraphAlignment.CENTER, 24, true, 10));
                //cttbstar.GetPList()[0].AddNewR().AddNewT().Value = "合同金额(万元人民币 / 不含税) ";

            }

            foreach (var sub in lists)
            {
                if (sub.SubActivities == null || sub.SubActivities.Count == 0)
                {
                    continue;
                }
                var count = 1;
                var isSubFirst = true;


                foreach (var subdetail in sub.SubActivities)
                {
                    CT_Row nrtb = new CT_Row();
                    XWPFTableRow mrtb = new XWPFTableRow(nrtb, table);//创建行 
                    table.AddRow(mrtb);//将行添加到table中
                    var c1tb = mrtb.CreateCell();//创建单元格
                    var cttb = c1tb.GetCTTc();
                    var cptb = cttb.AddNewTcPr();

                    if (isSubFirst)
                    {
                        isSubFirst = false;
                        cptb.AddNewVMerge().val = ST_Merge.restart;//合并行
                        cptb.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                        cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                        cttb.GetPList()[0].AddNewR().AddNewT().Value = sub.ActivityName == null ? string.Empty : sub.ActivityName;
                    }
                    else
                    {
                        cptb.AddNewVMerge().val = ST_Merge.@continue;//合并行 序号
                    }

                    #region 绘制表格
                    c1tb = mrtb.CreateCell();//创建单元格
                    cttb = c1tb.GetCTTc();
                    cptb = cttb.AddNewTcPr();
                    //cptb.gridSpan = new CT_DecimalNumber();
                    //cptb.gridSpan.val = "6"; //合并列  

                    cptb.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                    cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
                    cttb.GetPList()[0].AddNewR().AddNewT().Value = count + ".  " + (subdetail.SubActivityName == null ? string.Empty : subdetail.SubActivityName);
                    c1tb = mrtb.CreateCell();//创建单元格
                    cttb = c1tb.GetCTTc();
                    cptb = cttb.AddNewTcPr();
                    //cptb.gridSpan = new CT_DecimalNumber();
                    //cptb.gridSpan.val = "6"; //合并列  

                    cptb.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                    cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
                    cttb.GetPList()[0].AddNewR().AddNewT().Value = subdetail.SubActivityDes == null ? string.Empty : subdetail.SubActivityDes;

                    c1tb = mrtb.CreateCell();//创建单元格
                    cttb = c1tb.GetCTTc();
                    cptb = cttb.AddNewTcPr();
                    //cptb.gridSpan = new CT_DecimalNumber();
                    //cptb.gridSpan.val = "6"; //合并列  

                    cptb.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                    cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                    cttb.GetPList()[0].AddNewR().AddNewT().Value = subdetail.SubActivityData == null ? string.Empty : subdetail.SubActivityData;

                    c1tb = mrtb.CreateCell();//创建单元格
                    cttb = c1tb.GetCTTc();
                    cptb = cttb.AddNewTcPr();
                    //cptb.gridSpan = new CT_DecimalNumber();
                    //cptb.gridSpan.val = "6"; //合并列  

                    cptb.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                    cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                    cttb.GetPList()[0].AddNewR().AddNewT().Value = subdetail.SubActivityDevDate == null ? string.Empty : subdetail.SubActivityDevDate;

                    c1tb = mrtb.CreateCell();//创建单元格
                    cttb = c1tb.GetCTTc();
                    cptb = cttb.AddNewTcPr();
                    //cptb.gridSpan = new CT_DecimalNumber();
                    //cptb.gridSpan.val = "6"; //合并列  

                    cptb.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                    cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                    cttb.GetPList()[0].AddNewR().AddNewT().Value = subdetail.SubActivityResAndDeveFee.GetValueOrDefault(0).ToString();
                    #endregion
                    count++;
                }
                if (count > 2)
                {
                    CT_Row nrtb = new CT_Row();
                    XWPFTableRow mrtb = new XWPFTableRow(nrtb, table);//创建行 
                    table.AddRow(mrtb);//将行添加到table中
                    var c1tb = mrtb.CreateCell();//创建单元格
                    var cttb = c1tb.GetCTTc();
                    var cptb = cttb.AddNewTcPr();
                    cptb.AddNewVMerge().val = ST_Merge.@continue;//合并行 序号

                    c1tb = mrtb.CreateCell();//创建单元格
                    cttb = c1tb.GetCTTc();
                    cptb = cttb.AddNewTcPr();
                    cptb.gridSpan = new CT_DecimalNumber();
                    cptb.gridSpan.val = "4"; //合并列  

                    c1tb.SetColor(_xiaojicolor);
                    cptb.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                    cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                    cttb.GetPList()[0].AddNewR().AddNewT().Value = "小计";


                    c1tb = mrtb.CreateCell();//创建单元格
                    cttb = c1tb.GetCTTc();
                    cptb = cttb.AddNewTcPr();
                    c1tb.SetColor(_xiaojicolor);

                    cptb.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                    cttb.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                    if (sub != null && sub.SubActivities != null && sub.SubActivities.Count > 0)
                    {
                        cttb.GetPList()[0].AddNewR().AddNewT().Value = sub.SubActivities.Sum(c => c.SubActivityResAndDeveFee.GetValueOrDefault(0)).ToString();
                    }
                    else
                    {
                        cttb.GetPList()[0].AddNewR().AddNewT().Value = "0";
                    }


                }

                CT_Row nrtbend = new CT_Row();
                XWPFTableRow mrtbend = new XWPFTableRow(nrtbend, table);//创建行 
                table.AddRow(mrtbend);//将行添加到table中
                var c1tbend = mrtbend.CreateCell();//创建单元格
                var cttbend = c1tbend.GetCTTc();
                var cptbend = cttbend.AddNewTcPr();

                cptbend.gridSpan = new CT_DecimalNumber();
                cptbend.gridSpan.val = "6"; //合并列  
                cptbend.AddNewVAlign().val = ST_VerticalJc.center;//垂直
                cttbend.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
                c1tbend.SetBorderLeft(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                c1tbend.SetBorderRight(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                c1tbend.SetBorderTop(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
                c1tbend.SetBorderBottom(XWPFTable.XWPFBorderType.NIL, 0, 0, "");


            }
            CT_Row nrtbeend = new CT_Row();
            XWPFTableRow mrtbeend = new XWPFTableRow(nrtbeend, table);//创建行 
            table.AddRow(mrtbeend);//将行添加到table中
            var c1tbeend = mrtbeend.CreateCell();//创建单元格
            var cttbeend = c1tbeend.GetCTTc();
            var cptbeend = cttbeend.AddNewTcPr();

            cptbeend.gridSpan = new CT_DecimalNumber();
            cptbeend.gridSpan.val = "6"; //合并列  
            cptbeend.AddNewVAlign().val = ST_VerticalJc.center;//垂直
            cttbeend.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
            c1tbeend.SetBorderLeft(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
            c1tbeend.SetBorderRight(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
            c1tbeend.SetBorderTop(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
            c1tbeend.SetBorderBottom(XWPFTable.XWPFBorderType.NIL, 0, 0, "");

        }

    }

NPOIHellper public XWPFParagraph ParagraphInsertImg(XWPFDocument document) { XWPFParagraph paragraph = document.CreateParagraph();//创建段落对象 paragraph.Alignment = ParagraphAlignment.CENTER;

        XWPFRun xwpfRun = paragraph.CreateRun();//创建段落文本对象
                                                //标题图片
        FileStream gfs = new FileStream(@"D:\MyCode\Words\Files\1.png", FileMode.Open, FileAccess.Read);
        xwpfRun.AddPicture(gfs, (int)PictureType.PNG, "1.png", (int)(330 * 9525), (int)(100 * 9525));
        gfs.Close();
        return paragraph;
    }
    /// <summary>
    /// 创建word文档中的段落对象和设置段落文本的基本样式(字体大小,字体,字体颜色,字体对齐位置)
    /// </summary>
    /// <param name="document">document文档对象</param>
    /// <param name="fillContent">段落第一个文本对象填充的内容</param>
    /// <param name="isBold">是否加粗</param>
    /// <param name="fontSize">字体大小</param>
    /// <param name="fontFamily">字体</param>
    /// <param name="paragraphAlign">段落排列(左对齐,居中,右对齐)</param>
    /// <param name="isStatement">是否在同一段落创建第二个文本对象(解决同一段落里面需要填充两个或者多个文本值的情况,多个文本需要自己拓展,现在最多支持两个)</param>
    /// <param name="secondFillContent">第二次声明的文本对象填充的内容,样式与第一次的一致</param>
    /// <param name="fontColor">字体颜色--十六进制</param>
    /// <param name="isItalic">是否设置斜体(字体倾斜)</param>
    /// <returns></returns>
    public XWPFParagraph ParagraphInstanceSetting(XWPFDocument document, string fillContent, bool isBold, double fontSize, string fontFamily, ParagraphAlignment paragraphAlign, bool isStatement = false, string secondFillContent = "", string fontColor = "000000", bool isItalic = false, bool isXiahuaxian = false)
    {
        XWPFParagraph paragraph = document.CreateParagraph();//创建段落对象
        paragraph.Alignment = paragraphAlign;//文字显示位置,段落排列(左对齐,居中,右对齐)


        XWPFRun xwpfRun = paragraph.CreateRun();//创建段落文本对象
        xwpfRun.IsBold = isBold;//文字加粗
        xwpfRun.SetText(fillContent);//填充内容
        xwpfRun.FontSize = fontSize;//设置文字大小
        xwpfRun.IsItalic = isItalic;//是否设置斜体(字体倾斜)
        xwpfRun.SetColor(fontColor);//设置字体颜色--十六进制
        xwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
        if (isXiahuaxian)
            xwpfRun.SetUnderline(UnderlinePatterns.Thick);//设置下划线,枚举类型
        if (!isStatement) return paragraph;

        XWPFRun secondXwpfRun = paragraph.CreateRun();//创建段落文本对象
        secondXwpfRun.IsBold = !isBold;//文字加粗
        secondXwpfRun.SetText(secondFillContent);//填充内容
        secondXwpfRun.FontSize = fontSize;//设置文字大小
        secondXwpfRun.IsItalic = isItalic;//是否设置斜体(字体倾斜)
        secondXwpfRun.SetColor(fontColor);//设置字体颜色--十六进制
        secondXwpfRun.SetFontFamily(fontFamily, FontCharRange.None); //设置标题样式如:(微软雅黑,隶书,楷体)根据自己的需求而定
        if (isXiahuaxian)
            secondXwpfRun.SetUnderline(UnderlinePatterns.Thick);//设置下划线,枚举类型
        return paragraph;
    }

    /// <summary> 
    /// 创建Word文档中表格段落实例和设置表格段落文本的基本样式(字体大小,字体,字体颜色,字体对齐位置)
    /// </summary> 
    /// <param name="document">document文档对象</param> 
    /// <param name="table">表格对象</param> 
    /// <param name="fillContent">要填充的文字</param> 
    /// <param name="paragraphAlign">段落排列(左对齐,居中,右对齐)</param>
    /// <param name="textPosition">设置文本位置(设置两行之间的行间,从而实现表格文字垂直居中的效果),从而实现table的高度设置效果 </param>
    /// <param name="isBold">是否加粗(true加粗,false不加粗)</param>
    /// <param name="fontSize">字体大小</param>
    /// <param name="fontColor">字体颜色--十六进制</param>
    /// <param name="isItalic">是否设置斜体(字体倾斜)</param>
    /// <returns></returns> 
    public XWPFParagraph SetTableParagraphInstanceSetting(XWPFDocument document, XWPFTable table, string fillContent, ParagraphAlignment paragraphAlign, int textPosition = 24, bool isBold = false, double fontSize = 10, string fontColor = "000000", bool isItalic = false)
    {
        var para = new CT_P();
        //设置单元格文本对齐
        para.AddNewPPr().AddNewTextAlignment();

        XWPFParagraph paragraph = new XWPFParagraph(para, table.Body);//创建表格中的段落对象
        paragraph.Alignment = paragraphAlign;//文字显示位置,段落排列(左对齐,居中,右对齐)
                                             //paragraph.FontAlignment =Convert.ToInt32(ParagraphAlignment.CENTER);//字体在单元格内显示位置与 paragraph.Alignment效果相似

        XWPFRun xwpfRun = paragraph.CreateRun();//创建段落文本对象
        xwpfRun.SetText(fillContent);
        xwpfRun.FontSize = fontSize;//字体大小
        xwpfRun.SetColor(fontColor);//设置字体颜色--十六进制
        xwpfRun.IsItalic = isItalic;//是否设置斜体(字体倾斜)
        xwpfRun.IsBold = isBold;//是否加粗
        xwpfRun.SetFontFamily("宋体", FontCharRange.None);//设置字体(如:微软雅黑,华文楷体,宋体)
        return paragraph;
    }