【问题标题】:Export from datagridview to excel vb.net从 datagridview 导出到 excel vb.net
【发布时间】:2016-05-23 00:45:42
【问题描述】:

任何人都可以帮助我如何将数据从 datagridview 导入到 Microsoft Excel 以及列名和数据。另一件事是日期成为主题标签。我必须展开列以显示日期。

我有一个按钮,当我按下它时,Microsoft excel 应该会打开并导出数据。

【问题讨论】:

  • 如果您要导出大量数据,那么构建一个 CSV 文件然后使用 Excel 打开它会更有效。如果你愿意,我可以给你看代码。我还有一个包装 Excel 自动化的库。它包含一个将 DataTable 写入 Excel 的方法。我假设您的 DataGridView 具有 DataTable 的数据源。

标签: vb.net excel datagridview


【解决方案1】:

这是您可以尝试的另一种解决方案,它使用 GemBox.Spreadsheet 库,它将保留 DataGridView 中使用的数据类型和格式:

Dim ef As New ExcelFile()
Dim ws = ef.Worksheets.Add("DGV Sheet")

' From DataGridView to ExcelFile.
DataGridViewConverter.ImportFromDataGridView(ws, dataGridView1,
    New ImportFromDataGridViewOptions() With {.ColumnHeaders = True})

' Auto fit excel columns.
Dim count As Integer = ws.CalculateMaxUsedColumns()
For index As Integer = 0 To count - 1
    ws.Columns(index).AutoFit()
Next

ef.Save("DGV Book.xlsx")

另外here你可以找到另一个样本。

【讨论】:

  • 免费版只能导出 150 行。你可以轻松地完成这个库正在做的事情。事实上,我已经提供了该代码。
  • 是的,你是对的,免费模式有大小限制。尽管如此,这足以满足我的需求,希望对 OP 也是如此。关于您的评论,我不确定您是否可以轻松地完成这个库正在做的事情。首先,您可以选择所需的格式(CSV、XLS、XLSX、ODS 等),其次它将保留 DataGridView 中使用的样式和格式(如粗体、斜体、颜色、对齐方式等) ,第三,它不仅导出文本数据,还导出超链接、图像等。
  • 其实很简单。将所有功能都封装起来很痛苦,但可以更轻松地使用 Excel。我敢肯定,您使用的产品会绕过 Excel 自动化,如果没有,那么它比我想象的还要糟糕。我不认为我的更好,但它是免费和开源的。在 OP 的情况下,导出到 CSV 并在 Excel 中打开它可能更有意义。这是最快、最简单、最便宜的选择。
  • 痛苦和容易相互矛盾......但无论如何我之前用于 CSV 导出的是 OLEDB,它工作得很好。在我需要更多格式后,我切换到了这个解决方案并保持了快速的性能。当我有一堆图像(不管它们的大小)时,excel 互操作导致执行相当慢,所以它不是我的选择......
  • 这对我来说很有意义......不过我并没有自相矛盾。我的意思是痛苦既乏味又不难
【解决方案2】:

Excel方法

此方法与您将看到的许多方法不同。其他人使用循环来写入每个单元格并使用文本数据类型写入单元格。

此方法从DataTableDataGridView 创建一个对象数组,然后将该数组写入 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 自动化写入 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

【讨论】:

  • 那么我会在我的按钮上放什么?对不起,我是 vb.net 的新手
  • WriteDataTable("Sheet1", dt) - 您必须将其转换为使用 DataGridView,这并不难。
  • 如果我的库中没有其余部分,此代码将无法运行。它旨在帮助您编写自己的内容,但请随意使用我的库。 - zomp.co/Files.aspx?ID=zExcel
  • 我将在今天晚些时候调整这个答案,使其成为复制和粘贴解决方案。
  • 我调整了这个,现在应该是复制粘贴了。我什至为DataGridView 创建了一个方法您只需将代码添加到您的项目中并从您的按钮调用它 - WriteDataGrid("Sheet1", grid)
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2017-07-19
  • 2016-04-16
  • 2018-02-19
相关资源
最近更新 更多