【发布时间】:2016-10-09 09:37:00
【问题描述】:
我正在使用 asp.net 开发一个 Web 应用程序,并且我有一个名为 Template.docx 的文件,它的作用类似于生成其他报告的模板。在这个 Template.docx 中,我有一些 MergeFields(标题、客户名称、内容、页脚等)来替换 C# 中的一些动态内容。
我想知道,如何将内容放在 docx 的合并字段中?
我不知道 MergeFields 是否是正确的方法,或者是否有其他方法。如果你能推荐我,我很感激!
PS:我的 web 应用程序中引用了 openxml。
编辑:
private MemoryStream LoadFileIntoStream(string fileName)
{
MemoryStream memoryStream = new MemoryStream();
using (FileStream fileStream = File.OpenRead(fileName))
{
memoryStream.SetLength(fileStream.Length);
fileStream.Read(memoryStream.GetBuffer(), 0, (int) fileStream.Length);
memoryStream.Flush();
fileStream.Close();
}
return memoryStream;
}
public MemoryStream GenerateWord()
{
string templateDoc = "C:\\temp\\template.docx";
string reportFileName = "C:\\temp\\result.docx";
var reportStream = LoadFileIntoStream(templateDoc);
// Copy a new file name from template file
//File.Copy(templateDoc, reportFileName, true);
// Open the new Package
Package pkg = Package.Open(reportStream, FileMode.Open, FileAccess.ReadWrite);
// Specify the URI of the part to be read
Uri uri = new Uri("/word/document.xml", UriKind.Relative);
PackagePart part = pkg.GetPart(uri);
XmlDocument xmlMainXMLDoc = new XmlDocument();
xmlMainXMLDoc.Load(part.GetStream(FileMode.Open, FileAccess.Read));
// replace some keys inside xml (it will come from database, it's just a test)
xmlMainXMLDoc.InnerXml = xmlMainXMLDoc.InnerXml.Replace("field_customer", "My Customer Name");
xmlMainXMLDoc.InnerXml = xmlMainXMLDoc.InnerXml.Replace("field_title", "Report of Documents");
xmlMainXMLDoc.InnerXml = xmlMainXMLDoc.InnerXml.Replace("field_content", "Content of Document");
// Open the stream to write document
StreamWriter partWrt = new StreamWriter(part.GetStream(FileMode.Open, FileAccess.Write));
//doc.Save(partWrt);
xmlMainXMLDoc.Save(partWrt);
partWrt.Flush();
partWrt.Close();
reportStream.Flush();
pkg.Close();
return reportStream;
}
PS:当我将 MemoryStream 转换为文件时,我得到了一个损坏的文件。谢谢!
【问题讨论】:
-
我认为这里不能使用 Word 来执行邮件合并?
-
不,实际上,我需要填写这些字段,我想将其替换为我的动态内容。我不知道 MergeFields 是否是正确的方法。谢谢!
-
通常将内容放入 MergeField 的方式是与包含动态内容的数据源进行邮件合并。您使用什么 libaray 从 asp.net 代码中操作 docx 文件?
-
嗯,我的项目中引用了DocumentFormat.OpenXml,但是没有必要使用。我找到了一个可以满足我需要的代码,并且可以正常工作:) ...但它使用 FileStream,所以,我想知道是否有任何方法可以在 MemoryStream 中生成 docx 并将其发送到客户端?看看我的编辑!谢谢@user957902
-
看看 DocumentFormat.OpenXml.Wordprocessing.MailMerge 类。您也可以考虑改用 DocumentVariables,尽管这在某种程度上已被弃用。
标签: c# asp.net .net openxml docx