利用Spire实现对Word模板的指定文字替换(文字、图片、表格)

简介: 利用Spire实现对Word模板的指定文字替换(文字、图片、表格)

1.安装Spire.Office

word文件内对要替换的地方用   [=xxx] 做标记

2.WordUtil.cs

using Spire.DataExport.XLS;
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using Spire.Doc.Formatting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace zzzili
{    
    public class WordUtil
    {
        /// <summary>
        /// 定义word文档宽高
        /// </summary>
        private static float s_Page_Width = 500f;
        private static float s_Page_Height = 680f;
        /// <summary>
        /// Word 模板 替换
        /// <para>当前适用的字段模板形如:[=Name],其中 Name 就是字段名</para>
        /// <para>返回 true 表示成功</para>
        /// </summary>
        /// <param name="tempPath">Word 文件 模板路径</param>
        /// <param name="newWordPath">生成的新 Word 文件的路径</param>
        /// <param name="textDic">文字字典集合</param>
        /// <returns></returns>
        public static bool WordTemplateReplace(string tempPath, string newWordPath,
            WordReplace replace)
        {
                var doc = new Document(tempPath);  // 加载 Word 模板文件
                #region 字段替换文字
                var textreplacelist = replace.nodeList.Where(u=>u.type==WordReplace.EnumType.Text);
                foreach (var node in textreplacelist)
                {
                        if (string.IsNullOrWhiteSpace(node.key))
                            continue;
                        if (string.IsNullOrWhiteSpace(node.value))
                            node.value = "";
                        doc.Replace(string.Format("[={0}]",node.key), node.value,true,true);  // 替换段落中的文字
                }
                #endregion
                #region 字段替换为图片
                var imgreplacelist = replace.nodeList.Where(u => u.type == WordReplace.EnumType.Img);
                foreach (var node in imgreplacelist)
                {
                    if (string.IsNullOrWhiteSpace(node.key))
                        continue;
                    // 查找文档中的指定文本内容
                    TextSelection[] selections = doc.FindAllString(string.Format("[={0}]", node.key), true, true);
                    int index = 0;
                    TextRange range = null;
                    //遍历文档,移除文本内容,插入图片
                    foreach (TextSelection selection in selections)
                    {
                        DocPicture pic = new DocPicture(doc);
                        pic.LoadImage(node.value);
                        if (node.fixedType == WordReplace.EnumImgFixedType.FixedWidth)
                        {
                            //定宽
                            pic.Height = (s_Page_Width * pic.Height) / pic.Width;
                            pic.Width = s_Page_Width;
                        }
                        else
                        {
                            //定高
                            pic.Width = (s_Page_Height * pic.Width) / pic.Height;
                            pic.Height = s_Page_Height;
                        }
                        range = selection.GetAsOneRange();
                        index = range.OwnerParagraph.ChildObjects.IndexOf(range);
                        range.OwnerParagraph.ChildObjects.Insert(index, pic);
                        range.OwnerParagraph.ChildObjects.Remove(range);
                    }
                }
                #endregion
                #region 字段替换为Table
                var tablereplacelist = replace.nodeList.Where(u => u.type == WordReplace.EnumType.Table);
                foreach (var node in tablereplacelist)
                {
                    if (string.IsNullOrWhiteSpace(node.key))
                        continue;
                    ///组建表格
                    float cellWidth = s_Page_Width / node.table.rows[0].Count;
                    Table tb = doc.Sections[0].AddTable(true);
                    bool isHeader = true;
                    foreach (var row in node.table.rows)
                    {
                        var r = tb.AddRow(false,false);
                        foreach (var col in row)
                        {
                            var c = r.AddCell();
                            c.SetCellWidth(cellWidth, CellWidthType.Point);
                            TextRange textRange = c.AddParagraph().AppendText(col);
                            textRange.CharacterFormat.FontSize = 11;
                            textRange.CharacterFormat.FontName = "宋体";
                            if (isHeader == true)
                            {
                                textRange.CharacterFormat.Bold = true;//第一行字体加粗
                            }                            
                        }
                        isHeader = false;
                    }                    
                    //查找关键字符串文本
                    TextSelection[] selections = doc.FindAllString(string.Format("[={0}]", node.key), true, true);
                    foreach (var selection in selections)
                    {
                        //获取关键字符串所在段落的索引
                        TextRange range = selection.GetAsOneRange();
                        Paragraph paragraph = range.OwnerParagraph;
                        Body body = paragraph.OwnerTextBody;
                        int index = body.ChildObjects.IndexOf(paragraph);
                        //移除段落,插入表格 
                        body.ChildObjects.Remove(paragraph);
                        body.ChildObjects.Insert(index, tb);
                    }
                }
                #endregion
                doc.SaveToFile(newWordPath);
                return true;            
        }
        /// <summary>
        /// excel转为图片
        /// </summary>
        /// <param name="excelPath"></param>
        /// <param name="imgPath"></param>
        /// <returns></returns>
        public static bool ExcelToImg(string excelPath,string imgPath,int sheetIndex=0)
        {
            Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
            workbook.LoadFromFile(excelPath);
            Spire.Xls.Worksheet sheet = workbook.Worksheets[sheetIndex];
            sheet.SaveToImage(imgPath);
            return true;
        }
    }
}

3.WordReplace.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace zzzili
{
    public class WordReplace
    {
        public enum EnumType
        {
            Text = 1,
            Img = 2,
            Table=3
        }
        public enum EnumImgFixedType
        {
            FixedWidth=11,
            FixedHeight=12
        }
        public class WordReplaceNode
        {
            public string key { set; get; }
            public string value { set; get; }
            public ReplaceTable table { set; get; }
            public EnumType type { set; get; }
            public EnumImgFixedType fixedType { set; get; }
        }
        public class ReplaceTable
        {
            public List<List<string>> rows { set; get; }
            public ReplaceTable()
            {
                rows = new List<List<string>>();
            }
            public void addRow(List<string> row)
            {
                rows.Add(row);
            }
        }
        public List<WordReplaceNode> nodeList = new List<WordReplaceNode>();
        public void add(string _key, string _value)
        {
            var node = new WordReplaceNode();
            node.key = _key;
            node.value = _value;
            node.type = EnumType.Text;
            nodeList.Add(node);
        }
        public void add(string _key, string _value, EnumImgFixedType _fixedType)
        {
            var node = new WordReplaceNode();
            node.key = _key;
            node.value = _value;
            node.type = EnumType.Img;
            node.fixedType = _fixedType;
            nodeList.Add(node);
        }
        public void add(string _key,ReplaceTable _table)
        {
            var node = new WordReplaceNode();
            node.key = _key;
            node.type = EnumType.Table;
            node.table = _table;
            nodeList.Add(node);
        }
    }
}

4.调用示例

        static void Main(string[] args)
        {
            WordReplace replace = new WordReplace();
      //文字替换
            replace.add("test1", "河南省");//标记[=test1]
      //图片替换
      replace.add("img2", "C:\\102619.png", WordReplace.EnumImgFixedType.FixedWidth);//标记[=img2]
      //表格替换
      ReplaceTable tb = new ReplaceTable();
            tb.addRow(new List<string> { "序号","姓名","年龄" });
            tb.addRow(new List<string> { "1","张三","22" });
            tb.addRow(new List<string> { "2","李四","21" });
      replace.add("table3", tb);//标记[=table3]
            string temppath = "C:\\模板.docx";
            string newpath= "C:\\newfile.docx";         
            //word模板文字、图片、表格替换
            WordUtil.WordTemplateReplace(temppath, newpath, replace);
      //excel转图片
        string excelpath = "C:\\my.xlsx";
            string imgpath = "C:\\102619.png";            
            WordUtil.ExcelToImg(excelpath, imgpath);
            Console.WriteLine("ok....");            
        }
相关文章
Word处理控件Spire.Doc常见问题解答
为方便使用者快速掌握和了解Spire.Doc,本文列举了Word处理控件Spire.Doc常见问题及解答欢迎下载体验!
WK
|
机器学习/深度学习 运维 Devops
Python语言在哪些场景下有很明显优势?
Python在多样场景中展现出显著优势,包括:通过强大的库如Pandas、NumPy、Scikit-learn等在数据科学与机器学习中的应用;利用简洁语法和集成能力在自动化运维及DevOps中的作用;借助Django、Flask等框架在网页开发与网络编程方面的表现;凭借快速迭代能力在原型开发中的效率;通过NumPy、SciPy等库在科学研究与工程计算的支持;以及因其易学特性在教育领域的普及。这些特点使Python成为多领域开发的优选语言。
WK
491 5
|
存储 对象存储
【阿里云OSS】You have no right to access this object because of bucket acl.
【阿里云OSS】You have no right to access this object because of bucket acl.
20278 1
【阿里云OSS】You have no right to access this object because of bucket acl.
|
SQL 前端开发 关系型数据库
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略
22068 7
|
机器人 测试技术 C++
ModbusCRC16校验 示例代码
本文提供了ModbusCRC16校验的示例代码,包括计算CRC、添加CRC校验位、删除CRC校验位和比较CRC校验位等四种常用函数的实现,以及一个完整的示例代码。这些代码在Ubuntu20.04环境下经过测试并确认有效。示例代码采用C++编写,展示了如何使用这些函数来处理Modbus通信中的数据校验。
1260 2
|
JavaScript API 开发者
Vue 3 为什么同时需要 Ref 和 Reactive?
Vue 3 为什么同时需要 Ref 和 Reactive?
|
Ubuntu 安全 网络协议
|
运维 监控 数据可视化
高效运维的秘密武器:自动化工具链的构建与实践在当今数字化时代,IT系统的复杂性和规模不断增加,使得传统的手动运维方式难以应对日益增长的业务需求。因此,构建一套高效的自动化工具链成为现代运维的重要任务。本文将深入探讨如何通过自动化工具链提升IT运维效率,确保系统稳定运行,并实现快速响应和故障恢复。
随着企业IT架构的不断扩展和复杂化,传统的手动运维已无法满足业务需求。自动化工具链的构建成为解决这一问题的关键。本文介绍了自动化工具链的核心概念、常用工具及其选择依据,并通过实际案例展示了自动化工具链在提升运维效率、减少人为错误、优化资源配置等方面的显著效果。从监控系统到自动化运维平台,再到持续集成/持续部署(CI/CD)的流程,我们将一步步揭示如何成功实施自动化工具链,助力企业实现高效、稳定、可靠的IT运维管理。
|
关系型数据库 Java 数据库连接
如何利用Mybatis-Plus自动生成代码(超详细注解)
如何利用Mybatis-Plus自动生成代码(超详细注解)
5440 1
|
JavaScript
Vue 父子组件传参、插槽
Vue 父子组件传参、插槽
224 2