替换XmlNode值的OpenXML会留下残留数据

时间:2016-08-11 10:07:27

标签: c# xml openxml

当使用下面的代码时,我得到了损坏的xlsx文件,可以通过从connections.xml文件中删除残留数据来修复该文件。 是什么导致了这个问题以及如何解决这个问题?

using (SpreadsheetDocument excelDoc = SpreadsheetDocument.Open(file.FullName, true))
{
    WorkbookPart workbookpart = excelDoc.WorkbookPart;
    ConnectionsPart connPart = workbookpart.ConnectionsPart;

    string spreadsheetmlNamespace = @"http://schemas.openxmlformats.org/spreadsheetml/2006/main";
    NameTable nt = new NameTable();
    XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
    nsManager.AddNamespace("sh", spreadsheetmlNamespace);

    XmlDocument xdoc = new XmlDocument(nt);
    xdoc.Load(connPart.GetStream());
    XmlNode oxmlNode = xdoc.SelectSingleNode("/sh:connections/sh:connection/sh:dbPr/@connection", nsManager);

    oxmlNode.Value = oxmlNode.Value.Replace(oxmlNode.Value, "foo");
    xdoc.Save(connPart.GetStream());
}

connections.xml出现的内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<connections xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <connection id="1" keepAlive="1" name="LCR" type="5" refreshedVersion="4" background="1" saveData="1">
    <dbPr connection="foo" command="test" commandType="1" />
    <olapPr sendLocale="1" rowDrillCount="1000" serverFill="0" serverFont="0" serverFontColor="0" />
  </connection>
</connections>y Options=2;MDX Missing Member Mode=Error;Disable Prefetch Facts=True" command="test" commandType="1"/><olapPr sendLocale="1" rowDrillCount="1000" serverFill="0" serverFont="0" serverFontColor="0"/></connection></connections>

请注意最后的残留数据。如果删除它,xlsx可以再次打开。

1 个答案:

答案 0 :(得分:0)

通过添加额外的行来修复此问题,该行在向其添加数据之前清除该部分。

...
oxmlNode.Value = oxmlNode.Value.Replace(oxmlNode.Value, newConnection);
connPart.FeedData(connPart.GetStream()); //Added
xdoc.Save(connPart.GetStream())
...

来自MSDN

  

将数据输入零件流。该部分的流将是   首先截断

感谢SO相关问题部分找到答案。特别是OpenXML replace specific customxml part of word document