OpenXmlReader不是从一个excel .xlsx表格VB网页中提取所有的单元格内容

OpenXmlReader不从Excel .xlsx表单中提取所有单元格内容

我有一些原来从SO采取的代码,并转换为VBnetworking: 使用OpenXmlReader

我的代码在工作表的前14行循环,没有任何问题,但是不会再find任何单元格。

reader.ElementType似乎查找 14(如果reader.ElementType是GetType(Row)Then),但没有更多的单元格 (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文件的链接:

https://drive.google.com/file/d/0B7UpFja70T8_X1p5dzdPX3o3UzQ/view?usp=sharing

虽然不是我想要的答案(我相信我应该仍然能够使用我的原始代码返回所有单元格),但我已经通过删除正在查找该行的外部“IF”语句来解决我的问题,读取第一个子元素并循环通过所有的兄弟姐妹。 现在的代码只是find单元格的元素并返回值。

 '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