我是视觉工作室的新手。
我想根据是否在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
答案 0 :(得分:0)
很难理解你想要做什么。根据我的解释,似乎有三(3)个不同的WindowsForm
开放。主要有效表单包含Button
和CheckedListBox
。另外两种形式(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工作表的标题行需要单独导出,并在循环外部通过网格行。
最后,我很好奇DataGridView
和Form7
是什么......如果这些是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()
希望这有帮助