2011-08-05 12 views
2

xlsxファイル内の.rels xmlファイルで変換が行われているSaxonを使用して、Excelファイル内でxmlのxslt変換を行っています。私は現在、xlsxファイルの内容全体を別々のフォルダに解凍した場所で回避策を講じています。しかし、わかりやすくするために、私のプログラムはxlsxファイルを入力として受け取りますので、コンテンツを解凍する必要なしに、xlsxファイル内のxmlを指す簡単な方法があれば疑問でした。私はfile.xlsx \ _rels \ .relsへのパスを試みましたが、動作していないようです。この入力用に現在使用しているコードはxlsx内のxmlへのファイルパス#

String inputFile = "file.xlsx_folder\\_rels\\.rels" 
XdmNode input = processor.NewDocumentBuilder().Build(new Uri(inputFile)); 

ですが、xlsx内に直接その点を入れたいと思います。

答えて

1

はい簡​​単な方法があります。ファイル全体を解凍する必要はありません。

Saxon APIビルド関数にパラメータとして渡したファイルパスの代わりに、xslxファイルの非圧縮部分のXmlReaderまたはStreamインスタンスを渡します。

Open静的メソッドSystem.IO.Packaging.Packageを使用してGetStreamを呼び出して、必要な部分を解凍してStreamとして返すPackageインスタンスを取得できます。パッケージは、Excelのxslx形式のようなOpen Packaging Conventionに準拠したファイルを処理します。

以下のコードは、ストリームにパッケージの一部を解凍たXmlReaderインスタンスを作成し、これを使用して、最終的にビルド関数へのパラメータとしてのXmlReaderを渡し:

  string filename = "c:\\test\\file.xslx"; 
      string partPath = "/_rels/.rels"; 

      Package xpsPackage = Package.Open(fileName, FileMode.Open) 
      Uri partUri = new Uri(partPath, UriKind.Relative); 
      PackagePart xpsPart = xpsPackage.GetPart(partUri); 

      Stream xpsStream = xpsPart.GetStream(FileMode.Open) 
      XmlReader xmlReader = XmlReader.Create(xpsStream); 

      XdmNode input = processor.NewDocumentBuilder().Build(xmlReader); 
関連する問題