如何检索复杂的Excel文件与合并单元格,并保存为XML文件使用VB.NET?

我有这个可以检索excel文件并保存为xml文件。

Imports Microsoft.Office.Interop.Excel Imports System.Xml Imports System.IO Module Module1 Sub Main() Try Dim excel As Application = New Application Dim filename As String = "person" Dim file_extension As String Dim path As String = "C:\Users\" Dim w As Workbook Try file_extension = "xlsx" w = excel.Workbooks.Open(path & filename + "." & file_extension) Catch ex As Exception file_extension = "xls" w = excel.Workbooks.Open(path & filename + "." & file_extension) End Try For i As Integer = 1 To w.Sheets.Count Dim sheet As Worksheet = w.Sheets(i) Dim r As Range = sheet.UsedRange Dim array(,) As Object = r.Value(XlRangeValueDataType.xlRangeValueDefault) If array IsNot Nothing Then Dim bound0 As Integer = array.GetUpperBound(0) Dim bound1 As Integer = array.GetUpperBound(1) Dim settings As XmlWriterSettings = New XmlWriterSettings() settings.Indent = True Using writer As XmlWriter = XmlWriter.Create(filename + ".xml", settings) writer.WriteStartDocument() writer.WriteStartElement(filename) For j As Integer = 2 To bound0 writer.WriteStartElement(sheet.Name) For x As Integer = 1 To bound1 writer.WriteElementString(array(1, x), array(j, x)) Next writer.WriteEndElement() Next writer.WriteEndElement() writer.WriteEndDocument() End Using End If Next w.Close() Catch ex As Exception Console.WriteLine("MS Excel file is invalid.") Console.WriteLine(ex.Message) Console.ReadKey() End Try End Sub End Module 

当我有这个,例如,作为我的Excel文件:

文件名: person.xlsx表名: person.xlsx

 Name Age Gender John 5 M Jane 4 F 

然后xml文件将以这种方式返回。

 <person> <personfile> <Name>John</Name> <Age>5</Age> <Gender>M</Gender> </personfile> <personfile> <Name>Jane</Name> <Age>4</Age> <Gender>F</Gender> </personfile> </person> 

保存为person.xml

现在我的问题是…如果Excel文件已合并单元格? 如何解决这个错误? 当Excel文件合并单元格时,它将返回

 ERROR: Index and length must refer to a location within the string Parameter name: length 

这里是我应该检索的示例excel文件。 excel文件

PS还有combobox。

这适用于我与一些不同的合并单元格情况下做的testing表:

 Private Sub Main Try Dim excel As Application = New Application Dim filename As String = "person" Dim file_extension As String Dim path As String = "C:\Users\" Dim w As Workbook Try file_extension = "xlsx" w = excel.Workbooks.Open(path & filename + "." & file_extension) Catch ex As Exception file_extension = "xls" w = excel.Workbooks.Open(path & filename + "." & file_extension) End Try For i As Integer = 1 To w.Sheets.Count Dim sheet As Object = w.Sheets(i) Dim r As Object = sheet.UsedRange 'Changes to your original code begin here Dim bound0 As Integer = r.Rows.Count Dim bound1 As Integer = r.Columns.Count Dim array(bound0, bound1) As Object For a As Integer = 1 To bound0 For b As Integer = 1 To bound1 Try array(a, b) = r.Cells(a, b).Value Catch array(a, b) = Nothing End Try Next Next If array IsNot Nothing Then 'I left this in, though I can't imagine how it could be needed now Dim settings As XmlWriterSettings = New XmlWriterSettings() settings.Indent = True Using writer As XmlWriter = XmlWriter.Create(filename + ".xml", settings) writer.WriteStartDocument() writer.WriteStartElement(filename) For j As Integer = 2 To bound0 writer.WriteStartElement(sheet.Name) For x As Integer = 1 To bound1 If array(j, x) IsNot Nothing Then Dim h As Integer = x Do Until array(1, h) IsNot Nothing h -= 1 Loop writer.WriteElementString(array(1, h), array(j, x)) 'No more changes to your code after this point End If Next writer.WriteEndElement() Next writer.WriteEndElement() writer.WriteEndDocument() End Using End If Next w.Close() Catch ex As Exception Console.WriteLine("MS Excel file is invalid.") Console.WriteLine(ex.Message) Console.ReadKey() End Try End Sub 

该代码将该表视为一个没有合并单元格的二维数组。 最好的办法是将它应用到符合这些标准的表格部分,例如没有合并的单元格。

根据文件之间结构的固定或变化,这可能很容易或很难。

假设你需要的数据总是在同一个固定的地方,你可以将rvariables设置为相关的范围而不是整个表格。