将多个数据网格视图导出到 Excel 工作表的不同选项卡

Exporting multiple datagridviews to different tabs of excelsheet

我是 visual studio 的新手。

我想将不同的数据网格视图从多个表单导出到一个 excel 工作簿,作为同一工作簿上的不同 sheet,这取决于它是否在检查列表框中被选中。

基本上,我正在为我们学校做一个基于位置的每日清单,用户可以在每个楼层的相应表格上明智地导出清单,但也可以导出包含不同楼层的多个 sheet 工作簿作为根据其签入的清单框,有什么帮助吗?我被困在检查列表框。目前我正在做如下:但在第二个 sheet.

给了我一个例外

Private Sub Button1_Click(sender As Object, e As EventArgs) 句柄 Button1.Click

Dim excel As Microsoft.Office.Interop.Excel._Application = New Microsoft.Office.Interop.Excel.Application()

Dim workbook As Microsoft.Office.Interop.Excel._Workbook = excel.Workbooks.Add(Type.Missing)

Dim worksheet As Microsoft.Office.Interop.Excel._Worksheet = Nothing

Me.Cursor = Cursors.WaitCursor

Dim sheetnumber As Integer = 1

If CheckedListBox1.GetItemChecked(0) = True Then

    worksheet = workbook.Sheets(sheetnumber)

    sheetnumber = sheetnumber + 1

    worksheet.Name = "Anim_Check List_"

    Dim cellRowIndex As Integer = 1

    Dim cellColumnIndex As Integer = 1

    For i As Integer = 0 To Form7.DataGridView1.Rows.Count - 1

        For j As Integer = 0 To Form7.DataGridView1.Columns.Count - 1

            If cellRowIndex = 1 Then

                worksheet.Cells(cellRowIndex, cellColumnIndex) = Form7.DataGridView1.Columns(j).HeaderText

            Else
                worksheet.Cells(cellRowIndex, cellColumnIndex) = Form7.DataGridView1.Rows(i).Cells(j).Value.ToString()

            End If

            cellColumnIndex += 1

        Next

        cellColumnIndex = 1

        cellRowIndex += 1

    Next

End If

If CheckedListBox1.GetItemChecked(1) = True Then

    workbook.Worksheets.Add(sheetnumber)

    excel.Worksheets(sheetnumber).activate

    sheetnumber = sheetnumber + 1

    worksheet.Name = "Edits 1-5_"

    Dim cellRowIndex As Integer = 1

    Dim cellColumnIndex As Integer = 1

    For i As Integer = 0 To Form8.DataGridView1.Rows.Count - 1

        For j As Integer = 0 To Form8.DataGridView1.Columns.Count - 1

            If cellRowIndex = 1 Then

                worksheet.Cells(cellRowIndex, cellColumnIndex) = Form8.DataGridView1.Columns(j).HeaderText

            Else

                worksheet.Cells(cellRowIndex, cellColumnIndex) = Form8.DataGridView1.Rows(i).Cells(j).Value.ToString()

            End If

            cellColumnIndex += 1

        Next

        cellColumnIndex = 1

        cellRowIndex += 1

    Next

End If

Dim saveDialog As New SaveFileDialog()

saveDialog.FileName = workbook.Name

saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*"

saveDialog.FilterIndex = 1


If saveDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then

    workbook.SaveAs(saveDialog.FileName)

    MessageBox.Show("Export Successful")

End If

结束子

很难理解您要做什么。据我所知,似乎打开了三 (3) 个不同的 WindowsForm。主要活动形式有一个 Button 和一个 CheckedListBox。其他两种形式(Form7、Form8)各有一个 DataGridView 和一些数据。

我假设 CheckListBox 允许用户 select 在导出到 Excel 时使用哪个表单。例如,如果用户选中第一个选项,然后单击按钮,则 Form7 上的 DataGridView 将导出到 Excel 工作簿。如果选中第二个选项,则 Form8DataGridView 将导出到同一工作簿。

希望我没记错。为了提供帮助,我建议您将问题分解成更小的部分。例如,查看检查选中列表框中选中状态的两个“if”语句中的代码……很明显它们在做同样的事情。唯一的区别是 DataGridView 和作品名称 sheet.

它看起来像一个方法,它需要一个工作簿来添加 sheet,一个 DataGridView 来导出,最后一个字符串用于工作 sheet 名称......可能会进来方便。

Private Sub AddGridToWorkbook(workbook As Workbook, dgv As DataGridView, sheetName As String)

此方法将使用给定的 sheetName 作为新作品 sheet 的名称将新作品 sheet 添加到给定的工作簿。最后,该方法将循环遍历给定的 DataGridView 并将值导出到新工作 sheet.

当前发布的代码试图通过网格行打印循环内的 header 行。这将错过第一行数据。新 excel 作品的 header 行 sheet 需要通过网格行单独导出并在循环之外。

最后,我很好奇 Form7Form8 是什么...如果这些是 WindowsForm “Classes”... 那么声明:...

worksheet.Cells(cellRowIndex, cellColumnIndex) = Form7.DataGridView1.Rows(i).Cells(j).Value.ToString()

这不会像您预期的那样工作……Form7 是一个“Class”,您正在像实例化的 object.

一样使用它

在我下面的示例中,我有两个 WindowsForms “Classes”,分别称为“Form7”和“Form8”。当主窗体加载时,我实例化并显示这两个窗体。示例:创建全局变量 forms.

Dim form7 As Form7 = New Form7()
Dim form8 As Form8 = New Form8()

然后在加载时显示表格。

form7.Show()
form8.Show()

现在,上一行代码将使用名为 form7.

的实例化“Form7”object 工作
worksheet.Cells(cellRowIndex, cellColumnIndex) = form7.DataGridView1.Rows(i).Cells(j).Value.ToString()

修改代码以导出网格

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    excel.Visible = True
    Dim workbook = excel.Workbooks.Add()

    If CheckedListBox1.GetItemChecked(0) = True Then
        AddGridToWorkbook(workbook, form7.DataGridView1, "Anim_Check List_")
    End If

    If CheckedListBox1.GetItemChecked(1) = True Then
        AddGridToWorkbook(workbook, form8.DataGridView1, "Edits 1-5_")
    End If

    Dim saveDialog As New SaveFileDialog()
    saveDialog.FileName = workbook.Name
    saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*"
    saveDialog.FilterIndex = 1

    If saveDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
        workbook.SaveAs(saveDialog.FileName)
        MessageBox.Show("Export Successful")
    End If
End Sub

Private Sub AddGridToWorkbook(workbook As Workbook, dgv As DataGridView, sheetName As String)
    Try
        Dim worksheet As Worksheet = workbook.Worksheets.Add()
        worksheet.Name = sheetName
        AddHeaderRow(worksheet, dgv)
        For row As Integer = 0 To dgv.Rows.Count - 1
            For col As Integer = 0 To dgv.Columns.Count - 1
                If dgv.Rows(row).Cells(col).Value IsNot Nothing Then
                    worksheet.Cells(row + 2, col + 1) = dgv.Rows(row).Cells(col).Value.ToString()
                End If
            Next
        Next
    Catch ex As Exception
        MessageBox.Show("Ex: " + ex.Message)
    End Try
End Sub

Private Sub AddHeaderRow(worksheet As Worksheet, dgv As DataGridView)
    For col As Integer = 0 To dgv.Columns.Count - 1
        worksheet.Cells(1, col + 1) = dgv.Columns(col).HeaderText
    Next
End Sub

希望对您有所帮助