Vb.net 希望导出datagridview吗

Vb.net 希望导出datagridview吗,vb.net,excel,datagridview,export,Vb.net,Excel,Datagridview,Export,我有一个滚动的datagridview,动态地改变它的列数和行数。我正在寻找一种方法来导出datagridview,就像用户单击按钮时一样。我希望它导出为无法编辑的内容(因此不是excel文件)。我曾尝试使用iTextSharp导出为pdf,但似乎无法找到适合它的动态变化循环。此外,我还没有找到任何使用iTextSharp的示例代码,其中包括导出行标题和列标题。我还在microsoft论坛上尝试了一种解决方案(目前似乎找不到),它利用Excel的附加功能在datagridview内容导出到PDF

我有一个滚动的datagridview,动态地改变它的列数和行数。我正在寻找一种方法来导出datagridview,就像用户单击按钮时一样。我希望它导出为无法编辑的内容(因此不是excel文件)。我曾尝试使用iTextSharp导出为pdf,但似乎无法找到适合它的动态变化循环。此外,我还没有找到任何使用iTextSharp的示例代码,其中包括导出行标题和列标题。我还在microsoft论坛上尝试了一种解决方案(目前似乎找不到),它利用Excel的附加功能在datagridview内容导出到PDF后写入PDF。我的问题是,它创建了许多页面的方式,并且仍然显示了从DataGridVew中隐藏或删除的行。你知道我怎样才能完成这个壮举吗

我将包括两张图片来显示datagridview动态填充和更改的方式

它最多可以有66行和12列(不包括行或列标题)

您可以使用创建受密码保护(锁定)的excel文件,该文件可以读取,但不能编辑。我可以告诉你如何从这样的情况开始:

并获得一个受保护的文件,如下所示:


首先,您必须下载并在项目中包含。别忘了检查一下大屏幕

然后,您需要一种方法来提取DataGridView可见数据(您不希望导出不可见列)。我用一个2d数组做的。此函数接受一个
DataGridView
参数并返回一个2d数组:

Function GetDataGridView2DArray(ByVal dataGridView As DataGridView) As String(,)
    'Save list of visible columns
    Dim nrVisibleColumns = (From c As DataGridViewColumn In DataGridView1.Columns
               Where c.Visible
               Select c).ToList()

    'create 2d-array to store values, dimensions given by number of rows and visible columns
    Dim dgvArray(nrVisibleColumns.Count, DataGridView1.Rows.Count) As String

    'create the first row with Column Headers text
    For Each col As DataGridViewColumn In nrVisibleColumns
        dgvArray(col.Index + 1, 0) = col.HeaderText
    Next

    'create Rows, including Row Header text
    For Each row As DataGridViewRow In DataGridView1.Rows
        Dim rowNumber = row.Index + 1
        dgvArray(0, rowNumber) = DataGridView1.Rows(row.Index).HeaderCell.Value 'save rowheader cell value 

        For Each col As DataGridViewColumn In nrVisibleColumns
            dgvArray(col.Index + 1, rowNumber) = DataGridView1(col.Index, row.Index).Value
        Next
    Next

    Return dgvArray
End Function
现在您有了数组,您可以创建一个Excel文件,并用数据填充它。另外,在保存之前,我们将使用密码锁定它,以防止用户编辑

Private Sub CreateXls()
    Dim fi = New FileInfo("C:\temp\output.xlsx")
    Dim package As New ExcelPackage()

    Dim ws = package.Workbook.Worksheets.Add("Dgv Output") 'create sheet

    'get array of datagridview data
    Dim dataArray = GetDataGridView2DArray(DataGridView1)

    'loop my 2d array and fill my excel file
    For iColumn As Integer = dataArray.GetLowerBound(0) To dataArray.GetUpperBound(0)
        For iRow As Integer = dataArray.GetLowerBound(1) To dataArray.GetUpperBound(1)
            ws.Cells(iRow + 1, iColumn + 1).Value = dataArray(iColumn, iRow)
            ws.Cells(iRow + 1, iColumn + 1).Style.Locked = True 'lock the cell
        Next 
    Next

    ws.Cells.AutoFitColumns() 'resize columns to fit
    ws.Protection.AllowFormatColumns = True 'let user resize columns if he wants
    ws.Protection.SetPassword("1") 'protect the sheet from editing

    package.SaveAs(fi) 'save file
End Sub

现在,只需单击一下,您就可以轻松导出动态DataGridView

这是我经过测试的编码,输出非常完美:

    Dim ExcelApp As Object, ExcelBook As Object
    Dim ExcelSheet As Object
    Dim i As Integer
    Dim j As Integer

    'create object of excel
    ExcelApp = CreateObject("Excel.Application")
    ExcelBook = ExcelApp.WorkBooks.Add
    ExcelSheet = ExcelBook.WorkSheets(1)

    With ExcelSheet
        For Each col As DataGridViewColumn In Me.DataGridView1.Columns
            ExcelSheet.Cells(1, col.Index + 1) = col.HeaderText.ToString
            For i = 1 To Me.DataGridView1.RowCount
                ExcelSheet.cells(i + 1, 1) = Me.DataGridView1.Rows(i - 1).Cells("First Column Name").Value
                For j = 1 To DataGridView1.Columns.Count - 1
                    ExcelSheet.cells(i + 1, j + 1) = DataGridView1.Rows(i - 1).Cells(j).Value
                Next
            Next
        Next
    End With
    ExcelApp.Visible = True
    ExcelSheet = Nothing
    ExcelBook = Nothing
    ExcelApp = Nothing

如果基础数据源是
DataTable
,则可以通过执行
myDataTable.WriteXml(nameOfFile)
myDataTable.ReadXml(nameOfFile)
对XML进行读/写操作。我从作为程序资源的excel文件中读取数据,因此我没有数据表数据源。如何将其设置为datatable并使用datagridview中的数据填充它?这需要某种循环,因为我的datagridview的大小会发生变化。我们是否可以在使用另存为命令将数据导出到excel后将其保存为pdf(因为excel支持另存为pdf格式)使用相同的方法,但稍作调整?@CaffeineCoder您可以从刚刚创建的excel文件开始执行此操作。使用Interop.Excel,PDF的主要问题是你永远不知道你将得到什么样的布局。。。尤其是使用dynamic行/列时,您可能会得到可怕的结果,例如半个空页面、只有一行的页面或只有两列的页面等。Excel为最终用户提供了以他想要的方式以他想要的格式打印文件的可能性。(顺便说一句,你的问题被标记为Excel)。我有一个完全不同的按钮,它以任何方式打印datagridview,并且它与datagridview的动态变化特性(使用datagridview打印机类)一起工作,所以我只寻找一种导出方法。打印不会是一个问题,但我希望图表看起来是一半decent@CaffeineCoder我的答案提供了你想要的一切。导出datagridview,包括行/列标题,排除不可见列,防止编辑。然后,您可以添加互操作代码以获取excel文件,将其另存为PDF并删除以前创建的excel文件。我想这是你能做的一切,很幸运你是对的。我将用你提供的方法来愚弄你,看看我是否能完成一个保存到pdf的过程。如果我能得到想要的结果,你肯定会因为这个答案而得到表扬