2

c#openxmlの使用-Excelファイルを開き、そのconnection.xmlストリームにバインドして、埋め込みSQLクエリを更新しようとしています。個々の文字シーケンスを接続/コマンドノードで正常に置き換えることはできますが、コマンド属性(つまり、node.Attribute["command"]。Value= select * from ....)を明示的に設定しようとすると、破損します。

xmlDoc.Load(wkb.WorkbookPart.ConnectionsPart.GetStream());

csNode = xmlDoc.SelectSingleNode("*/*/*[@connection]");

csNode.Attributes["command"].Value = Regex.Replace(csNode.Attributes["command"].Value,        @"\(\[\w*\].\[\w*\].\[\w*\].\[\w*\].*\)", "(" + subQry + ")", RegexOptions.Multiline);

xmlDoc.Save(wkb.WorkbookPart.ConnectionsPart.GetStream()); 

wkb.Close();
4

1 に答える 1

0

これがこの問題を解決する唯一の方法かどうかはわかりませんが、元の connections.xml ストリームを削除し、正しい値を持つ新しいストリームを作成してワークブックに添付することで修正できました。

 //select connections node from loaded xml Excel
 csNode = xmlDoc.SelectSingleNode("*/*/*[@connection]");

 //store original node values
 oldConnValue = csNode.Attributes["connection"].Value;
 oldCommValue = csNode.Attributes["command"].Value;

 //delete existing ConnectionsPart - to ensure that bleed-over data is not present
 wkb.WorkbookPart.DeletePart(wkb.WorkbookPart.ConnectionsPart);

 //create a replacement ConnectionsPart
 wkb.WorkbookPart.AddNewPart<ConnectionsPart>();

 csNode.Attributes["connection"].Value = oldConnValue; //reassign existing connection value
 csNode.Attributes["command"].Value = baseQry;         //assign new query

 //save changes to stream
 xmlDoc.Save(wkb.WorkbookPart.ConnectionsPart.GetStream());
于 2012-11-14T15:27:30.107 に答える