将多个datagridviews导出到excelsheet

时间:2018-02-18 20:13:07

标签: excel-vba datagridview checkedlistbox vba excel

我是视觉工作室的新手。

我想根据是否在checkedlist框中选中,将多个表单中的不同datagridviews导出到excel工作簿,作为同一工作簿上的不同工作表。

基本上我正在为我们学校的日常清单做位置,用户可以在每个楼层的相应表格上明智地输出清单,但也可以根据其登记的清单箱导出包含差异楼层的多表工作簿,有什么帮助吗?我被困在checkedlistbox。目前我正在做如下:但在第二张表中给了我一个例外。

Private Sub Button1_Click(发件人为对象,e为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

End Sub

1 个答案:

答案 0 :(得分:0)

很难理解你想要做什么。根据我的解释,似乎有三(3)个不同的WindowsForm开放。主要有效表单包含ButtonCheckedListBox。另外两种形式(Form7,Form8)每个都有DataGridView和一些数据。

我假设CheckListBox允许用户选择导出到Excel时使用的表单。例如,如果用户选中第一个选项,然后单击该按钮,则DataGridView上的Form7将导出到Excel工作簿。如果选中第二个选项,则Form8的{​​{1}}将导出到同一工作簿。

我希望我有这个正确的。为了提供帮助,我建议你将问题分解成更小的部分。例如,查看检查列表框中检查状态的“if”语句中的代码......显然他们正在做同样的事情。唯一的区别是DataGridView和工作表的名称。

它看起来像一个方法,它将工作簿添加到工作表中,导出DataGridView,最后输出工作表名称的字符串...可能会派上用场。

DataGridView

此方法将使用给定的Private Sub AddGridToWorkbook(workbook As Workbook, dgv As DataGridView, sheetName As String) 作为新工作表的名称,将新工作表添加到给定工作簿。最后,该方法将遍历给定的sheetName并将值导出到新工作表。

当前发布的代码正在尝试通过网格行打印循环内的标题行。这将错过第一行数据。新excel工作表的标题行需要单独导出,并在循环外部通过网格行。

最后,我很好奇DataGridViewForm7是什么......如果这些是Form8“类”......那么声明:......

WindowsForm

这不会像你期望的那样工作...... worksheet.Cells(cellRowIndex, cellColumnIndex) = Form7.DataGridView1.Rows(i).Cells(j).Value.ToString() 是一个“类”,你就像实例化对象一样使用它。

在下面的示例中,我有两个Form7的“类”,称为“Form7”和“Form8”。当主窗体加载时,我实例化并显示这两种形式。示例:创建全局变量表单。

WindowsForm

然后在加载时显示表单。

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

现在,前一行代码将使用名为form7.Show() form8.Show() 的实例化“Form7”对象。

form7

修改导出网格的代码

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

希望这有帮助