VB.NET - чтение всего содержимого файла Excel - PullRequest
1 голос
/ 05 октября 2011

Я уже знаю базовую процедуру чтения определенных ячеек файла .xls с помощью VB.NET, но не могу понять, как автоматически получить все данные из такого файла.

По сути, я получаю такие данные:

Dim xlApp As Excel.Application
Dim wb As Workbook
Dim ws As Worksheet
xlApp = New Excel.Application
wb = xlApp.Workbooks.Open("myfile.xls")
ws = wb.Worksheets("worksheet1")
For Each cell In ws.Range("A1", "C10")
     Console.WriteLine(cell.value)
Next

В этом случае я знаю, что в первых 10 строках столбцов A, B и C будет контент, но что бы мне пришлось делать, если бы у меня был огромный документ, размер и содержание которого могли бы даже меняться со временем на время? Я знаю, что есть также атрибут ws.rows.count, но он всегда возвращает большое значение, например 60000, даже если занято всего несколько строк.

Так что в основном я ищу простой способ перебрать все используемые строки файла Excel с возможностью доступа к каждой ячейке в этой строке.

Ответы [ 5 ]

1 голос
/ 05 октября 2011

в VBA - в отличие от VB.NEt (поэтому я могу не попасть в цель), вы можете использовать

ActiveSheet.UsedRange
MsgBox ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

(первая строка, необходимая для «сброса» UsedRange, SpecialCells(xlCellTypeLastCell) часто дает больший диапазон, чем на самом деле), или чаще

или

Dim rng1 As Range
Set rng1 = ActiveSheet.Cells.Find("*", [a1], xlValues, , xlByRows, xlPrevious)
If Not rng1 Is Nothing Then MsgBox rng1.Row
0 голосов
/ 19 августа 2015

Dim aDataTemp = xl.Worksheets (sSheetName) .UsedRange.value

0 голосов
/ 06 октября 2011

Spire.XLS легко использовать для чтения всех доступных ячеек, например:

Dim workbook As New Workbook
workbook.LoadFromFile("your-excel-file.xls")
Dim worksheet As Worksheet = workbook.Worksheets(0)
Dim range As CellRange = worksheet.AllocatedRange
Console.WriteLine("LastRow Index: {0}, LastColumn Index:{1}", range.LastRow, range.LastColumn)
For Each cell As CellRange In range.Cells
    If cell.IsBlank Then
        Continue For
    End If
    Console.WriteLine("{0} = {1}", cell.RangeAddressLocal, cell.Value2)    
Next                                                                   
0 голосов
/ 05 октября 2011

Вот пример, который я использовал в прошлом.

Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click

        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet

        xlApp = New Excel.ApplicationClass
        xlWorkBook = xlApp.Workbooks.Open("c:\test1.xlsx")
        xlWorkSheet = xlWorkBook.Worksheets("sheet1")
        'display the cells value B2
        MsgBox(xlWorkSheet.Cells(2, 2).value)
        'edit the cell with new value
        xlWorkSheet.Cells(2, 2) = "http://vb.net-informations.com"
        xlWorkBook.Close()
        xlApp.Quit()

        releaseObject(xlApp)
        releaseObject(xlWorkBook)
        releaseObject(xlWorkSheet)

    End Sub

    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub

End Class
0 голосов
/ 05 октября 2011

Все еще в VBA, мы часто используем оператор End для такого рода проблем:

ws.Cells(Rows.Count, "A").End(xlUp).Row

Измените имя или номер столбца в соответствии с вашими потребностями (или найдите его так же, какпоследний ряд с End(xlLeft)

...