Импорт файла Excel в существующий DataGridView в VB.Net - PullRequest
0 голосов
/ 26 февраля 2019

У меня проблема с приведенным ниже кодом, который зависает и ничего не делает во время работы.

ИНФРАСТРУКТУРА: Visual Studio 2017 .NET Framework 4.7.2 ОС: Windows 7

ЦЕЛЬ: У меня естьDataGridView, который имеет 3 столбца, я перечисляю некоторую информацию в этом DataGridView из другого источника, чтобы заполнить первую и вторую строку.

Первая строка - это имя параметра, а вторая - текущее значение этого параметра.

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

Я пытаюсь использовать приведенный ниже код для заполнения значения параметра DataGridView из листа Excel, для которого я использую базу данных;

Некоторые параметры не сохраняются в Excelна самом деле, мне нужна функция типа vlookup для сопоставления данных с именем параметра.

В Excel столбец - это имя моего параметра, а столбец B - значение базы данных параметра.

I 'Я пытаюсь импортировать этот Excel и пытаться сопоставить имена параметров в DataGridView и Excel, если имя параметра совпадает, следует записать значение параметра Excel в 3-й столбец в DataGridView.

Public Class BuildImportExcel
    Public Shared Sub NewMethod(ByVal dgv As DataGridView)
        Dim ofd As OpenFileDialog = New OpenFileDialog With {
            .Filter = "Excel |*.xlsx",
            .Title = "Import Excel File"
        }
        ofd.ShowDialog()

        Try
            If ofd.FileName IsNot "" Then
                Dim xlApp As New Excel.Application
                If xlApp Is Nothing Then
                    MessageBox.Show("Excel is not properly installed!")
                Else
                    Dim xlBook As Excel.Workbook = xlApp.Workbooks.Open(ofd.FileName)
                    Dim xlSheet As Excel.Worksheet = CType(xlBook.ActiveSheet, Excel.Worksheet)

                    For i = 0 To dgv.Rows.Count
                        If dgv.Rows(i).Cells(0).Value IsNot "" Then
                            Dim look As Boolean = True
                            Dim found As Boolean = False
                            Dim rowLook As Integer = 2
                            Dim rowFound As Integer = 0
                            While look = True
                                If xlSheet.Range("A" & rowLook).Value IsNot "" Then
                                    If xlSheet.Range("A" & rowLook).Text Is dgv.Rows(i).Cells(0).Value Then
                                        found = True
                                        rowFound = rowLook
                                    End If
                                Else
                                    look = False
                                End If
                                rowLook = rowLook + 1
                            End While
                            If found = True Then
                                dgv.Rows(i).Cells(2).Value = xlSheet.Range("B" & rowFound).Text
                            End If
                        End If
                    Next
                    xlApp.Quit()
                    Release(xlSheet)
                    Release(xlBook)
                    Release(xlApp)
                End If
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
    Private Shared Sub Release(ByVal sender As Object)
        Try
            If sender IsNot Nothing Then
                Marshal.ReleaseComObject(sender)
                sender = Nothing
            End If
        Catch ex As Exception
            sender = Nothing
        End Try
    End Sub

End Class

Но проблема заключается не в том,Работая замораживание Я думал, что список параметров около 200 строк, поэтому он вызывает замораживание и попробуйте его небольшими порциями, как 5 параметров и все тот же.Кажется, что-то не так, и я не смог найти это.

Также это логический способ сопоставить их с этим методом, или вы предлагаете что-то вроде соединения OLEDB?

РЕДАКТИРОВАТЬ: я отключаю Option Strict и затем меняю IsNot на operator <>, а затемначать работать, но я хотел бы использовать Option Strict Как я могу обработать эти операторы?

1 Ответ

0 голосов
/ 27 февраля 2019

Вы делаете это сложнее, чем должно быть.Сомнительной и проблемной областью является цикл While look = True.Это предполагает много и, в моем тесте, заставит код часто зависать.Основная проблема здесь в том, что код (несколько) циклически перебирает строки из файла Excel.Проблема здесь в том, что вы не ЗНАЕТЕ, как могут быть строки!Это не проверяется, и код не будет отображаться в строке…

  If xlSheet.Range("A" & rowLook).Value IsNot "" Then

Когда вы достигнете нижней части данного файла Excel и никогда не найдете совпадения.

Другая проблема заключается влиния ...

If xlSheet.Range("A" & rowLook).Text Is dgv.Rows(i).Cells(0).Value Then 

Это ВСЕГДА потерпит неудачу и никогда не будет правдой.Мое понимание ...

Оператор Is определяет, ссылаются ли две ссылки на один и тот же объект.Однако он не выполняет сравнения значений.

Учитывая это, я рекомендую вам немного упростить вещи.Наиболее важными являются циклы на листе Excel, которые являются «дорогими», и если строк много, у вас могут возникнуть проблемы с производительностью.Когда я говорю много строк, я имею в виду десятки тысяч строк ...200 строк должно быть в порядке.

Это не усложнит ситуацию, если мы сможем определить, сколько строк из рабочего листа возвращается из….

 Dim xlSheet As Excel.Worksheet = CType(xlBook.ActiveSheet, Excel.Worksheet)

Это в основном Excel Rangeи именно из этого Range мы можем получить количество строк в этом диапазоне Excel с помощью…

   Dim totalExcelRows = xlSheet.UsedRange.Rows.Count

Теперь вместо сложного и проблемного цикла While мы можем заменить его напростая for петля.Это исключит некоторые переменные и сохранит индекс цикла в диапазоне строк в файле Excel.

Надеюсь, это имеет смысл ... ниже приведен пример того, что описано выше.

Public Shared Sub NewMethod(ByVal dgv As DataGridView)
    Dim ofd As OpenFileDialog = New OpenFileDialog With {
        .Filter = "Excel |*.xlsx",
        .Title = "Import Excel File",
        .InitialDirectory = "D:\\Test\\ExcelFiles"
    }
    ofd.ShowDialog()
    Try
        If ofd.FileName IsNot "" Then
            Dim xlApp As New Excel.Application
            If xlApp Is Nothing Then
                MessageBox.Show("Excel is not properly installed!")
            Else
                Dim xlBook As Excel.Workbook = xlApp.Workbooks.Open(ofd.FileName)
                Dim xlSheet As Excel.Worksheet = CType(xlBook.ActiveSheet, Excel.Worksheet)
                Dim totalExcelRows = xlSheet.UsedRange.Rows.Count
                For i = 0 To dgv.Rows.Count
                    If dgv.Rows(i).Cells(0).Value IsNot Nothing Then
                        For excelRow = 1 To totalExcelRows
                            If xlSheet.Range("A" & excelRow).Text.ToString() = dgv.Rows(i).Cells(0).Value.ToString() Then
                                dgv.Rows(i).Cells(2).Value = xlSheet.Range("B" & excelRow).Text
                                Exit For
                            End If
                        Next
                    Else
                        Exit For
                    End If
                Next
                xlApp.Quit()
                Marshal.ReleaseComObject(xlSheet)
                Marshal.ReleaseComObject(xlBook)
                Marshal.ReleaseComObject(xlApp)
            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...