C# 利用Spire实现对Word模板的指定文字替换(文字、图片、表格)
【摘要】 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)