如何用C#覆盖DOCX XML文件?

时间:2016-06-22 16:42:57

标签: c# ms-word openxml docx

我被困住了。目标是仅在相应的日期属性在给定日期之后,才使用C#工具更改MS Word轨道更改中的审阅者名称。变量字符串docPath将传递给方法changeRevAuthordocPath表示已打开的DOCX文件。文件必须在传递时打开,因为该工具还会在运行该方法之前将所有DOC文件上传到DOCX。

更改作者姓名并在XML文件中正确确认日期。我们通过将XML保存到静态路径来测试它。但是,我需要做的是覆盖现有的XML文件,而不是将其拉出并将其保存在其他地方。这是现有的方法:

    private void changeRevAuthor(string docPath)
    {
        using (Stream stream = System.IO.File.Open(docPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {  
            stream.Seek(0, SeekOrigin.End); 
            XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
            WordprocessingDocument document = WordprocessingDocument.Open(stream, false);
            XDocument mainDocumentXDoc = document.MainDocumentPart.GetXDocument();          
            var nodes = mainDocumentXDoc.Descendants().Where(x => x.Attributes(w + "author").Count() > 0);
            var currentdate = "2016-06-21";

            foreach (XElement node in nodes)
            {
                var date = node.Attribute(w + "date").ToString().Substring(8, 10);
                if (DateTime.Parse(date) < DateTime.Parse(currentdate))
                {
                    node.SetAttributeValue(w + "author", "LUZ");
                    Debug.WriteLine(date);
                }                   
            }
            mainDocumentXDoc.Save(document.MainDocumentPart.GetStream(FileMode.Create));

        }
    }

通过研究,我相信最后一行应该可以解决问题:mainDocumentXDoc.Save(document.MainDocumentPart.GetStream(FileMode.Create));

但是,这会返回以下错误:

  

'发生了'System.IO.IOException'类型的未处理异常   System.IO.Packaging.dll其他信息:无法获取流   FileMode.Create,FileMode.CreateNew,FileMode.Truncate,   FileMode.Append访问时是FileAccess.Read。'

当我将其更改为FileAccess.WriteFileAccess.ReadWrite时,我收到以下错误:

  

'附加信息:进程无法访问该文件   'C:\ Users .... \ Desktop \ C#Test \ Results \ newtest.docx'因为它是   被另一个进程使用。'

我从哪里开始?

由于 路加

1 个答案:

答案 0 :(得分:0)

这解决了您的问题:

void changeRevAuthor (string docPath)
{
  XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
  WordprocessingDocument document = WordprocessingDocument.Open(docPath, true);
  XDocument mainDocumentXDoc = document.MainDocumentPart.GetXDocument();

  var nodes = mainDocumentXDoc.Descendants().Where(x => x.Attributes(w + "author").Count() > 0);

  foreach (XElement node in nodes)
  {
    // ...
    node.SetAttributeValue(w + "author", "LUZ");        
  }
  mainDocumentXDoc.Save(document.MainDocumentPart.GetStream(FileMode.Create));
}

不完整

您还应该修改 word \ comments docProps \ core 包部件,而不仅仅是 word \ document