使用NPOI导出复杂Word详解——C#篇

首先导入Nuget包NPOI;


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

ps:第一次写,请见谅。本文需要有一定代码基础才能观看,如有不懂,可以提问。其中包含NPOI生成word,根据word模板填充数据,生成复杂的word 表格以及对word 中段落的样式修改

1.使用NPOI生成word

public void main(){
//里面使用的方法都在下面
 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, fal
  • 4
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值