【问题标题】:Open XML SDK to edit Active document打开 XML SDK 以编辑活动文档
【发布时间】:2011-01-27 09:17:17
【问题描述】:

是否可以使用 Open XML sdk 来操作当前在 Office 应用程序中打开的部分文档(word/ppt)。我知道最简单的方法是使用 VSTO,但它速度慢并且会涉及使用剪贴板插入元素,OXML sdk 更直接且更简单。

如果有人可以发布一些代码示例,那就太好了。

提前致谢
拉克什

【问题讨论】:

    标签: openxml office-2007


    【解决方案1】:

    是的,可以使用 OpenXML sdk 2 修改打开的 VSTO 文档,然后使用更改后的 xml 更新打开的文档。

    http://msdn.microsoft.com/en-us/library/ff191178.aspx

    http://code.msdn.microsoft.com/Improve-Automation-415bff13

    基本上你从一个范围中获取xml,将其视为流,将其打包,使用包上的sdk,然后通过反转过程将修改后的xml插入回去。

    那里的智慧是,sdk 的这种常识用法是不可能的。但是,这是错误的。

    【讨论】:

      【解决方案2】:

      如下所示:-

      //include the namespace
      
      using DocumentFormat.OpenXml.WordProcessing
      
      //Open and manipulate temp.docx 
      
      using (WordprocessingDocument myDoc = WordprocessingDocument.Open("temp.docx", true)) 
      {
          //Access main part of document 
          MainDocumentPart mainPart = myDoc.MainDocumentPart; 
      
          //Add new comments part to document 
          mainPart.AddNewPart<WordprocessingCommentsPart>(); 
      
          //Delete Styles part within document 
          mainPart.DeletePart(mainPart.StyleDefinitionsPart); 
      
          //Iterate through all custom xml parts within document 
          foreach (CustomXmlPart customXmlPart in mainPart.CustomXmlParts) {
              //DO SOMETHING 
          }
      }
      

      此外,您可以使用 LINQ 来避免 foreach 循环。

      【讨论】:

      • 对不起,如果我之前不清楚。我想操作当前在 Word 中打开的文档。我将在功能区中创建一个按钮,将部分添加到当前活动的文档中。这意味着在运行此操作时可能不会保存文档,因此没有文件路径。有没有办法将 activedocument 对象转换为 WordProcessingDocument 对象谢谢 R
      【解决方案3】:

      我能够使用使用 ClosedXML 的 Excel 文档来执行此操作(在将文件作为路径 excelFileName 保存到磁盘之后):

      byte[] byteArray = null;
      using (var fs = new FileStream(excelFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
          int numBytesToRead = Convert.ToInt32(fs.Length);
          byteArray = new byte[numBytesToRead];
          fs.Read(byteArray, 0, numBytesToRead);
      }
      using (MemoryStream mem = new MemoryStream()) {
          mem.Write(byteArray, 0, byteArray.Length);
          XLWorkbook wb = new XLWorkbook(mem);
          ...
      }
      

      在我的情况下,我只是阅读文档,不会保存它,但如果需要,您可以将修改后的流写入另一个文件。

      【讨论】:

        【解决方案4】:

        显然,如果没有 Sharepoint,您将无法做到这一点。

        根据Zeyad Jarabi/..

        ...您需要一个了解如何获取共享锁的平台(如 SharePoint 或 SkyDrive)。如果没有这个概念,那么应用程序和 SDK 只能获取读或写锁,这会阻止这两种技术访问同一个文件。

        【讨论】:

        猜你喜欢
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多