【问题标题】:Is there any way to export data from DataGridView to an Excel spreadsheet continously?有没有办法将数据从 DataGridView 连续导出到 Excel 电子表格?
【发布时间】:2020-09-02 21:41:43
【问题描述】:

所以我在 VB.NET 中编写了一个图形用户界面,它允许用户从 Arduino Uno 的串行监视器读取数据。问题是我只能在测量结束时使用以下代码导出数据:

Private Sub Button_Save_To_Excel_Click(sender As Object, e As EventArgs) Handles Button_Save_To_Excel.Click

        Button_Save_To_Excel.Height = 37
        Button_Save_To_Excel.Text = "Please Wait..."
        Button_Save_To_Excel.Enabled = False
        Button_Start_Recording.Enabled = False
        ProgressBar_Save_To_Excel.Visible = True
        ProgressBar_Save_To_Excel.Value = 1

        Dim xlApp As Microsoft.Office.Interop.Excel.Application
        Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook
        Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet
        Dim misValue As Object = System.Reflection.Missing.Value
        Dim i As Integer
        Dim j As Integer

        ProgressBar_Save_To_Excel.Value = 3

        xlApp = New Microsoft.Office.Interop.Excel.Application
        xlWorkBook = xlApp.Workbooks.Add(misValue)
        xlWorkSheet = xlWorkBook.Sheets(1)

        ProgressBar_Save_To_Excel.Value = 5

        For i = 0 To DataGridView1.RowCount - 2
            For j = 0 To DataGridView1.ColumnCount - 1
                For k As Integer = 1 To DataGridView1.Columns.Count
                    xlWorkSheet.Cells(1, k) = DataGridView1.Columns(k - 1).HeaderText
                    xlWorkSheet.Cells(i + 2, j + 1) = DataGridView1(j, i).Value.ToString()
                Next
            Next
        Next

        ProgressBar_Save_To_Excel.Value = 8

        Dim savePath As String = Nothing
        Using sd As New SaveFileDialog
            With sd
                .RestoreDirectory = True
                .Filter = "Excel XLS Files(*.xls)|*.xls|Excel Macro Embedded Files(*.xlsm)|*.xlsm|Excel XLSX Files(*.xlsx)|*.xlsx"
                .FilterIndex = 3
                If .ShowDialog = DialogResult.OK Then
                    savePath = .FileName
                End If
            End With
        End Using

        If savePath IsNot Nothing AndAlso savePath.Trim <> "" Then
            xlWorkBook.SaveAs(savePath, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue)
        End If

        xlWorkBook.Close(True, misValue, misValue)
        xlApp.Quit()

        ProgressBar_Save_To_Excel.Value = 10

        MsgBox("Successfully saved" & vbCrLf & "Files are saved at : " & savePath, MsgBoxStyle.Information, "Information")

        ProgressBar_Save_To_Excel.Visible = False

        Process.Start(savePath)

        Button_Save_To_Excel.Height = 50
        Button_Save_To_Excel.Text = "Save To MS Excel"
        Button_Save_To_Excel.Enabled = True
        Button_Start_Recording.Enabled = True


    End Sub

有什么方法可以修改代码,以便我可以用来自串行监视器的新数据不断覆盖现有的 Excel 文件?我尝试为此使用循环但没有任何成功。

图形用户界面将用作数据采集系统,可以记录数小时甚至数天的数据。出于这个原因,我不能只在测量结束后导出数据。如果发生停电,所有测量数据都将丢失。

【问题讨论】:

  • 好吧,您可以将数据记录到文件中,然后按需拍摄快照数据,然后将其导出到 Excel。因此,您既可以保留数据,又可以在 Excel 用户界面中轻松查看数据。

标签: excel vb.net user-interface


【解决方案1】:
  1. 您不需要使用 Microsoft.Office.Interop.Excel.Application 来创建 Excel 文件的唯一目的。为此有更好的库
  2. 您可以通过 ADO.net 使用 Excel,所有操作都可以通过常规 ADO.net 方式完成,就像它是一个 DB 表一样。这是示例https://stackoverflow.com/a/16296106/1704458
  3. 这里的关键 - 使用数据绑定。然后,您不要将行添加到网格,而是将它们添加到数据源对象 - 数据表/数据视图。在 DataAdupter 上设置 UPDDATE 命令并连接触发器以调用 dataAdapter.Update

而且你不需要按下按钮

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多