在过去三天研究并编译了一个 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;
}
}