我是OpenXML的新手,我即将解决这个问题。帮助真的很感激。
概述是我试图通过asp.net填写单词文档内容模板。
我很容易使用CustomXML填充字段,但我尝试填充的文档也与SharePoint文档库进行了映射。因此,当我在SharePoint库中上载文档时,它将自动填充Word文档上的内容控件中的列。现在使用自定义XML正在破坏该设置。当控件映射到SharePoint时,使用OpenXML填充数据不起作用。
请帮助您提供示例代码或正确的方向。
答案 0 :(得分:0)
这正是我们在项目中所做的:)幸运的你。
首先,您需要为该文档库创建事件接收器。并且您需要实现ItemUpdated和ItemAdded。看到 http://www.dotnetcurry.com/ShowArticle.aspx?ID=649 http://blogs.msdn.com/b/brianwilson/archive/2007/03/05/part-1-event-handlers-everything-you-need-to-know-about-microsoft-office-sharepoint-portal-服务器苔藓事件handlers.aspx
//事件接收器的代码..这将为您提供内容控件的名称及其值
Dictionary<string, string> results = new Dictionary<string, string>();
using (Stream stream = file.OpenBinaryStream(SPOpenBinaryOptions.SkipVirusScan)) {
using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true)) {
var contentControls = doc.MainDocumentPart
.GetXDocument()
.Descendants(w + "sdt");
foreach ( var contentControl in contentControls )
{
string key = (string)contentControl.Descendants(w + "sdtPr").Elements(w + "alias").Attributes(w + "val").FirstOrDefault();
string val = GetTextFromContentControl(contentControl);
results[key] = val;
}
}
static string GetTextFromContentControl(XElement contentControlNode) {
return contentControlNode.Descendants(w + "p")
.Select
(
p => p.Elements()
.Where(z => z.Name == r || z.Name == ins || z.Name == br)
.Descendants()
.Where(z => z.Name == w + "t" || z.Name == w + "br")
.StringConcatenate(element => (string)element + (element.Name == w + "br" ? Environment.NewLine : "")) + Environment.NewLine
).StringConcatenate();
}