Filepath к xml в xlsx в c # - PullRequest
       27

Filepath к xml в xlsx в c #

2 голосов
/ 05 августа 2011

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

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

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

1 Ответ

1 голос
/ 06 августа 2011

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

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

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

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