利用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....");            
        }
相关文章
搜索和替换PPT里面指定字体文字的(某些字体无法随演示文稿一起保存)解决方案
搜索和替换PPT里面指定字体文字的(某些字体无法随演示文稿一起保存)解决方案
178 0
poi往word单元格插入图片,支持本地图片和网络图片
最近word导出时需要导出图片,在网上翻了会就发现了好心人分享的代码,但是只支持本地文件读取,我们项目需要从其他服务器获取图片,那肯定得使用网络方式了,于是在源代码上进行了完善,可接收本地和网络两种url方式。
599 1
将excel文件中的内容转换成word文本(去表格)
将excel文件中的内容转换成word文本(去表格)
552 0
将excel文件中的内容转换成word文本(去表格)
Markdown (CSDN) MD编辑器(四)- 漂亮表格(表格背景色、跨行、跨列、多行)
Markdown (CSDN) MD编辑器(四)- 漂亮表格(表格背景色、跨行、跨列、多行)
2330 0
Markdown (CSDN) MD编辑器(四)- 漂亮表格(表格背景色、跨行、跨列、多行)
利用Spire实现对Word模板的指定文字替换(文字、图片、表格)
利用Spire实现对Word模板的指定文字替换(文字、图片、表格)
237 0
成功解决在word文件的表格中当输文字时自动出现加红色和下划线
成功解决在word文件的表格中当输文字时自动出现加红色和下划线
成功解决在word文件的表格中当输文字时自动出现加红色和下划线