после исследования последних трех дней и составления избитой версии конвертера Excel-to-XML, пришло время обратиться за помощью к форуму, потому что я не могу получить именно то, что мне нужно. Здесь есть хороший код, поэтому любой, кому это нужно, может его схватить.Преобразование сложного Excel в XML
У меня есть два преобразователя: 1) Excel-to-XML (в VB) и 2) XML-to-Excel (на C# ниже). Последний успешно создает функциональный файл Excel, хотя тот, который не будет преобразовывать обратно как хорошо сформированный XML.
Вопрос, я считаю, в два раза. Первая проблема связана с тем, что файл, полученный в результате преобразования XML-to-Excel, не включает теги и теги, и я не уверен, как это осуществить. Вторая проблема заключается в том, что конвертер Excel-to-XML форматирует элементы XML странно (см. Ниже).
Исходный образец XML файл:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="practice.xsd">
<Person>
<FirstName>Oscar</FirstName>
<LastName>Banda</LastName>
</Person>
<Person>
<FirstName>Steven</FirstName>
<LastName>Richter</LastName>
</Person>
<Person>
<FirstName>Luis</FirstName>
<LastName>Contreras</LastName>
</Person>
<Person>
<FirstName>Elias</FirstName>
<LastName>Cooper</LastName>
</Person>
</Data>
Это превращает в две колонок Excel файла с заголовками столбцов для первых и фамилий, но без признания тегов и в любом месте. Таким образом, в другую сторону получает меня (также обратите внимание на неправильные имена элементов и странные форматы именования):
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Your>
<First_x0020_Name>Oscar</First_x0020_Name>
<Last_x0020_Name>Banda</Last_x0020_Name>
</Your>
<Your>
<First_x0020_Name>Elias</First_x0020_Name>
<Last_x0020_Name>Cooper</Last_x0020_Name>
</Your>
<Your>
<First_x0020_Name>Steven</First_x0020_Name>
<Last_x0020_Name>Richter</Last_x0020_Name>
</Your>
<Your>
<First_x0020_Name>Luis</First_x0020_Name>
<Last_x0020_Name>Contreras</Last_x0020_Name>
</Your>
</NewDataSet>
В.Б. Я использую следующие:
Public Function ExcelToXMLConverter(excelFile As String)
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim ds As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
Dim source As String = excelFile
Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & source & ";Extended Properties=Excel 12.0;"
'get Table Name
MyConnection = New System.Data.OleDb.OleDbConnection(connectionString)
MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Practice$]", MyConnection)
MyCommand.TableMappings.Add("Table", "Your")
'Fill dataset with the data
ds = New System.Data.DataSet()
MyCommand.Fill(ds)
ds.WriteXml(IO.Path.GetDirectoryName(source).ToString() & "\" & IO.Path.GetFileNameWithoutExtension(source) & ".xml")
MyConnection.Close()
Return (ds)
End Function
Это, вероятно, есть что-то делать с функцией MyCommand.TableMappings.Add, но я не уверен, как сделать эту работу без использования строк, которые у меня уже есть.
EDIT: Теперь я понимаю, что «ваш» в tablemappings.add должен быть заменен на «Person», чтобы получить правильные имена элементов, но это не объясняет, почему элементы «First/Last Name» возвращаются в странном формате. Я бы не стал жестко программировать эту строку.
Кроме того, задаваясь вопросом, как я могу получить это программное обеспечение, я включаю в себя мой конвертер XML-to-Excel (на C#), чтобы узнать, может ли кто-нибудь предложить способ включения элементов и в полученный файл Excel что когда я конвертирую другой путь, Excel-to-XML, я получаю исходный документ.
public String XMLtoExcel(string xmlInputFile)
{
object misValue = System.Reflection.Missing.Value;
// create Excel
Excel.Application myApp = new Excel.Application();
Excel.Workbook myWbk = myApp.Workbooks.Add(misValue);
Excel.Worksheet myWst = (Excel.Worksheet)myWbk.Worksheets.get_Item(1);
// load xml file
string input = xmlInputFile;
DataSet ds = new DataSet();
XmlReader xmlFile;
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
xmlFile = XmlReader.Create(input, settings);
ds.ReadXml(xmlFile);
// write root into excel
//XmlDocument doc = new XmlDocument();
//doc.Load(input);
//XmlNode root = doc.DocumentElement;
//myWst.Cells[1, 1] = root.Name;
// write data in to excel
int col, row;
int i = 1;
int counter = ds.Tables[0].Columns.Count;
for (col = 0; col <= ds.Tables[0].Columns.Count - 1; col++)
{
myWst.Cells[1, i].value = ds.Tables[0].Columns[col].ColumnName;
myWst.Cells[1, i].EntireRow.Font.Bold = true;
i += 1;
}
i = 2;
int k = 1;
for (col = 0; col <= ds.Tables[0].Columns.Count - 1; col++)
{
i = 2;
for (row = 0; row <= ds.Tables[0].Rows.Count - 1; row++)
{
myWst.Cells[i, k].Value = ds.Tables[0].Rows[row].ItemArray[col];
i += 1;
}
k += 1;
}
}
Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –