这是我的word模板
下面是我的代码
public void Export(string tempFilePath, string outPath, Dictionary<string, string> data)
{
using (FileStream stream = System.IO.File.OpenRead(tempFilePath))
{
XWPFDocument doc = new XWPFDocument(stream);
//遍历段落
foreach (var para in doc.Paragraphs)
{
ReplaceKey(para, data);
}
//遍历表格
foreach (var table in doc.Tables)
{
foreach (var row in table.Rows)
{
foreach (var cell in row.GetTableCells())
{
foreach (var para in cell.Paragraphs)
{
ReplaceKey(para, data);
}
}
}
}
//写文件
FileStream outFile = new FileStream(outPath, FileMode.Create);
doc.Write(outFile);
outFile.Close();
}
}
private static void ReplaceKey(XWPFParagraph para, Dictionary<string, string> data)
{
string text = "";
foreach (var run in para.Runs)
{
text = run.ToString();
foreach (var key in data.Keys)
{
//$$模板中数据占位符为$KEY$
if (text.Contains($"${key}$"))
{
if (key.IndexOf("image") > -1 && !string.IsNullOrEmpty(data[key]))
{
using (FileStream picData = new FileStream(data[key], FileMode.Open, FileAccess.Read))
{
System.Drawing.Image imgPhoto = System.Drawing.Image.FromFile(data[key]);
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
text = text.Replace($"${key}$", "");
if (data[key].Split('.')[1].ToLower() == "jpg")
{
NPOI.XWPF.UserModel.PictureType imgType = NPOI.XWPF.UserModel.PictureType.JPEG;
run.AddPicture(picData, (int)imgType, data[key], sourceWidth1600, sourceHeight1600);
}
if (data[key].Split('.')[1].ToLower() == "png")
{
NPOI.XWPF.UserModel.PictureType imgType = NPOI.XWPF.UserModel.PictureType.PNG;
run.AddPicture(picData, (int)imgType, data[key], sourceWidth * 1600, sourceHeight * 1600);
}
}
}
else
{
text = text.Replace($"${key}$", data[key]);
}
}
}
run.SetText(text, 0);
para.Alignment = ParagraphAlignment.CENTER;
break;
}
}
出现的问题是,读取到$handler$的时候,只能读取到$handler,之前也有过这个问题,检查记录那一栏的$record$只能读取到$,我以为是命名的问题,不论改成什么$jilu$,任何名字都没用,还是只能读出“$”,于是我把他删除,重新加了一列,检查记录出来了,问题又跑到上报人那里去了,这是咋回事呀。。。
写入word的时候如果直接在word里输入就会有丢失$符号的问题,在txt里打好,再剪切过去就不会有问题,不知道是什么bug
Free Spire.Doc可以替换模板内容生成Word文档
NPOI 本质上是读取world的xml 格式,建议world 导出为xml,用vs code 编辑xml 找到$关键字, 可能关键被分割或者分离了,只需要想html一样 修改节点将内容$关键字$ 放在一起就可以了。有什么问题可以继续追问