Путь к файлу xml в xlsx в С#

Я выполняю xslt-преобразование xml в файле excel, используя Saxon, где преобразование выполняется в файле .rels xml в файле xlsx. В настоящее время у меня есть обходной путь, когда я распаковал все содержимое файла xlsx в отдельную папку. Однако для простоты моя программа принимает файл xlsx в качестве входных данных, поэтому мне было интересно, есть ли для моей программы более простой способ указать на xml в файле xlsx без необходимости распаковывать содержимое. Я пробовал указать путь к файлу .xlsx\_rels\.rels, но это, похоже, не работает. Код, который я сейчас использую для этого ввода,

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

но я хотел бы иметь эту точку непосредственно в xlsx.


person Jarrett Phillips    schedule 05.08.2011    source источник


Ответы (1)


Да, есть более простой способ, вам не нужно распаковывать весь файл.

Вместо пути к файлу, который вы передали в качестве параметра функции сборки Saxon API, передайте экземпляр XmlReader или Stream несжатой части файла xslx.

Статический метод Open для System.IO.Packaging.Package можно использовать для получения экземпляра пакета, для которого вы вызываете GetStream, чтобы распаковать нужную часть и вернуть ее как поток. Пакет обрабатывает файлы, соответствующие Open Packaging Convention, такие как формат Excel xslx.

Приведенный ниже код распаковывает часть пакета в 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);
person pgfearo    schedule 06.08.2011