2016-08-11 18 views
0

以下のコードを使用すると、破損したxlsxファイルが取得され、connections.xmlファイルから残存データを削除することで修正できます。 問題の原因と解決方法XmlNode値の代わりにXmlNode値が残ります

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

データを追加する前にパーツをクリアする余分な行を追加することでこれを修正しました。

... 
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

関連する問題