我在vb.net中有一个datagridview,它从数据库中填充.我研究过,我发现没有内置的支持直接从datagridview打印.我不想使用水晶报告,因为我不熟悉它.
我打算将它导出到excel以使我能够从datagridview生成报告.
你能告诉我这样做的方法吗?
下面的代码创建Excel文件并将其保存在D:驱动器中它使用Microsoft Office 2007
首先将READ REIDRANCE(Microsoft Office 12.0对象库)添加到项目中
然后将下面给出的代码添加到导出按钮单击事件 -
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方法
这种方法与您将看到的许多方法不同.其他人使用循环来编写每个单元格并使用文本数据类型写入单元格.
该方法创建从一个对象数组DataTable
或DataGridView
,然后将写入所述阵列到Excel.这意味着我可以在没有循环的情况下写入Excel并保留数据类型.
我从我的库中提取了这个,我认为我改变了它只能使用这个代码,但可能需要更多的小调整.如果您收到错误,请告诉我,我会为您纠正错误.通常,我创建一个类的实例并调用这些方法.如果您想使用我的库,请使用此链接下载它,如果您需要帮助,请告诉我.
https://zomp.co/Files.aspx?ID=zExcel
将代码复制到解决方案后,您将使用它.
在按钮代码中添加此项并将名称更改为控件.
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创建一个CSV.使用Excel Automation写入Excel仅在需要格式化数据和单元格时才有用,否则应使用CSV.您可以使用图像后的代码进行CSV导出.
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