Окончательное решение потребовало от меня создания 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);
}