首页 > 编程语言 >C#使用NPOI生成Word文档的方法

C#使用NPOI生成Word文档的方法

时间:2023-03-09 15:33:07浏览次数:38  
标签:Word para C# doc NPOI 获取 var 替换 模板

在此我们介绍以模板方式载入内容导出Word文档

一、获取模板(XWPFDocument doc)
1.首先获取模板,然后把获取的模板实例化为NPOI的文档对象进行操作:

FileStream stream = File.OpenRead("模板文件地址")
//FileStream stream = new FileStream("模板文件地址", FileMode.Open, FileAccess.Read)
XWPFDocument myDoc = new XWPFDocument(stream);

2.处理doc,代码控制编辑文档

                    //遍历段落,替换内容
                    foreach (var para in myDoc.Paragraphs)
                    {
                        //替换文字
                        ExtensionHelper.ExtensionHelper.ReplaceKey(实体对象, para);
//替换图片 if (para.ParagraphText.Contains("QyslPic"))//图片占位符 { para.ReplaceText(para.ParagraphText, string.Empty); XWPFRun newRrun = para.CreateRun(); using (FileStream fsImg = new FileStream("图片地址", FileMode.Open, FileAccess.Read)) { newRrun.AddPicture(fsImg, 11, "图片地址", 520 * 9525, 269 * 9525); } para.Alignment = ParagraphAlignment.CENTER; } } //遍历table,替换单元格内容 foreach (var table in myDoc.Tables) { foreach (var row in table.Rows) { foreach (var cell in row.GetTableCells()) { foreach (var para in cell.Paragraphs) { //替换文字 ExtensionHelper.ExtensionHelper.ReplaceKey(实体对象, para); } } } }

3.处理doc后,生成新的文件,写入doc ,生成word完成。

FileStream file = new FileStream("生成文件新路径+文件名", FileMode.Create, FileAccess.Write);
doc.Write(file);
file.Close();

doc就是我们获取到的模板的所有内容。

4.替换文字方法

        /// <summary>
        /// word模板内容替换
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="etity">实体数据</param>
        /// <param name="para">段落</param>
        public static void ReplaceKey<T>(T etity, XWPFParagraph para)
        {
            Type entityType = typeof(T);
            PropertyInfo[] properties = entityType.GetProperties();            var runs = para.Runs;            string text = "";
            foreach (var run in runs)
            {
                text = run.ToString();
                foreach (var p in properties)
                {
                    string propteryName = p.Name;//Word模板中设定的需要替换的标签
                    object value = p.GetValue(etity);
                    if (value == null)
                    {
                        value = "";
                    }
                    if (text.Contains(propteryName))
                    {
                        text = text.Replace(propteryName, value.ToString());
                    }
                    run.SetText(text);//替换标签文本(重要)
                }
            }
        }

二、文本处理(XWPFParagraph para)
doc.Paragraphs  获取到文档里的所有的段落对象;
para.ParagraphText  获取段落的文本数据;
para.ReplaceText(要被替换的文本,替换文本)  替换段落的文本(模板能实现的关键)

三、表格处理

1. 获取处理(XWPFTable table)
doc.Tables:获取文档里的所有的表格对象,doc.Tables获取的只是Word中最外层的表格,不包含嵌套内层的。获取嵌套单元格可使用cell.Tables;
2. 表格行处理(XWPFTableRow row)
row.Rows:获取表格所有行;
3. 表格单元格处理(XWPFTableCell cell)

 row.GetTableICells():获取表格行的所有单元格;获取到单元格之后就可以获取单元格里的文本段落(Paragraphs)并且进行文本替换

标签:Word,para,C#,doc,NPOI,获取,var,替换,模板
From: https://www.cnblogs.com/panyaoqi/p/17198602.html

相关文章

  • Flutter Scaffold
    ReadaboutFlutterScaffold,itsuses,propertiesandtheimportanceofScaffoldwidgetinFlutterApps.TheScaffoldwidgetisthebaseofthescreenforasin......
  • ORACLE SEQUENCE(队列)用法2
    PS:当需要产生唯一ID的时候,MSSQL只需将ID设置为int类型,并且设置为自增长就能达到.oracle中需要用序列+触发器才可以达到MSSQL中的只增长效果.(俩者还是有区别的.oracl......
  • EasyUI的combotree 默认节点选中呢
    $('#selShenqFuwujg').combotree({url:'../../GetFuwujgInfo.aspx?type=GetFuwujgTree&PID=',onLoadSuccess:function(node,data){......
  • mvc-学习javaweb项目一后部分知识总结
    资料来源于:B站尚硅谷JavaWeb教程(全新技术栈,全程实战),本人才疏学浅,记录笔记以供日后回顾总体内容是P39-P45,这边只放了一个链接。视频链接知识点总述1.最初的做法......
  • mysql的一些配置解决 Lock wait timeout exceeded; try restarting transaction
    innodb_rollback_on_timeout:默认是off,当为off时,事务如果超时,只会回滚最后条sql 当为on时会回滚事务的所有sqlinnodb_lock_wait_timeout:事务超时时间默认是50s,可以改......
  • CS144 LAB5~LAB6
    CS144lab5~6最后两个lab了,虽然很多大佬都说剩下的两个lab比起TCP的实现,“简直太简单了”,但是我认为做这两个之前需要补充一些额外的网络知识,不然直接上手去做的话,难度也......
  • ABC292F题解
    首先先钦定\(a\leb\),否则交换一下就行。方法1:二分答案。容易发现,答案至少为\(a\),并且用左下角为一个顶点一定不会更劣,并且另外两个点一定都在线段上(否则可以调整)。我们......
  • run bat in child process java
    voidrunBatch(){ProcessBuilderprocessBuilder=newProcessBuilder();//RunthisonWindows,cmd,/c=terminateafterthisrun......
  • JavaScrip快速入门
    一概述JavaScript是一个古老的语言,它几乎是互联网前端唯一的选择,我们不得不学习并掌握它。JavaScript是当前应用最广泛的脚本语言,用来在网页中实现交互效果。JavaScrip......
  • Node.js安装成功了,但cmd找不到node是怎么回事?
    这样的情况一般是由于没有安装在C盘的默认路径下导致的。比如选择下载到了D盘后者其他盘,在cmd中输入node-v显示 ‘node’不是内部或外部命令,也不是可运行的程序或......