Преобразование Xlsx файла в XML
Всем привет. Требуется преобразовать Xlsx файл в Xml по аналогичной структуре файла XML(Скрин во вложении). Описание задачи: Считать данные из Excel-документа "ФайлСИсходнымиДанными.xls" и записать в xml-файл (по аналогии с файлом "ФайлРезультат.xml").
При заполнения тегов RootXml, SchemaVersion, Period, Source, Form руководствуйтесь xml-файлом.
Тег Column - содержит номера и названия столбцов из xls-файла, за исключением столбца 2(Код счета бюджетного учета) .
Тег Document содержит атрибут ПлСч11, который принимает значения столбца 2(Код счета бюджетного учета), но при добавлении вначало символа "1" и обнулении последних трёх символов. Например, столбец 2 содержит значение "20111510", то значение ПлСч11 будет "120111000".
Тег Data содержит атрибут СТРОКА, который принимает значения по возрастанию, начиная с "001" в пределах тега Document.
Тег <Data СТРОКА="960"> всегда присутствует в теге Document. Содержит итоговые суммы числовых столбцов.
Подскажите откуда начинать копать для реализации.
Скрин исходника XLSX:
Скрин примера XML:

Ответы (1 шт):
using System.Data; //System.Data.Common.dll
using System.IO;
using System.Xml;
using System.Xml.Schema; //System.Xml.ReaderWriter.dll
using System.Xml.Serialization;
Парсите Excel-документы через:
DataTable table = new DataTable();
table.ReadXml()
Выполняете обход строк/столбцов:
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
{
//Console.Write("{0},", row[column]);
}
Console.WriteLine();
}
Ищите строку с стоблцами: 1,2,3,4,5,6
После неё идут полезные данные, которые вы складываете в экземпляры класса:
class UseFullData
{
public string SchetNum {get;set;}
public string SchetCode {get;set;}
public string OstatokNachGod {get;set;}
public string VPutiNachGod {get;set;}
public string OstatokKonetsGod {get;set;}
public string VPutiKonetsGod {get;set;}
}
Разумеется вы используете конкретный тип данных, string для примера.
Далее вам нужна структура классов.
У некоторых будут специальные атрибуты:
[XmlRoot(ElementName="SchemaVersion")]
public class SchemaVersion {
[XmlAttribute(AttributeName="Number")]
public int Number { get; set; }
}
[XmlRoot(ElementName="Column")]
public class Column {
[XmlAttribute(AttributeName="Name")]
public string Name { get; set; }
[XmlAttribute(AttributeName="Num")]
public int Num { get; set; }
}
[XmlRoot(ElementName="Px")]
public class Px {
[XmlAttribute(AttributeName="Num")]
public int Num { get; set; }
[XmlAttribute(AttributeName="Value")]
public string Value { get; set; }
}
[XmlRoot(ElementName="Data")]
public class Data {
[XmlElement(ElementName="Px")]
public List<Px> Px { get; set; }
[XmlAttribute(AttributeName="СТРОКА")]
public int СТРОКА { get; set; }
}
[XmlRoot(ElementName="Document")]
public class Document {
[XmlElement(ElementName="Data")]
public List<Data> Data { get; set; }
[XmlAttribute(AttributeName="ПлСч11")]
public int ПлСч11 { get; set; }
}
[XmlRoot(ElementName="Form")]
public class Form {
[XmlElement(ElementName="Column")]
public List<Column> Column { get; set; }
[XmlElement(ElementName="Document")]
public List<Document> Document { get; set; }
[XmlAttribute(AttributeName="Code")]
public int Code { get; set; }
[XmlAttribute(AttributeName="Status")]
public int Status { get; set; }
[XmlAttribute(AttributeName="Name")]
public string Name { get; set; }
}
[XmlRoot(ElementName="Source")]
public class Source {
[XmlElement(ElementName="Form")]
public Form Form { get; set; }
[XmlAttribute(AttributeName="Code")]
public int Code { get; set; }
[XmlAttribute(AttributeName="ClassCode")]
public string ClassCode { get; set; }
}
[XmlRoot(ElementName="Period")]
public class Period {
[XmlElement(ElementName="Source")]
public Source Source { get; set; }
[XmlAttribute(AttributeName="Date")]
public DateTime Date { get; set; }
}
[XmlRoot(ElementName="RootXml")]
public class RootXml {
[XmlElement(ElementName="SchemaVersion")]
public SchemaVersion SchemaVersion { get; set; }
[XmlElement(ElementName="Period")]
public Period Period { get; set; }
}
Дальше обходите свои коллекции с UseFullData и распихивая нужные строки/таблицы по классам, и в конце всего-лишь сериализуете RootXml:
XmlSerializer ser = new XmlSerializer(typeof(RootXml));
FileStream fs = new FileStream("my.xml",FileMode.Create);
ser.Serialize(fs,myGroup);
fs.Close();