OpenXmlReader 没有从 excel .xlsx sheet VB Net 中提取所有单元格内容
OpenXmlReader is not extracting all the cell contents from an excel .xlsx sheet VB Net
OpenXmlReader 没有从 excel.xlsx sheet
中提取所有单元格内容
我有一些代码最初是从 SO 中提取并转换为 VB Net: Using OpenXmlReader
我的代码循环遍历了作品的前 14 行sheet,没有任何问题,但之后将找不到任何单元格。
reader.ElementType 似乎找到 rows 超过 14(如果 reader.ElementType Is GetType(Row) Then),但没有更多 cells (GetType(单元格))
提取的最后一个单元格是 L14,但是 excel 文件的单元格内容最多为 L29。
源代码:
Public Shared Function fncParseXLSXorXLSM(strFileName As String, sbTxtFromFile As StringBuilder) As StringBuilder
sbTxtFromFile.Length = 0
Dim intFirst As Integer = 1
Try
Using spreadsheetDocument__1 As SpreadsheetDocument = SpreadsheetDocument.Open(strFileName, False)
Dim workbookPart As WorkbookPart = spreadsheetDocument__1.WorkbookPart
Dim sharedStringItemsArray As SharedStringItem() = workbookPart.SharedStringTablePart.SharedStringTable.Elements(Of SharedStringItem)().ToArray()
Dim sheets As DocumentFormat.OpenXml.Spreadsheet.Sheets = spreadsheetDocument__1.WorkbookPart.Workbook.Sheets
' For each sheet, display the sheet information.
For Each sheet As DocumentFormat.OpenXml.OpenXmlElement In sheets
For Each attr As DocumentFormat.OpenXml.OpenXmlAttribute In sheet.GetAttributes()
Debug.Print("{0}: {1}", attr.LocalName, attr.Value)
If attr.LocalName = "state" And attr.Value = "hidden" Then
Debug.Print("{0}: {1}", attr.LocalName, attr.Value)
End If
Next
Next
For Each worksheetPart As WorksheetPart In workbookPart.WorksheetParts
Dim reader As OpenXmlReader = OpenXmlReader.Create(worksheetPart)
While reader.Read()
If reader.ElementType Is GetType(Row) Then
reader.ReadFirstChild()
Do
If reader.ElementType Is GetType(Cell) Then
Dim c As Cell = DirectCast(reader.LoadCurrentElement(), Cell)
Debug.Print(c.CellReference.ToString)
'********************************************************************
' Placed here to identify the last row openXmlReader seems to get to
'********************************************************************
If c.CellReference.ToString = "L14" Then
Stop
End If
'********************************************************************
' Placed here to identify the last row openXmlReader seems to get to
'********************************************************************
If c.DataType IsNot Nothing AndAlso c.DataType.Value.ToString = "SharedString" Then
'Dim ssi As SharedStringItem = workbookPart.SharedStringTablePart.SharedStringTable.Elements(Of SharedStringItem)().ElementAt(Integer.Parse(c.CellValue.InnerText))
Dim ssi As SharedStringItem = sharedStringItemsArray(Integer.Parse(c.CellValue.InnerText))
If Not ssi.Text Is Nothing Then
If Not ssi.Text.Text Is Nothing Then
If intFirst = 1 Then
sbTxtFromFile.Append(ssi.Text.Text)
intFirst = 2
Else
sbTxtFromFile.Append(Environment.NewLine & ssi.Text.Text)
End If
End If
Else
If Not ssi.InnerText Is Nothing Then
If ssi.InnerText Like "*Total of 25 CP TR Units*" Then
Stop
End If
If intFirst = 1 Then
sbTxtFromFile.Append(ssi.InnerText)
intFirst = 2
Else
sbTxtFromFile.Append(Environment.NewLine & ssi.InnerText)
End If
End If
End If
Else
If Not c.CellValue Is Nothing Then
If intFirst = 1 Then
sbTxtFromFile.Append(c.CellValue.InnerText)
intFirst = 2
Else
sbTxtFromFile.Append(Environment.NewLine & c.CellValue.InnerText)
End If
End If
End If
End If
Loop While reader.ReadNextSibling()
End If
If sbTxtFromFile.Length > 0 Then
sbTxtFromFile.Append(Environment.NewLine)
End If
End While
Next
End Using
Return sbTxtFromFile
Catch ex As Exception
If ex.Message Like "The process cannot access the file '*" Then 'File in use
sbTxtFromFile.Append("|11readonly11|")
End If
'MsgBox(ex.ToString)
End Try
End Function
这是 .xlsx 文件的 link:
https://drive.google.com/file/d/0B7UpFja70T8_X1p5dzdPX3o3UzQ/view?usp=sharing
虽然不是我想要的答案(我相信我仍然可以 return 使用我的原始代码的所有单元格),但我通过删除外部 'IF' 语句解决了我的问题正在查找行,读取第一个 child 并遍历所有兄弟姐妹。
代码现在只查找单元格和 return 值的元素。
'Previous Code
While reader.Read()
If reader.ElementType Is GetType(Row) Then
reader.ReadFirstChild()
Do
If reader.ElementType Is GetType(Cell) Then
'Code Here
End If
Loop While reader.ReadNextSibling()
End If
End While
'New Code
While reader.Read()
'If reader.ElementType Is GetType(Row) Then
'reader.ReadFirstChild()
'Do
If reader.ElementType Is GetType(Cell) Then
Do
'Code Here
Loop While reader.ReadNextSibling()
End If
'Loop While reader.ReadNextSibling()
'End If
End While
OpenXmlReader 没有从 excel.xlsx sheet
中提取所有单元格内容我有一些代码最初是从 SO 中提取并转换为 VB Net: Using OpenXmlReader
我的代码循环遍历了作品的前 14 行sheet,没有任何问题,但之后将找不到任何单元格。
reader.ElementType 似乎找到 rows 超过 14(如果 reader.ElementType Is GetType(Row) Then),但没有更多 cells (GetType(单元格))
提取的最后一个单元格是 L14,但是 excel 文件的单元格内容最多为 L29。
源代码:
Public Shared Function fncParseXLSXorXLSM(strFileName As String, sbTxtFromFile As StringBuilder) As StringBuilder
sbTxtFromFile.Length = 0
Dim intFirst As Integer = 1
Try
Using spreadsheetDocument__1 As SpreadsheetDocument = SpreadsheetDocument.Open(strFileName, False)
Dim workbookPart As WorkbookPart = spreadsheetDocument__1.WorkbookPart
Dim sharedStringItemsArray As SharedStringItem() = workbookPart.SharedStringTablePart.SharedStringTable.Elements(Of SharedStringItem)().ToArray()
Dim sheets As DocumentFormat.OpenXml.Spreadsheet.Sheets = spreadsheetDocument__1.WorkbookPart.Workbook.Sheets
' For each sheet, display the sheet information.
For Each sheet As DocumentFormat.OpenXml.OpenXmlElement In sheets
For Each attr As DocumentFormat.OpenXml.OpenXmlAttribute In sheet.GetAttributes()
Debug.Print("{0}: {1}", attr.LocalName, attr.Value)
If attr.LocalName = "state" And attr.Value = "hidden" Then
Debug.Print("{0}: {1}", attr.LocalName, attr.Value)
End If
Next
Next
For Each worksheetPart As WorksheetPart In workbookPart.WorksheetParts
Dim reader As OpenXmlReader = OpenXmlReader.Create(worksheetPart)
While reader.Read()
If reader.ElementType Is GetType(Row) Then
reader.ReadFirstChild()
Do
If reader.ElementType Is GetType(Cell) Then
Dim c As Cell = DirectCast(reader.LoadCurrentElement(), Cell)
Debug.Print(c.CellReference.ToString)
'********************************************************************
' Placed here to identify the last row openXmlReader seems to get to
'********************************************************************
If c.CellReference.ToString = "L14" Then
Stop
End If
'********************************************************************
' Placed here to identify the last row openXmlReader seems to get to
'********************************************************************
If c.DataType IsNot Nothing AndAlso c.DataType.Value.ToString = "SharedString" Then
'Dim ssi As SharedStringItem = workbookPart.SharedStringTablePart.SharedStringTable.Elements(Of SharedStringItem)().ElementAt(Integer.Parse(c.CellValue.InnerText))
Dim ssi As SharedStringItem = sharedStringItemsArray(Integer.Parse(c.CellValue.InnerText))
If Not ssi.Text Is Nothing Then
If Not ssi.Text.Text Is Nothing Then
If intFirst = 1 Then
sbTxtFromFile.Append(ssi.Text.Text)
intFirst = 2
Else
sbTxtFromFile.Append(Environment.NewLine & ssi.Text.Text)
End If
End If
Else
If Not ssi.InnerText Is Nothing Then
If ssi.InnerText Like "*Total of 25 CP TR Units*" Then
Stop
End If
If intFirst = 1 Then
sbTxtFromFile.Append(ssi.InnerText)
intFirst = 2
Else
sbTxtFromFile.Append(Environment.NewLine & ssi.InnerText)
End If
End If
End If
Else
If Not c.CellValue Is Nothing Then
If intFirst = 1 Then
sbTxtFromFile.Append(c.CellValue.InnerText)
intFirst = 2
Else
sbTxtFromFile.Append(Environment.NewLine & c.CellValue.InnerText)
End If
End If
End If
End If
Loop While reader.ReadNextSibling()
End If
If sbTxtFromFile.Length > 0 Then
sbTxtFromFile.Append(Environment.NewLine)
End If
End While
Next
End Using
Return sbTxtFromFile
Catch ex As Exception
If ex.Message Like "The process cannot access the file '*" Then 'File in use
sbTxtFromFile.Append("|11readonly11|")
End If
'MsgBox(ex.ToString)
End Try
End Function
这是 .xlsx 文件的 link:
https://drive.google.com/file/d/0B7UpFja70T8_X1p5dzdPX3o3UzQ/view?usp=sharing
虽然不是我想要的答案(我相信我仍然可以 return 使用我的原始代码的所有单元格),但我通过删除外部 'IF' 语句解决了我的问题正在查找行,读取第一个 child 并遍历所有兄弟姐妹。 代码现在只查找单元格和 return 值的元素。
'Previous Code
While reader.Read()
If reader.ElementType Is GetType(Row) Then
reader.ReadFirstChild()
Do
If reader.ElementType Is GetType(Cell) Then
'Code Here
End If
Loop While reader.ReadNextSibling()
End If
End While
'New Code
While reader.Read()
'If reader.ElementType Is GetType(Row) Then
'reader.ReadFirstChild()
'Do
If reader.ElementType Is GetType(Cell) Then
Do
'Code Here
Loop While reader.ReadNextSibling()
End If
'Loop While reader.ReadNextSibling()
'End If
End While