私はasp.netでWebアプリケーションを開発していて、他のレポートを生成するテンプレートのように動作するTemplate.docxというファイルがあります。このTemplate.docxの内部には、C#のいくつかの動的コンテンツを置き換えるいくつかのMergeField(Title、CustomerName、Content、Footerなど)があります。どのように私は、docxのmergefieldにコンテンツを配置することができます
私は、どのようにして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を変換すると、私は破損したファイルを得ました。ありがとう!
でGitHubのリポジトリで利用可能である私は、差し込み印刷をperfromするWordを使用すると、ここにオプションではないことを前提としていますか? – user957902
いいえ、実際には、これらのフィールドに入力する必要があります。動的コンテンツに置き換えます。 MergeFieldsがこれを行う正しい方法であるかどうかはわかりません。ありがとうございました! –
通常、MergeFieldにコンテンツを挿入する方法は、動的コンテンツを含むデータソースとの差し込み印刷を実行することです。あなたはasp.netコードからdocxファイルを操作するためにlibarayを使用していますか? – user957902