如何检索包含合并单元格的复杂 excel 文件并使用 vb.net 另存为 xml 文件?
How to retrieve complex excel file with merged cells and save as xml file using 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
sheet 姓名:personfile
Name Age Gender
John 5 M
Jane 4 F
然后 xml 文件将 return 这样。
<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 文件合并单元格时,它 returns
ERROR: Index and length must refer to a location within the string
Parameter name: length
这是我应该检索的示例 excel 文件。
P.S。还有组合框。
代码将 table 视为没有合并单元格的二维数组。最好的方法是将它应用于 table 符合这些标准的部分,例如其中没有合并单元格。
根据文档之间结构的固定程度或变化程度,这可能很容易也可能非常困难。
假设你需要的数据总是在同一个固定的地方,你可以将r变量设置为相关范围而不是整个sheet.
这适用于测试 sheet 我用几个不同的合并单元格情况进行了测试:
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
我有这个可以检索 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
sheet 姓名:personfile
Name Age Gender
John 5 M
Jane 4 F
然后 xml 文件将 return 这样。
<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 文件合并单元格时,它 returns
ERROR: Index and length must refer to a location within the string
Parameter name: length
这是我应该检索的示例 excel 文件。
P.S。还有组合框。
代码将 table 视为没有合并单元格的二维数组。最好的方法是将它应用于 table 符合这些标准的部分,例如其中没有合并单元格。
根据文档之间结构的固定程度或变化程度,这可能很容易也可能非常困难。
假设你需要的数据总是在同一个固定的地方,你可以将r变量设置为相关范围而不是整个sheet.
这适用于测试 sheet 我用几个不同的合并单元格情况进行了测试:
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