将datagridview中的数据排列成excel文件

我在VB.Net中有一个程序,看起来像这样。

在这里输入图像说明

我无法向您显示我的程序中的所有数据,因为它有很多数据。 但请专注于栏目Category 。 请假定我的程序中的所有数据在“ Category列中都有自己的唯一数据,并且每个项目可能都有如下的数据。

在这里输入图像说明

现在我创build了自己的Excel文件,看起来像这样。

在这里输入图像说明

现在,这里是我的目标,如果我点击我的程序中的所有数据将被导出到我的Excel文件,我有一个名为Print Final Transmittal的button。 我有一个解决scheme,我可以导出,但我的问题在这里是如何分组每个数据?

例如

所有具有Dry Goods的数据都将归入标题Dry Goods (Excel中的蓝色字)

这是我迄今为止所做的。 这是代码

  If DataGridView1.Rows.Count = 0 Then MsgBox("Nothing to export.") Else Dim ExcelApp As Object, ExcelBook As Object Dim ExcelSheet As Object Dim rowindex As Integer = 1 Dim total As Double = 0 ExcelApp = CreateObject("Excel.Application") ExcelBook = ExcelApp.Workbooks.Open("C:\SR Transmittal.xlsx") ExcelSheet = ExcelBook.WorkSheets("Transmittal Form") With ExcelSheet For i As Integer = 0 To DataGridView1.Rows.Count - 1 If DataGridView1.Item("Category", i).Value.ToString = "Dry Goods" Then Dim columnIndex As Integer = 0 ExcelSheet.Rows(i + 16).Insert() 'Inserts row! ExcelSheet.Cells(i + 15, columnIndex + 2).Value = DataGridView1.Item("Category", i).Value.ToString ExcelSheet.Cells(i + 15, columnIndex + 3).Value = DataGridView1.Item("ItemCode", i).Value.ToString ExcelSheet.Cells(i + 15, columnIndex + 4).Value = DataGridView1.Item("Description", i).Value.ToString ExcelSheet.Cells(i + 15, columnIndex + 5).Value = DataGridView1.Item("RequestedQty", i).Value.ToString ExcelSheet.Cells(i + 15, columnIndex + 6).Value = DataGridView1.Item("UOM", i).Value.ToString ExcelSheet.Cells(i + 15, columnIndex + 7).Value = DataGridView1.Item("UnitPrice", i).Value.ToString ExcelSheet.Cells(i + 15, columnIndex + 8).Value = DataGridView1.Item("Total", i).Value.ToString ExcelSheet.Cells(i + 15, columnIndex + 9).Value = DataGridView1.Item("Remarks", i).Value.ToString columnIndex += rowindex ElseIf DataGridView1.Item("Category", i).Value.ToString = "Rice & Noodles" Then Dim columnIndex As Integer = 0 ExcelSheet.Rows(i + 18).Insert() 'Inserts row! ExcelSheet.Cells(i + 17, columnIndex + 2).Value = DataGridView1.Item("Category", i).Value.ToString ExcelSheet.Cells(i + 17, columnIndex + 3).Value = DataGridView1.Item("ItemCode", i).Value.ToString ExcelSheet.Cells(i + 17, columnIndex + 4).Value = DataGridView1.Item("Description", i).Value.ToString ExcelSheet.Cells(i + 17, columnIndex + 5).Value = DataGridView1.Item("RequestedQty", i).Value.ToString ExcelSheet.Cells(i + 17, columnIndex + 6).Value = DataGridView1.Item("UOM", i).Value.ToString ExcelSheet.Cells(i + 17, columnIndex + 7).Value = DataGridView1.Item("UnitPrice", i).Value.ToString ExcelSheet.Cells(i + 17, columnIndex + 8).Value = DataGridView1.Item("Total", i).Value.ToString ExcelSheet.Cells(i + 17, columnIndex + 9).Value = DataGridView1.Item("Remarks", i).Value.ToString columnIndex += rowindex ElseIf DataGridView1.Item("Category", i).Value.ToString = "Oil" Then Dim columnIndex As Integer = 0 ExcelSheet.Rows(i + 20).Insert() 'Inserts row! ExcelSheet.Cells(i + 19, columnIndex + 2).Value = DataGridView1.Item("Category", i).Value.ToString ExcelSheet.Cells(i + 19, columnIndex + 3).Value = DataGridView1.Item("ItemCode", i).Value.ToString ExcelSheet.Cells(i + 19, columnIndex + 4).Value = DataGridView1.Item("Description", i).Value.ToString ExcelSheet.Cells(i + 19, columnIndex + 5).Value = DataGridView1.Item("RequestedQty", i).Value.ToString ExcelSheet.Cells(i + 19, columnIndex + 6).Value = DataGridView1.Item("UOM", i).Value.ToString ExcelSheet.Cells(i + 19, columnIndex + 7).Value = DataGridView1.Item("UnitPrice", i).Value.ToString ExcelSheet.Cells(i + 19, columnIndex + 8).Value = DataGridView1.Item("Total", i).Value.ToString ExcelSheet.Cells(i + 19, columnIndex + 9).Value = DataGridView1.Item("Remarks", i).Value.ToString columnIndex += rowindex ElseIf DataGridView1.Item("Category", i).Value.ToString = "Beverages" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Desserts" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Meats" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Poultries" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Seafoods" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Vegetables" Then Dim columnIndex As Integer = 0 ExcelSheet.Cells(i + 31, columnIndex + 2).Value = DataGridView1.Item("Category", i).Value.ToString ExcelSheet.Cells(i + 31, columnIndex + 3).Value = DataGridView1.Item("ItemCode", i).Value.ToString ExcelSheet.Cells(i + 31, columnIndex + 4).Value = DataGridView1.Item("Description", i).Value.ToString ExcelSheet.Cells(i + 31, columnIndex + 5).Value = DataGridView1.Item("RequestedQty", i).Value.ToString ExcelSheet.Cells(i + 31, columnIndex + 6).Value = DataGridView1.Item("UOM", i).Value.ToString ExcelSheet.Cells(i + 31, columnIndex + 7).Value = DataGridView1.Item("UnitPrice", i).Value.ToString ExcelSheet.Cells(i + 31, columnIndex + 8).Value = DataGridView1.Item("Total", i).Value.ToString ExcelSheet.Cells(i + 31, columnIndex + 9).Value = DataGridView1.Item("Remarks", i).Value.ToString columnIndex += rowindex ElseIf DataGridView1.Item("Category", i).Value.ToString = "Other Raw Materials" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Marketing Materials" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Office Supplies" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Packaging Supplies" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Store Supplies" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Wares" Then Dim columnIndex As Integer = 0 ExcelSheet.Cells(i + 41, columnIndex + 2).Value = DataGridView1.Item("Category", i).Value.ToString ExcelSheet.Cells(i + 41, columnIndex + 3).Value = DataGridView1.Item("ItemCode", i).Value.ToString ExcelSheet.Cells(i + 41, columnIndex + 4).Value = DataGridView1.Item("Description", i).Value.ToString ExcelSheet.Cells(i + 41, columnIndex + 5).Value = DataGridView1.Item("RequestedQty", i).Value.ToString ExcelSheet.Cells(i + 41, columnIndex + 6).Value = DataGridView1.Item("UOM", i).Value.ToString ExcelSheet.Cells(i + 41, columnIndex + 7).Value = DataGridView1.Item("UnitPrice", i).Value.ToString ExcelSheet.Cells(i + 41, columnIndex + 8).Value = DataGridView1.Item("Total", i).Value.ToString ExcelSheet.Cells(i + 41, columnIndex + 9).Value = DataGridView1.Item("Remarks", i).Value.ToString columnIndex += rowindex ElseIf DataGridView1.Item("Category", i).Value.ToString = "Computer Equipment" Then ElseIf DataGridView1.Item("Category", i).Value.ToString = "Other Equipment" Then End If Next .Cells(7, 4) = "To : " & ComboBox1.Text.ToUpper .Cells(8, 4) = "Location : " & ComboBox2.Text.ToUpper .Cells(7, 9) = DateTimePicker2.Value.Date .Cells(8, 9) = TextBox1.Text .Range("B1").ColumnWidth = 0 End With ExcelApp.Visible = True ExcelSheet = Nothing ExcelBook = Nothing ExcelApp = Nothing End If 

正如你在我的代码中看到的,我尝试设置标题后面的起始填充数据,并添加一些条件语句,以便如果Category达到了标准,它将转到我的标题所在的特定位置。 我也testing了代码,它工作正常(以及没有完全罚款)。 这里是 。

在这里输入图像说明

图片是正确的,但我滚下我的Excel文件后,我注意到这一点,这让我困扰。

在这里输入图像说明

看到输出? 他们没有去适当的地方。 相反,他们将头Vegetables和面包头。

这是我的问题。

不久,这些数据将会越来越多,所以我希望将来不会成为代码中的问题。

==== UPDATE =====

基于我的调查,它看起来像RowIndex已经添加了多less数据我有datagridview所以会发生什么是数据是第194行因此。

我的问题是,我如何填充数据组? 我的意思是根据那里的分类去那里的列标题后各自的位置。

我希望你让我和TYSM读我的故事我的意思是问题:D

我会采取不同的方式:

  • search当前datagridviewlogging“description”字段值的Excel工作表的列“A”

  • 如果find,则在其下面插入一行,并用其他datagridviewlogging字段填充它

如下所示:

 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If DataGridView1.Rows.Count = 0 Then MsgBox("Nothing to export.") Exit Sub End If Dim ExcelApp As Object, ExcelBook As Object, ExcelSheet As Object Dim found As Object '<--| this will be used to localize the current "Description" in column "A" of the excel file ExcelApp = CreateObject("Excel.Application") ExcelBook = ExcelApp.Workbooks.Open("C:\SR Transmittal.xlsx") ExcelSheet = ExcelBook.WorkSheets("Transmittal Form") ExcelApp.Visible = True With ExcelSheet For i As Integer = 0 To DataGridView1.Rows.Count - 1 found = .Columns(1).Find(What:=DataGridView1.Item("Category", i).Value.ToString, LookIn:=-4163, LookAt:=1) '<--| look for the current "Category" in column "A" of "Transmittal Form" worksheet If found IsNot Nothing Then '<--| if you found it found.Offset(1).EntireRow.Insert() 'Insert row beneath the found keyword With found.Offset(1) '<-- refrence inserted row .Offset(, 1).Value = DataGridView1.Item("Category", i).Value.ToString .Offset(, 2).Value = DataGridView1.Item("ItemCode", i).Value.ToString .Offset(, 3).Value = DataGridView1.Item("Description", i).Value.ToString .Offset(, 4).Value = DataGridView1.Item("RequestedQty", i).Value.ToString .Offset(, 5).Value = DataGridView1.Item("UOM", i).Value.ToString .Offset(, 6).Value = DataGridView1.Item("UnitPrice", i).Value.ToString .Offset(, 7).Value = DataGridView1.Item("Total", i).Value.ToString .Offset(, 8).Value = DataGridView1.Item("Remarks", i).Value.ToString End With End If Next .Cells(7, 4) = "To : " & ComboBox1.Text.ToUpper .Cells(8, 4) = "Location : " & ComboBox2.Text.ToUpper .Cells(7, 9) = DateTimePicker2.Value.Date .Cells(8, 9) = TextBox1.Text .Range("B1").ColumnWidth = 0 End With ExcelApp.Visible = True found = Nothing ExcelSheet = Nothing ExcelBook = Nothing ExcelApp = Nothing End Sub End Class