【问题标题】:DataGridView need to be exported into an excel fileDataGridView需要导出成excel文件
【发布时间】:2016-03-01 09:11:38
【问题描述】:

我的程序包含一个数据网格视图,用户在运行时手动填充数据。当用户单击保存时,我希望将 datagridview 导出到他们以后可以访问的 excel 文件。

我现在的代码出现了一个错误类型“空引用异常”

Dim xlApp As Excel.Application = New Microsoft.Office.Interop.Excel.Application()

    If xlApp Is Nothing Then
        MessageBox.Show("Excel is not properly installed!!")
        Return
    End If


    Dim xlWorkBook As Excel.Workbook
    Dim xlWorkSheet As Excel.Worksheet
    Dim misValue As Object = System.Reflection.Missing.Value
    Dim i As Integer
    Dim j As Integer

    xlWorkBook = xlApp.Workbooks.Add(misValue)
    xlWorkSheet = xlWorkBook.Sheets("sheet1")
    'xlWorkSheet.Cells(1, 1) = "Sheet 1 content"
    'xlWorkSheet.Cells(3, 3) = "Sheet 1 content"

    If ((DataGridView1.Columns.Count = 0) Or (DataGridView1.Rows.Count = 0)) Then
        Exit Sub
    End If



    For k As Integer = 0 To DataGridView1.Columns.Count - 1
        xlWorkSheet.Cells(1, k + 1) = DataGridView1.Columns(k).HeaderText
    Next
    For i = 0 To DataGridView1.RowCount - 1
        For j = 0 To DataGridView1.ColumnCount - 1

            xlWorkSheet.Cells(i + 2, j + 1) = DataGridView1(j, i).Value.ToString()

        Next
    Next



    xlWorkBook.SaveAs("C:\test\DATAGRID.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue,
     Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue)
    xlWorkBook.Close(True, misValue, misValue)
    xlApp.Quit()

    releaseObject(xlWorkSheet)
    releaseObject(xlWorkBook)
    releaseObject(xlApp)

    MessageBox.Show("Excel file created , you can find the file C:\test\DATAGRID.xls")

【问题讨论】:

  • 出于好奇,您是否有任何理由使用 System.Reflection.Missing.Value 而不是 Nothing?
  • 由于某种原因,当我尝试使用 Nothing 保存它时遇到了一些问题,所以我尝试了这个,代码在没有标题文本下行的代码的情况下工作。所以保存的文件只包含我的datagridview的标题
  • DataGridView1(j, i).Value.ToString()的值是多少?是空的吗?
  • 究竟是哪一行引发了异常?
  • DataGridView1(j, i).Value.ToString() 抛出异常

标签: vb.net excel datagridview


【解决方案1】:

感谢大家的帮助

我发现这段代码实际上可以满足我的需求

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim rowsTotal, colsTotal As Short
    Dim I, j, iC As Short
    System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
    Dim xlApp As New Excel.Application
    Dim misValue As Object = System.Reflection.Missing.Value


    Try
        Dim excelBook As Excel.Workbook = xlApp.Workbooks.Add
        Dim excelWorksheet As Excel.Worksheet = CType(excelBook.Worksheets(1), Excel.Worksheet)

        rowsTotal = DataGridView1.RowCount - 1
        colsTotal = DataGridView1.Columns.Count - 1
        With excelWorksheet
            .Cells.Select()
            .Cells.Delete()
            For iC = 0 To colsTotal
                .Cells(1, iC + 1).Value = DataGridView1.Columns(iC).HeaderText
            Next
            For I = 0 To rowsTotal - 1
                For j = 0 To colsTotal - 1
                    .Cells(I + 2, j + 1).value = DataGridView1.Rows(I).Cells(j).Value
                Next j
            Next I
            .Rows("1:1").Font.FontStyle = "Bold"
            .Rows("1:1").Font.Size = 10
            .Cells.Columns.AutoFit()
            .Cells.Select()
            .Cells.EntireColumn.AutoFit()
            .Cells(1, 1).Select()
        End With
        excelBook.SaveAs("C:\test\DATAGRID.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue,
   Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue)
        MessageBox.Show("Excel file created , you can find the file C:\test\DATAGRID.xls")




    Catch ex As Exception
        MsgBox("Export Excel Error " & ex.Message)
    Finally
        'RELEASE ALLOACTED RESOURCES
        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
        xlApp = Nothing
    End Try
End Sub

【讨论】:

  • 查看我上面的评论...这与您在上面问题中的代码做同样的事情,除了它正确访问 DataGridView 的单元格值。
【解决方案2】:

当您访问 DataGridView 的单元格时,它的功能与 Excel 互操作对象不同。而不是使用:

DataGridView1(j, i).Value.ToString()

你应该使用:

DataGridView1.Rows(i).Cells(j).Value.ToString()

Excel 互操作对象仅使用列和行作为索引,但 DataGridView(和大多数其他 .NET 数据对象)将它们存储为嵌套集合。

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多