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

举报
清雨小竹 发表于 2022/09/23 16:18:31 2022/09/23
【摘要】 C#利用Spire.Office对word模板文件进行操作,把模板里指定标记替换为想要的文字、图片、表格。经常用在通过程序自动生成有格式要求的标书、合同等场景。1.安装Spire.Officeword文件内对要替换的地方用   [=xxx] 做标记2.WordUtil.cs工具库using Spire.DataExport.XLS;using Spire.Doc;using Spire.Do...

C#利用Spire.Office对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....");            
        }

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。