1

在过去三天研究并编译了一个 Excel 到 XML 转换器的陈旧版本之后,是时候来论坛寻求帮助了,因为我无法得到我真正需要的东西。不过,这里有一些很好的代码,所以任何需要它的人都可以抓住它。

我有两个转换器:1)Excel 到 XML(在 VB 中)和 2)XML 到 Excel(在下面的 C# 中)。后者成功地创建了一个功能 Excel 文件,尽管它不会转换回格式良好的 XML。

我相信这个问题有两个方面。第一个问题与 XML 到 Excel 转换产生的文件不包括 and 标记有关,我不知道如何实现这一点。第二个问题是 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 文件,但在任何地方都无法识别 and 标记。因此,另辟蹊径让我受益(还要注意错误的元素名称和奇怪的命名格式):

<?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 函数有关,但我不确定如何在不使用我已经拥有的字符串的情况下使其工作。

编辑:我现在意识到 tablemappings.add 中的“your”必须更改为“Person”才能获得正确的元素名称,但这并不能解释为什么要返回“First/Last Name”元素一种奇怪的格式。我也不想硬编码这个字符串。

此外,在想知道如何以编程方式进行更改时,我将我的 XML 到 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;
        }
 }
4

1 回答 1

0

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
于 2013-05-29T20:55:21.913 回答