Импорт данных Excel / Array в базу данных - PullRequest
0 голосов
/ 25 июня 2019

Я пишу код на VB, чтобы иметь сайт компании с обновленной информацией о сотрудниках.Моя цель состояла в том, чтобы: собрать определенные данные из файла Excel. Сохранить данные в 2D-массив. Обновить данные массива в базе данных, доступной веб-сайту, создать веб-сайт и легко использовать данные базы данных (чтобы сайт можно было легко редактировать).

У меня возникли две проблемы:

  1. Я использовал Try & Catch для разрешения исключения Nullreference на пустых ячейках - сценарий очень медленный при чтении столбцов с большим количеством пустых ячеек
  2. Я не знаю, как правильно поместить собранные данные в базу данных (sql accces / не важно)

В настоящее время мы используем файл Excel с макросами и Excel VB для генерациисайт (с выводом, напрямую записанным в html-файл - так что он очень статичен ..)

Из-за личной информации сотрудника я не могу поделиться файлом Excel, но я поделился кодом (я знаю, он немного неаккуратный)так как это первый раз, когда я работал с данными Excel, поэтому я сделал много «ре-редактирования» моего кода)

(в конце я добавил списокОбновление ox1 для проверки правильности добавления последней записи)

Если есть более эффективные решения (прямой импорт из Excel в базу данных), пожалуйста, поделитесь :)

Спасибо всем заранее!

Imports Excel = Microsoft.Office.Interop.Excel

Public Class WieiswieForm
    Private Sub WieiswieForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Public Sub ChoseFile_Click(sender As Object, e As EventArgs) Handles ChoseFile.Click
        OpenFileDialog1.Filter = "Excel | *.xlsm"
        Dim result As DialogResult = OpenFileDialog1.ShowDialog()
        FileTextBox.Text = OpenFileDialog1.FileName
        UpdateButton.Enabled = True

    End Sub


    Public Sub UpdateButton_Click(sender As Object, e As EventArgs) Handles UpdateButton.Click

        UpdateButton.Enabled = False

        ListBox1.Items.Add(DateAndTime.Now.ToString & ": starten...")

        Dim Filepath As String = OpenFileDialog1.FileName
        Dim Afdeling_cell As String = "C"
        Dim Functie_cell As String = "D"
        Dim Naam_cell As String = "E"
        Dim Organistaie_cell As String = "N"
        Dim Badgenummer_cell As String = "R"
        Dim Draagbaar_cell As String = "Y"
        Dim VastNummer_cell As String = "X"
        Dim GSM_cell As String = "AB"
        Dim Werkrooster_cell As String = "AE"
        Dim Normtijd_cell As String = "AF"
        Dim Afwezigheid_cell As String = "AG"
        Dim Vestiging_cell As String = "AI"

        Dim Cell_index(11) As String
        Cell_index(0) = Naam_cell
        Cell_index(1) = Afdeling_cell
        Cell_index(2) = Functie_cell
        Cell_index(3) = Organistaie_cell
        Cell_index(4) = Vestiging_cell
        Cell_index(5) = Werkrooster_cell
        Cell_index(6) = VastNummer_cell
        Cell_index(7) = Draagbaar_cell
        Cell_index(8) = GSM_cell
        Cell_index(9) = Afwezigheid_cell
        Cell_index(10) = Badgenummer_cell
        Cell_index(11) = Normtijd_cell


        If Filepath = "" Then
            MsgBox("Geen bestand geselecteerd..")

        Else
            ListBox1.Items.Add(DateAndTime.Now.ToString & ": Excel bestand openen...")
            Dim range As Excel.Range
            Dim file As System.IO.StreamWriter


            ' Get the Excel application object.
            Dim excel_app As New Excel.ApplicationClass()

            ' Make Excel visible (optional).
            excel_app.Visible = False

            ' Open the workbook read-only.
            Dim workbook As Excel.Workbook =
        excel_app.Workbooks.Open(
        Filename:=Filepath, ReadOnly:=True)

            ' Get the first worksheet.
            Dim sheet As Excel.Worksheet =
        DirectCast(workbook.Sheets(1), Excel.Worksheet)

            ' Get the number of rows (to avoid an index out-of-range)
            Dim LastRow As Integer
            LastRow = sheet.UsedRange.Rows.Count

            '################## SUB START

            'Create the data array
            ListBox1.Items.Add(DateAndTime.Now.ToString & ": data verzamel object maken...")
            Dim DataArray(11, LastRow - 1) As String

            'Create the object to retrieve the data from the range 
            Dim saRet(,) As Object
            Dim iRows As Long
            Dim iCols As Long

            ' #########################################################################################

            ' Start the data colletion loop
            Dim arrayindex1 As Integer = 0
            Dim arrayindex2 As Integer = 0
            Dim c As Integer = 0

            ProgressBar1.Value = 10

            'Namen oplijsten :
            ListBox1.Items.Add(DateAndTime.Now.ToString & ": namen ophalen...")
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'Afdeling ophalen
            ListBox1.Items.Add(DateAndTime.Now.ToString & ": afdelingen ophalen...")
            ProgressBar1.Value = 20
            c = c + 1 '1
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'Functie binnen de afdeling : 
            ListBox1.Items.Add(DateAndTime.Now.ToString & ": functies ophalen...")
            ProgressBar1.Value = 30
            c = c + 1 '2
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'Organisatie ophalen

            ListBox1.Items.Add(DateAndTime.Now.ToString & ": organisaties ophalen...")
            ProgressBar1.Value = 40
            c = c + 1 '3
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'Vestiging ophalen

            ListBox1.Items.Add(DateAndTime.Now.ToString & ": vestigingen ophalen...")
            ProgressBar1.Value = 50
            c = c + 1 '4
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'werkrooster ophalen

            ListBox1.Items.Add(DateAndTime.Now.ToString & ": werkroosters ophalen...")
            ProgressBar1.Value = 60
            c = c + 1 '5
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'vastnummer ophalen

            ListBox1.Items.Add(DateAndTime.Now.ToString & ": vaste telefoonnummers ophalen...")
            ProgressBar1.Value = 70
            c = c + 1 '6
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'draagpaar ophalen

            ListBox1.Items.Add(DateAndTime.Now.ToString & ": draagbarenummers ophalen...")
            ProgressBar1.Value = 75
            c = c + 1 '7
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'GSM ophalen

            ListBox1.Items.Add(DateAndTime.Now.ToString & ": GSM nummers ophalen...")
            ProgressBar1.Value = 80
            c = c + 1 '8
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'Afwezigheden ophalen
            ListBox1.Items.Add(DateAndTime.Now.ToString & ": Afwezigheden nummer ophalen...")
            ProgressBar1.Value = 85
            c = c + 1 '9
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'Badgenummers ophalen
            ListBox1.Items.Add(DateAndTime.Now.ToString & ": badgenummers ophalen...")
            ProgressBar1.Value = 90
            c = c + 1 '10
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)

            'Normtijd ophalen
            ListBox1.Items.Add(DateAndTime.Now.ToString & ": Normtijd ophalen...")
            ProgressBar1.Value = 95
            c = c + 1 '10
            arrayindex1 = arrayindex1 + 1
            arrayindex2 = 0
            MaakArray(arrayindex1, arrayindex2, c, sheet, LastRow, range, saRet, iRows, iCols, Cell_index, DataArray)



            ' Save the changes and close the workbook.
            workbook.Close(SaveChanges:=False)

            ' Close the Excel server.
            excel_app.Quit()

            ProgressBar1.Value = 100

            ListBox1.Items.Add(DateAndTime.Now.ToString & ": Bestand opgeladen!")
            ListBox1.Items.Add(DataArray(0, 501) & " " & DataArray(1, 501) & " " & DataArray(2, 501) & " " & DataArray(3, 501) & DataArray(4, 501) & DataArray(5, 501) & DataArray(6, 501) & DataArray(7, 501) & DataArray(8, 501))
            UpdateButton.Enabled = True
            MsgBox((DataArray(0, 501) & " " & DataArray(1, 501) & " " & DataArray(2, 501) & " " & DataArray(3, 501) & " " & DataArray(4, 501) & " " & DataArray(5, 501) & " " & DataArray(6, 501) & " " & DataArray(7, 501) & " " & DataArray(8, 501) & " " & DataArray(9, 501) & " " & DataArray(10, 501)))
        End If
    End Sub




Sub MaakArray(arrayindex1 As Integer, arrayindex2 As Integer, c As Integer, sheet As Excel.Worksheet, LastRow As Integer, range As Excel.Range, saret As Object, iRows As Long, iCols As Long, Cell_index() As String, ByRef DataArray(,) As String)


    Dim LoopTime As Integer = 0
    Do Until LoopTime = 11

        'Get a range of data.
        range = sheet.Range(Cell_index(c) & "2", Cell_index(c) & LastRow)

        'Retrieve the data from the range.
        saret = range.Value

        'Determine the dimensions of the array.
        iRows = saret.GetUpperBound(0)
        iCols = saret.GetUpperBound(1)

        'Build a string that contains the data of the array.
        Dim valueString As String
        'valueString = "" + vbCrLf



        Dim rowCounter As Long
        Dim colCounter As Long
        Dim i As Integer
        For rowCounter = 1 To iRows
            For colCounter = 1 To iCols


                'Write the next value into the string.

                Try
                    valueString = saret(rowCounter, colCounter).ToString()
                    'If String.IsNullOrEmpty(valueString) Then
                    'valueString = ""
                    ' End If
                Catch
                    valueString = ""

                End Try



                DataArray(arrayindex1, arrayindex2) = valueString


                If arrayindex2 = LastRow - 1 Then
                    arrayindex2 = arrayindex2
                Else
                    arrayindex2 = arrayindex2 + 1
                End If


                ProgressBar1.Value = ProgressBar1.Value + 1 / 10

            Next colCounter

        Next rowCounter
        LoopTime = LoopTime + 1

    Loop


    '#########################################################################


    End Sub
End Class

1 Ответ

0 голосов
/ 26 июня 2019

Просто ради ухмылки попробуйте следующее и посмотрите, что вы получите.Возможно, вам придется настроить HDR = YES на HDR = NO в строке подключения.Добавьте DataGridView к вашей форме, чтобы вы могли видеть результаты.По крайней мере, это познакомит вас с поставщиком данных для Excel.Если у вас есть DataTable, вы можете обновить базу данных, если у вас есть первичный ключ.

Добавить в начало файла

Импортировать System.Data.OleDb

Вкод формы

Private Sub btnLoadGrid_Click(sender As Object, e As EventArgs) Handles btnLoadGrid.Click
    Dim dt As New DataTable
    Dim strFileName As String = "Your file path"
    Dim strCon As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={strFileName};Extended Properties=""Excel 12.0;HDR=YES;"""
    Using cn = New OleDbConnection(strCon)
        Debug.Print(cboSheets.Text)
        Using cmd As New OleDbCommand($"Select * From [Sheet1$];", cn)
            cn.Open()
            Using dr As OleDbDataReader = cmd.ExecuteReader
                dt.Load(dr)
            End Using
        End Using
    End Using
    DataGridView1.DataSource = dt
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...