如何使用vb.net将datagridview导出为ex​​cel?

我有一个从数据库填充的vb.net datagridview。 我研究过,发现没有内置的支持从datagridview直接打印。 我不想使用水晶报告,因为我不熟悉它。

我打算将其导出为Excel以使我能够从datagridview生成报告。

你能为我提供方法吗?

下面的代码创buildExcel文件并将其保存在D:驱动器它使用Microsoft Office 2007

首先添加推荐(微软办公室12.0对象库)到您的项目

然后将下面的代码添加到导出button单击事件 –

Private Sub Export_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VIEW_Button.Click 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 xlApp = New Microsoft.Office.Interop.Excel.ApplicationClass xlWorkBook = xlApp.Workbooks.Add(misValue) xlWorkSheet = xlWorkBook.Sheets("sheet1") 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 xlWorkSheet.SaveAs("D:\vbexcel.xlsx") xlWorkBook.Close() xlApp.Quit() releaseObject(xlApp) releaseObject(xlWorkBook) releaseObject(xlWorkSheet) MsgBox("You can find the file D:\vbexcel.xlsx") End Sub Private Sub releaseObject(ByVal obj As Object) Try System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) obj = Nothing Catch ex As Exception obj = Nothing Finally GC.Collect() End Try End Sub 

Excel方法

这种方法是不同的,你会看到很多。 其他人使用循环来写入每个单元格,并使用文本数据types来写入单元格。

此方法从DataTableDataGridView创build对象数组,然后将数组写入Excel。 这意味着我可以写入Excel没有循环,并保留数据types。

我从我的图书馆中提取了这个,我想我已经改变了它只能使用这个代码,但更小的调整可能是必要的。 如果你得到错误只是让我知道,我会纠正他们给你。 通常,我创build我的类的实例并调用这些方法。 如果你想使用我的图书馆,然后使用此链接下载,如果你需要帮助,让我知道。
https://zomp.co/Files.aspx?ID=zExcel


将代码复制到您的解决scheme后,您将像这样使用它。

在您的button代码中添加这个名称并将其更改为您的控件。

WriteDataGrid("Sheet1", grid)

要在导出后打开文件,请使用此行

System.Diagnostics.Process.Start("The location and filename of your file")

WriteArray方法中,您需要将保存工作簿的行更改为要保存的位置。 将这个作为参数添加可能是有意义的。

wb.SaveAs("C:\MyWorkbook.xlsx")


 Public Function WriteArray(Sheet As String, ByRef ObjectArray As Object(,)) As String Try Dim xl As Excel.Application = New Excel.Application Dim wb As Excel.Workbook = xl.Workbooks.Add() Dim ws As Excel.Worksheet = wb.Worksheets.Add() ws.Name = Sheet Dim range As Excel.Range = ws.Range("A1").Resize(ObjectArray.GetLength(0), ObjectArray.GetLength(1)) range.Value = ObjectArray range = ws.Range("A1").Resize(1, ObjectArray.GetLength(1) - 1) range.Interior.Color = RGB(0, 70, 132) 'Con-way Blue range.Font.Color = RGB(Drawing.Color.White.R, Drawing.Color.White.G, Drawing.Color.White.B) range.Font.Bold = True range.WrapText = True range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter range.Application.ActiveWindow.SplitColumn = 0 range.Application.ActiveWindow.SplitRow = 1 range.Application.ActiveWindow.FreezePanes = True wb.SaveAs("C:\MyWorkbook.xlsx") wb.CLose() xl.Quit() xl = Nothing wb = Nothing ws = Nothing range = Nothing ReleaseComObject(xl) ReleaseComObject(wb) ReleaseComObject(ws) ReleaseComObject(range) Return "" Catch ex As Exception Return "WriteArray()" & Environment.NewLine & Environment.NewLine & ex.Message End Try End Function Public Function WriteDataGrid(SheetName As String, ByRef dt As DataGridView) As String Try Dim l(dt.Rows.Count + 1, dt.Columns.Count) As Object For c As Integer = 0 To dt.Columns.Count - 1 l(0, c) = dt.Columns(c).HeaderText Next For r As Integer = 1 To dt.Rows.Count For c As Integer = 0 To dt.Columns.Count - 1 l(r, c) = dt.Rows(r - 1).Cells(c) Next Next Dim errors As String = WriteArray(SheetName, l) If errors <> "" Then Return errors End If Return "" Catch ex As Exception Return "WriteDataGrid()" & Environment.NewLine & Environment.NewLine & ex.Message End Try End Function Public Function WriteDataTable(SheetName As String, ByRef dt As DataTable) As String Try Dim l(dt.Rows.Count + 1, dt.Columns.Count) As Object For c As Integer = 0 To dt.Columns.Count - 1 l(0, c) = dt.Columns(c).ColumnName Next For r As Integer = 1 To dt.Rows.Count For c As Integer = 0 To dt.Columns.Count - 1 l(r, c) = dt.Rows(r - 1).Item(c) Next Next Dim errors As String = WriteArray(SheetName, l) If errors <> "" Then Return errors End If Return "" Catch ex As Exception Return "WriteDataTable()" & Environment.NewLine & Environment.NewLine & ex.Message End Try End Function 

我实际上不使用这个方法在我的数据库程序,因为这是一个很慢的方法,当你有很多的行/列。 我反而从DataGridView创build一个CSV。 如果您需要格式化数据和单元格,则使用Excel自动化编写Excel将非常有用,否则您应该使用CSV。 您可以使用图像之后的代码进行CSV导出。

DatabaseStudio


CSV方法

 Private Sub DataGridToCSV(ByRef dt As DataGridView, Qualifier As String) Dim TempDirectory As String = "A temp Directory" System.IO.Directory.CreateDirectory(TempDirectory) Dim oWrite As System.IO.StreamWriter Dim file As String = System.IO.Path.GetRandomFileName & ".csv" oWrite = IO.File.CreateText(TempDirectory & "\" & file) Dim CSV As StringBuilder = New StringBuilder() Dim i As Integer = 1 Dim CSVHeader As StringBuilder = New StringBuilder() For Each c As DataGridViewColumn In dt.Columns If i = 1 Then CSVHeader.Append(Qualifier & c.HeaderText.ToString() & Qualifier) Else CSVHeader.Append("," & Qualifier & c.HeaderText.ToString() & Qualifier) End If i += 1 Next 'CSV.AppendLine(CSVHeader.ToString()) oWrite.WriteLine(CSVHeader.ToString()) oWrite.Flush() For r As Integer = 0 To dt.Rows.Count - 1 Dim CSVLine As StringBuilder = New StringBuilder() Dim s As String = "" For c As Integer = 0 To dt.Columns.Count - 1 If c = 0 Then 'CSVLine.Append(Qualifier & gridResults.Rows(r).Cells(c).Value.ToString() & Qualifier) s = s & Qualifier & gridResults.Rows(r).Cells(c).Value.ToString() & Qualifier Else 'CSVLine.Append("," & Qualifier & gridResults.Rows(r).Cells(c).Value.ToString() & Qualifier) s = s & "," & Qualifier & gridResults.Rows(r).Cells(c).Value.ToString() & Qualifier End If Next oWrite.WriteLine(s) oWrite.Flush() 'CSV.AppendLine(CSVLine.ToString()) 'CSVLine.Clear() Next 'oWrite.Write(CSV.ToString()) oWrite.Close() oWrite = Nothing System.Diagnostics.Process.Start(TempDirectory & "\" & file) GC.Collect() End Sub 
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click DATAGRIDVIEW_TO_EXCEL((DataGridView1)) ' PARAMETER: YOUR DATAGRIDVIEW End Sub Private Sub DATAGRIDVIEW_TO_EXCEL(ByVal DGV As DataGridView) Try Dim DTB = New DataTable, RWS As Integer, CLS As Integer For CLS = 0 To DGV.ColumnCount - 1 ' COLUMNS OF DTB DTB.Columns.Add(DGV.Columns(CLS).Name.ToString) Next Dim DRW As DataRow For RWS = 0 To DGV.Rows.Count - 1 ' FILL DTB WITH DATAGRIDVIEW DRW = DTB.NewRow For CLS = 0 To DGV.ColumnCount - 1 Try DRW(DTB.Columns(CLS).ColumnName.ToString) = DGV.Rows(RWS).Cells(CLS).Value.ToString Catch ex As Exception End Try Next DTB.Rows.Add(DRW) Next DTB.AcceptChanges() Dim DST As New DataSet DST.Tables.Add(DTB) Dim FLE As String = "" ' PATH AND FILE NAME WHERE THE XML WIL BE CREATED (EXEMPLE: C:\REPS\XML.xml) DTB.WriteXml(FLE) Dim EXL As String = "" ' PATH OF/ EXCEL.EXE IN YOUR MICROSOFT OFFICE Shell(Chr(34) & EXL & Chr(34) & " " & Chr(34) & FLE & Chr(34), vbNormalFocus) ' OPEN XML WITH EXCEL Catch ex As Exception MsgBox(ex.ToString) End Try End Sub 

关于你需要“从datagridview直接打印”,请查看CodeProject上的这篇文章:

DataGridViewPrinter类

有一些类似的文章,但我运气与我联系。

以下代码适合我:)

 Protected Sub ExportToExcel(sender As Object, e As EventArgs) Handles ExportExcel.Click Try Response.Clear() Response.Buffer = True Response.AddHeader("content-disposition", "attachment;filename=ExportEthias.xls") Response.Charset = "" Response.ContentType = "application/vnd.ms-excel" Using sw As New StringWriter() Dim hw As New HtmlTextWriter(sw) GvActifs.RenderControl(hw) 'Le format de base est le texte pour éviter les problèmes d'arrondis des nombres Dim style As String = "<style> .textmode { } </style>" Response.Write(Style) Response.Output.Write(sw.ToString()) Response.Flush() Response.End() End Using Catch ex As Exception lblMessage.Text = "Erreur export Excel : " & ex.Message End Try End Sub Public Overrides Sub VerifyRenderingInServerForm(control As Control) ' Verifies that the control is rendered End Sub 

希望这可以帮助你。

Dim rowNo1 As Short Dim numrow As Short Dim colNo1 As Short Dim colNo2 As Short

  rowNo1 = 1 colNo1 = 1 colNo2 = 1 numrow = 1 ObjEXCEL = CType(CreateObject("Excel.Application"), Microsoft.Office.Interop.Excel.Application) objEXCELBook = CType(ObjEXCEL.Workbooks.Add, Microsoft.Office.Interop.Excel.Workbook) objEXCELSheet = CType(objEXCELBook.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet) ObjEXCEL.Visible = True For numCounter = 0 To grdName.Columns.Count - 1 ' MsgBox(grdName.Columns(numCounter).HeaderText()) If grdName.Columns(numCounter).Width > 0 Then ObjEXCEL.Cells(1, numCounter + 1) = grdName.Columns(numCounter).HeaderText() End If ' ObjEXCEL.Cells(1, numCounter + 1) = grdName.Columns.GetFirstColumn(DataGridViewElementStates.Displayed) Next numCounter ObjEXCEL.Range("A:A").ColumnWidth = 10 ObjEXCEL.Range("B:B").ColumnWidth = 25 ObjEXCEL.Range("C:C").ColumnWidth = 20 ObjEXCEL.Range("D:D").ColumnWidth = 20 ObjEXCEL.Range("E:E").ColumnWidth = 20 ObjEXCEL.Range("F:F").ColumnWidth = 25 For rowNo1 = 0 To grdName.RowCount - 1 For colNo1 = 0 To grdName.ColumnCount - 1 If grdName.Columns(colNo1).Width > 0 Then If Trim(grdName.Item(colNo1, rowNo1).Value) <> "" Then 'If IsDate(grdName.Item(colNo1, rowNo1).Value) = True Then ' ObjEXCEL.Cells(numrow + 1, colNo2) = Format(CDate(grdName.Item(colNo1, rowNo1).Value), "dd/MMM/yyyy") 'Else ObjEXCEL.Cells(numrow + 1, colNo2) = grdName.Item(colNo1, rowNo1).Value 'End If End If If colNo2 >= grdName.ColumnCount Then colNo2 = 1 Else colNo2 = colNo2 + 1 End If End If Next colNo1 numrow = numrow + 1 Next rowNo1 

在devise模式下:将DataGridView1 ClipboardCopyMode属性设置为EnableAlwaysIncludeHeaderText

或程序代码上

 DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText 

在运行时select所有的单元格内容(Ctrl + A)和复制(Ctrl + C)并粘贴到Excel程序。 让Excel完成剩下的工作

对不起,我一直在寻找直接从datagridvew(创buildvb.net VB2012报告)打印数据的方法,并没有find满意的结果。 上面的代码只是我的,不知道如果我的应用程序用户可以依靠上述简单的一步,这将是很好的,我可以继续下一步我的程序进度。

从Datagridview生成可打印报表的简单方法是将datagridview放置在Panel对象上。 可以绘制面板的位图。

这是我怎么做的。

'使用面板的尺寸创build位图Dim bmp As New Bitmap(Panel1.Width,Panel1.Height)

'将面板绘制到位图“bmp”Panel1.DrawToBitmap(bmp,Panel1.ClientRectangle)

我创build了一个多页面的tiff,“将我的datagridview项目打破成页面,这是我如何检测新页面的开始:

'我一次添加行到我的数据网格,然后检查滚动条是否处于活动状态。 '如果滚动条处于活动状态,则将行保存到一个variables,然后将其从“datagridview”中删除,并将我的计数器整数减1(因此下一次运行将包含此行)。

 Private Function VScrollBarVisible() As Boolean Dim ctrl As New Control For Each ctrl In DataGridView_Results.Controls If ctrl.GetType() Is GetType(VScrollBar) Then If ctrl.Visible = True Then Return True Else Return False End If End If Next Return Nothing End Function 

我希望这有帮助