我正在尝试开发一种解决方案,该解决方案从ASP.Net网页获取输入,并将输入值嵌入到MS Word文档中的相应内容控件中。MS Word文档还获得了带有一些动态数据的静态数据,这些数据将嵌入到“页眉”和“页脚”字段中。
这里的想法是该解决方案应该基于Web。我可以为此目的使用OpenXML还是可以建议其他任何方法。
预先非常感谢您提供的所有宝贵意见。我真的很感激他们。
我的项目中有一些代码示例,可以在您在Word文档中创建的内容控件中插入一些单词:
public static WordprocessingDocument InsertText(this WordprocessingDocument doc, string contentControlTag, string text)
{
SdtElement element = doc.MainDocumentPart.Document.Body.Descendants<SdtElement>()
.FirstOrDefault(sdt => sdt.SdtProperties.GetFirstChild<Tag>()?.Val == contentControlTag);
if (element == null)
throw new ArgumentException($"ContentControlTag \"{contentControlTag}\" doesn't exist.");
element.Descendants<Text>().First().Text = text;
element.Descendants<Text>().Skip(1).ToList().ForEach(t => t.Remove());
return doc;
}
它只是简单地在文档中查找具有特定内容的第一个contentcontrol Tag
(您可以通过在文字控件中启用设计器模式并右键单击内容控件来进行设置),然后用传递给该方法的文本替换当前文本。此后,该文档当然仍将包含可能不需要的内容控件。因此,当我完成文档编辑后,我运行以下方法来摆脱内容控件:
internal static WordprocessingDocument RemoveSdtBlocks(this WordprocessingDocument doc, IEnumerable<string> contentBlocks)
{
List<SdtElement> SdtBlocks = doc.MainDocumentPart.Document.Descendants<SdtElement>().ToList();
if (contentBlocks == null)
return doc;
foreach(var s in contentBlocks)
{
SdtElement currentElement = SdtBlocks.FirstOrDefault(sdt => sdt.SdtProperties.GetFirstChild<Tag>()?.Val == s);
if (currentElement == null)
continue;
IEnumerable<OpenXmlElement> elements = null;
if (currentElement is SdtBlock)
elements = (currentElement as SdtBlock).SdtContentBlock.Elements();
else if (currentElement is SdtCell)
elements = (currentElement as SdtCell).SdtContentCell.Elements();
else if (currentElement is SdtRun)
elements = (currentElement as SdtRun).SdtContentRun.Elements();
foreach (var el in elements)
currentElement.InsertBeforeSelf(el.CloneNode(true));
currentElement.Remove();
}
return doc;
}
要从WordProcessingDocument
模板打开并对其进行编辑,可以在线获取大量信息。
在内存流中打开/保存文档时,很少有示例代码可以打开/保存文档,当然,您应该使用一个额外的存储库类来解决此问题,该类可以用实际代码管理文档:
byte[] byteArray = File.ReadAllBytes(@"C:\...\Template.dotx");
using (var stream = new MemoryStream())
{
stream.Write(byteArray, 0, byteArray.Length);
using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true))
{
//Needed because I'm working with template dotx file,
//remove this if the template is a normal docx.
doc.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
doc.InsertText("contentControlName","testtesttesttest");
}
using (FileStream fs = new FileStream(@"C:\...\newFile.docx", FileMode.Create))
{
stream.WriteTo(fs);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句