• C#、NPOI生成Word文档(模板)(转载)


    转载地址:https://blog.csdn.net/Asif_LQ/article/details/81389844?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

    项目需要集成word导出,做的时候网上文档资源不是很多,也比较杂乱,所以查了查,整理了整理,做个记录,也顺便把NPOI操作Word文档的一些基本操作分享给有需要的朋友。
    本篇包括生成Word对word文本的操作,表格的操作,以及图片的操作,都为生成word基础的一些操作。

    以下只是我的个人理解所得,大家有什么更好的想法欢迎补充。

    VS2017、右键解决方案,管理NuGet程序包,搜索并为项目安装NPOI程序包,并引用:
    using NPOI.XWPF.UserModel;
    本编使用NPOI版本为2.3.0
    下面进入正题··
    一、 获取模板(XWPFDocument doc)
    使用模板,首先获取模板,然后把获取的模板实例化为NPOI的文档对象进行编辑操作:
    using (FileStream stream = File.OpenRead(“模板文件地址”)){
    XWPFDocument doc = new XWPFDocument(stream);
    //处理doc,代码控制编辑文档。
    }
    处理doc后,生成新的文件,写入doc ,生成word完成。
    FileStream file = new FileStream(生成文件路径+文件名, FileMode.Create, FileAccess.Write);
    doc.Write(file);
    file.Close();
    doc就是我们获取到的模板的所有内容。
    还有一点本编使用模板均为docx后缀文件,doc修改docx读取报错,需要另存为doxc文档。
    二、 文本处理(XWPFParagraph para)
    doc.Paragraphs 获取到文档里的所有的段落对象;
    para.ParagraphText 获取段落的文本数据;
    para.ReplaceText(要被替换的文本,替换文本) 替换段落的文本(模板能实现的关键)

    XWPFParagraph的官方参考文档

    三、 表格处理(XWPFTable table)
    doc.Tables 获取文档里的所有的表格对象;
    这里有必要多一嘴,doc.Tables获取的只是Word中最外层的表格,不包含嵌套内层的。
    获取嵌套单元格可使用cell.Tables;
    (一) 表格行处理(XWPFTableRow row)
    row.Rows 获取表格所有行;
    (二) 表格单元格处理(XWPFTableCell cell)
    row.GetTableICells() ;获取表格行的所有单元格;
    获取到单元格之后就可以获取单元格里的文本段落(Paragraphs)并且进行文本替换
    (三) 水平合并行单元格

    CT_Tc cttcofRowThird = cell.GetCTTc();
    CT_TcPr ctProfRowThird = cttcofRowThird.AddNewTcPr();
    ctProfRowThird.gridSpan = new CT_DecimalNumber();
    ctProfRowThird.gridSpan.val = num.ToString();//合并num列

    (四) 垂直合并列单元格

    List<XWPFTableRow> rows所有要合并的行的XWPFTableRow对象集合。

    XWPFTableCell cellFirstofThird = 第一行要合并的单元格对象;
    CT_Tc cttcFirstofThird = cellFirstofThird.GetCTTc();
    CT_TcPr ctPrFirstofThird = cttcFirstofThird.AddNewTcPr();
    ctPrFirstofThird.AddNewVMerge().val = ST_Merge.restart;//开始合并行
    ctPrFirstofThird.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    cttcFirstofThird.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
    for (int i = 1; i < rows.Count; i++)
    {
    XWPFTableCell cellfirstofRow = 第i行要合并的单元格对象;
    CT_Tc cttcfirstofRow = cellfirstofRow.GetCTTc();
    CT_TcPr ctPrfirstofRow = cttcfirstofRow.AddNewTcPr();
    ctPrfirstofRow.AddNewVMerge().val = ST_Merge.@continue;//继续合并行
    ctPrfirstofRow.AddNewVAlign().val = ST_VerticalJc.center;//垂直
    }
    四、 图片处理
    2.3.0版本的NPOI的图片插入没有集成xml文件的修改所以需要手写代码编入。

    using (FileStream fsImg = new FileStream(图片路径, FileMode.Open, FileAccess.Read, FileShare.None))
    {
    var picID = doc.AddPictureData(fsImg, (int)NPOI.XWPF.UserModel.PictureType.JPEG);
    string picXml = ""
    + " <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">"
    + " <pic:nvPicPr>" + " <pic:cNvPr id=""
    + "0"
    + "" name="Generated"/>"
    + " <pic:cNvPicPr/>"
    + " </pic:nvPicPr>"
    + " <pic:blipFill>"
    + " <a:blip r:embed=""
    + id
    + "" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>"
    + " <a:stretch>"
    + " <a:fillRect/>"
    + " </a:stretch>"
    + " </pic:blipFill>"
    + " <pic:spPr>"
    + " <a:xfrm>"
    + " <a:off x="0" y="0"/>"
    + " <a:ext cx=""
    + width
    + "" cy=""
    + height
    + ""/>"
    + " </a:xfrm>"
    + " <a:prstGeom prst="rect">"
    + " <a:avLst/>"
    + " </a:prstGeom>"
    + " </pic:spPr>"
    + " </pic:pic>";
    XWPFParagraph par = cell.AddParagraph();//创建段落对象(可以在doc加也可在cell加)
    par.Alignment = ParagraphAlignment.CENTER;//居中
    XWPFRun run = par.CreateRun();
    CT_Inline inline = run.GetCTR().AddNewDrawing().AddNewInline();
    inline.graphic = new CT_GraphicalObject
    {
    graphicData = new CT_GraphicalObjectData
    {
    uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"
    }
    };
    try
    {
    inline.graphic.graphicData.AddPicElement(picXml);
    }
    catch (XmlException xe)
    {
    throw xe;
    }
    NPOI.OpenXmlFormats.Dml.WordProcessing.CT_PositiveSize2D extent = inline.AddNewExtent();
    extent.cx = width;
    extent.cy = height;
    NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualDrawingProps docPr = inline.AddNewDocPr();
    docPr.id = 1;
    docPr.name = "Image" + id;
    }
    五、页眉页脚处理
    这部分也是在网路各个大神那里参考搬来的,有些许改动并添加了对齐方式,谨慎参考,积极批评。

    doc.Document.body.sectPr = new CT_SectPr();
    CT_SectPr m_SectPr = doc.Document.body.sectPr;
    //创建页眉
    CT_Hdr m_Hdr = new CT_Hdr();
    CT_P m_P = m_Hdr.AddNewP();
    m_P.AddNewR().AddNewT().Value ="页眉内容值";
    m_P.AddNewPPr().AddNewJc().val = ST_Jc.center;// 页眉居中
    //创建页眉关系(headern.xml)
    XWPFRelation Hrelation = XWPFRelation.HEADER;
    XWPFHeader m_h = (XWPFHeader)doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(), doc.HeaderList.Count + 1);
    doc.CreateFootnotes();
    //设置页眉
    m_h.SetHeaderFooter(m_Hdr);
    CT_HdrFtrRef m_HdrFtr = m_SectPr.AddNewHeaderReference();
    m_HdrFtr.type = ST_HdrFtr.@default;
    m_HdrFtr.id = m_h.GetPackageRelationship().Id;
    //创建页脚
    CT_Ftr m_ftr = new CT_Ftr();
    CT_P m_fP = m_ftr.AddNewP();
    m_fP.AddNewR().AddNewT().Value = "页脚内容值";
    m_fP.AddNewPPr().AddNewJc().val = ST_Jc.center;// 页眉居中
    //创建页脚关系(footern.xml)
    XWPFRelation Frelation = XWPFRelation.FOOTER;
    XWPFFooter m_f = (XWPFFooter)doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), doc.FooterList.Count + 1);
    //设置页脚
    m_f.SetHeaderFooter(m_ftr);
    m_HdrFtr = m_SectPr.AddNewFooterReference();
    m_HdrFtr.type = ST_HdrFtr.@default;
    m_HdrFtr.id = m_f.GetPackageRelationship().Id;

    六、创建word文件,将doc内容写入文档,导出完成。

    FileStream file = new FileStream(savePath, FileMode.Create, FileAccess.Write);
    doc.Write(file);
    file.Close();
    ————————————————
    版权声明:本文为CSDN博主「Asif_LQ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Asif_LQ/article/details/81389844

  • 相关阅读:
    Unique Binary Search Trees(dp)
    Binary Tree Inorder Traversal
    Reverse Linked List II
    O​r​a​c​l​e​1​1​g​自​带​的​S​Q​L​ ​d​e​v​e​l​o​p​e​r​无​法​打​开​解​决​
    英语飙升的好方法
    MyEclipse加入jquery.js文件missing semicolon的错误
    js,jq获取手机屏幕分辨率的宽高
    给标签元素设固定宽高,内部添加滚动条显示
    解决手机端点击input的时候,页面会放大
    支付宝异步回调验证签名
  • 原文地址:https://www.cnblogs.com/shuaiheng/p/13071649.html
Copyright © 2020-2023  润新知