将复杂的Excel转换为XML

经过三天的研究,编写了Excel-to-XML转换器的老套版本,现在是时候到论坛寻求帮助,因为我无法得到我需要的东西。 这里有一些很好的代码,所以任何需要它的人都可以抓住它。

我有两个转换器:1)Excel到XML(在VB中)和2)XML到Excel(在下面的C#中)。 后者成功地创build了一个function强大的Excel文件,尽pipe它不会转换为精美的XML格式。

我认为这个问题是双重的。 第一个问题与XML到Excel转换产生的文件不包含和标签有关,而且我不知道如何实现。 第二个问题是Excel到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> 

我使用的VB是以下内容:

  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函数有关,但是我不确定如何在不使用已经使用的string的情况下完成这个工作。

编辑:现在我意识到tablemappings.add中的“你的”将不得不被更改为“人”才能得到正确的元素名称,但这并不能解释为什么“First / Last Name”元素被返回一个奇怪的格式。 我也不想硬编码这个string。

此外,在想知道如何以编程方式更改此变化,我将包括我的XML到Excel转换器(在C#中),以查看是否有人可以build议一种方法来包含在生成的Excel文件中的元素,以便当我转换另一种方式,Excel到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; } } 

Excel电子表格的列标题包含名称中的空格,如“名字”。 (0020是一个空格的ASCII码)。 当你从excel中查询这些列时,应该在没有空格的情况下将它们别名。 试试这个VB代码:

 'get Table Name MyConnection = New System.Data.OleDb.OleDbConnection(connectionString) MyCommand = New System.Data.OleDb.OleDbDataAdapter("select [First Name] AS FirstName, [Last Name] AS LastName from [Practice$]", MyConnection) MyCommand.TableMappings.Add("Table", "Person") 'You already figured this one out