2

私はSaxonを使用してExcelファイル内のxmlのxslt変換を行っています。ここで、変換はxlsxファイル内の.relsxmlファイルで実行されています。現在、xlsxファイルの内容全体を別のフォルダーに解凍するという回避策があります。ただし、簡単にするために、プログラムはxlsxファイルを入力として受け取るので、内容を解凍せずに、プログラムがxlsxファイル内のxmlを指すより簡単な方法があるかどうか疑問に思いました。file.xlsx \ _rels \ .relsにパスしようとしましたが、うまくいかないようです。この入力に現在使用しているコードは

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

しかし、私はそのポイントをxlsx内に直接配置したいと思います。

4

1 に答える 1

1

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

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

System.IO.Packaging.PackageのOpenstaticメソッドを使用して、GetStreamを呼び出して必要な部分を解凍し、それをStreamとして返すPackageインスタンスを取得できます。Packageは、Excelのxslx形式など、OpenPackagingConventionに準拠したファイルを処理します。

以下のコードは、パッケージ部分をStreamに解凍し、これを使用してXmlReaderインスタンスを作成し、最後にXmlReaderをパラメーターとしてBuild関数に渡します。

            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);
于 2011-08-06T19:01:05.733 に答える