2016-08-11 2 views
0

아래 코드를 사용하면 connections.xml 파일에서 잔여 데이터를 제거하여 수정할 수있는 xlsx 파일이 손상됩니다. 문제점의 원인 및 해결 방법은 무엇입니까?XmlNode 값을 대체하는 OpenXML은 잔여 데이터를 남깁니다.

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

데이터를 추가하기 전에 파트를 지우는 추가 선을 추가하여이 문제를 해결했습니다. MSDN에서

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

: 부분 스트림에

피드 데이터입니다. 부분 스트림은 처음에 이 잘린입니다.

감사합니다. SO라는 질문에 대한 답변을 찾았습니다. 특히, OpenXML replace specific customxml part of word document.