【问题标题】:Unable to fill Content Control in Word using OpenXML无法使用 OpenXML 在 Word 中填充内容控件
【发布时间】:2012-08-08 09:23:45
【问题描述】:

我是 OpenXML 的新手,我将在这个问题上大发雷霆。非常感谢您的帮助。

概述是我正在尝试通过 asp.net 填充 word 文档内容模板。

我可以轻松地使用 CustomXML 填充字段,但我尝试填充的文档也映射到 SharePoint 文档库。因此,当我在 SharePoint 库中上传文档时,它会自动填充 Word 文档内容控件中的列。现在使用自定义 XML 正在破坏该设置。当控件映射到 SharePoint 时,使用 OpenXML 填充数据不起作用。

请帮助提供示例代码或正确的方向。

【问题讨论】:

    标签: sharepoint ms-word openxml openxml-sdk


    【解决方案1】:

    这正是我们在项目中所做的:)你真幸运。

    首先您需要为该文档库创建事件接收器。并且您需要实现 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-服务器-moss-event-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();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多