Доступны ли библиотеки для обработки (чтения) XML-документов Excel 2003 - PullRequest
1 голос
/ 14 апреля 2011

У нас есть ситуация, когда XML-формат Excel 2003 широко используется для загрузки файлов в стороннюю систему. Существует требование, что некоторая информация должна быть извлечена из этих файлов для другой обработки. Есть ли библиотеки, которые обрабатывают Excel в формате XML 2003?

Дополнительная информация: формат этих файлов XML был определен третьей стороной, и мы не можем его изменить. Кроме того, сами данные не являются табличными или имеют какой-либо согласованный формат.

Ранее я использовал System.Xml.Linq для извлечения данных (в основном подход строки, индекс столбца) из очень простых версий этих электронных таблиц XML. Теперь требуются данные из более сложных версий, которые включают объединенные ячейки, именованные диапазоны и т. Д.

Эта обработка выполняется на сервере, поэтому Interop не является опцией на основе этой печально известной MS KB об Excel на сервере

Может кто-нибудь также предложить подход к обработке этих файлов?

Ответы [ 3 ]

1 голос
/ 21 апреля 2011

Окончательное решение потребовало от меня создания XSLT для извлечения необходимых данных из файла и преобразования в очень простое XML-представление данных.Я также создал классы, которые представляли объектную модель для десериализации сгенерированного XML с использованием XmlSerializer.Deserialize().

Однако, чтобы это работало эффективно, необходимо было обновить исходные XML-файлы Excel, чтобы включить именованные диапазоны дляЯчейки, которые нужно было извлечь. Наличие диапазонов имен позволило упростить XSLT, однако самый большой запах кода - это зависимость от существования именованных диапазонов в файле, который я не контролирую.

Обзор высокого уровня кода

   XPathDocument doc = new XPathDocument("path to Excel xml file");
   XslCompiledTransform xslt = new XslCompiledTransform();

   StringReader sr = new StringReader(Resources.XSLT); // embedded resource, the xslt is read in as a string
   XmlTextReader xs = new XmlTextReader(sr);
   xslt.Load(xs);
   XmlWriterSettings settings = new XmlWriterSettings()
                                    {
                                        Indent = true,
                                        Encoding = Encoding.UTF8,
                                        OmitXmlDeclaration = false
                                    };

   MemoryStream memStream = new MemoryStream();
   using (XmlWriter writer = XmlWriter.Create(memStream, settings))
   {
       xslt.Transform(doc, writer); // the simple xml..almost there 
   }

   MyCustomClass curve;
   {
       XmlSerializer deSerializer = new XmlSerializer(typeof(MyCustomClass));
       // reset needed to beginning of mem stream since current position is the last write position
       memStream.Position = 0; 
       curve = (MyCustomClass)deSerializer.Deserialize(memStream);
    }
0 голосов
/ 14 апреля 2011

Убедитесь, что Excel Data Reader на CodePlex делает то, что вам нужно. Я использую его для импорта простых списков данных из Excel в одно из наших приложений.

0 голосов
/ 14 апреля 2011

Рассматривали ли вы использование инструмента xsd.exe в вашей студии для создания классов для удобного чтения XML-файлов?

Конечно, он не будет включать никакой разумной логики для объединения полей, но выгода в том, что вам не нужно создавать собственную логику чтения или устанавливать библиотеки взаимодействия.

...