当使用下面的代码时,我得到了损坏的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可以再次打开。
答案 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。