簡體   English   中英

用標題文本導出到Excel

[英]Export to Excel with header text

我的代碼在導出到Excel時應該包含標題文本。

For i As Integer = 0 To DataGridView2.Rows.Count - 2
    For j As Integer = 0 To DataGridView2.Columns.Count - 1
        ' Excel index starts from 1,1. As first Row would have the Column headers, adding a condition check.
        If cellRowIndex = 1 Then
            worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView2.Columns(j).HeaderText
        Else
            worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView2.Rows(i).Cells(j).Value
        End If
        cellColumnIndex += 1
    Next
    cellColumnIndex = 1
    cellRowIndex += 1
Next

但是,此代碼用標題文本替換了第一數據行,而不是將其插入上方。 如果我刪除提取標題文本的If語句,則會得到所有行,但不會得到標題文本。

For i As Integer = 0 To DataGridView2.Rows.Count - 2
    For j As Integer = 0 To DataGridView2.Columns.Count - 1
        worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView2.Rows(i).Cells(j).Value
        cellColumnIndex += 1
    Next
    cellColumnIndex = 1
    cellRowIndex += 1
Next

關於如何解決這個問題的任何想法?

下面的代碼創建一個帶有DataGridView頭的Excel文件。 我已經在Visual Studio 2010中對其進行了測試。首先,您必須添加Microsoft Office程序集的引用。

  • Microsoft.Office.Interop.Excel(版本-12.0.0.0)

     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.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.Application 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("C:\\vbToexcel.xlsx") xlWorkBook.Close() xlApp.Quit() releaseObject(xlApp) releaseObject(xlWorkBook) releaseObject(xlWorkSheet) MsgBox("File successfully created - C:\\vbToexcel.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 

跟蹤代碼后,很明顯,兩個for循環中都存在索引問題。 您提供的代碼似乎缺少第一行數據。

如您所言:

此代碼用標題文本替換第一數據行,而不是將其插入上方 ...

這是不正確的,它不是替換行,而只是跳過DataGridView的第一行數據。 下面是您的代碼來解釋。

For i As Integer = 0 To DataGridView1.Rows.Count - 2
  For j As Integer = 0 To DataGridView1.Columns.Count - 1
    If cellRowIndex = 1 Then
      worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView1.Columns(j).HeaderText
    Else
      worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView1.Rows(i).Cells(j).Value
    End If
    cellColumnIndex += 1
  Next
  cellColumnIndex = 1
  cellRowIndex += 1
Next

基本上,這會依次遍歷行和列。 問題出在If語句和索引i 在此If語句中,您檢查是否是第一次獲取標頭。 如果這是您的第一次,請編寫標題以使用excel並繼續。 這將跳過數據的第一行,因為循環變量i用作分配給DataGridView行的索引:

worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView1.Rows(i).Cells(j).Value

當進入j循環時, i周圍的第一次為零(0)。 使用cellRowIndex進行檢查以確定是否需要輸出標頭。 在這種情況下,他們做......頭然后輸出退出這個if和循環備份到下一個頭。 當所有標頭都輸出后,您退出j循環並循環回到i循環。 這將使i增至1並進入j循環...由於在輸出標頭時i已經為0,所以我們將跳過/錯過DataGridView第0行。 我希望這是有道理的。

一個簡單的解決方案是將i從-1開始:

For i As Integer = -1 To DataGridView1.Rows.Count - 2

這將解決您遇到的問題,但是代碼不容易遵循。 我建議使用foreach循環遍歷DataGridView行並將列輸出與行輸出分開。 這確實會創建兩個循環,但是第一個循環只會循環一次以添加標頭。 下一個循環遍歷所有行。 這將使索引更易於處理,將來也更易於閱讀。

For Each column In DataGridView1.Columns
  worksheet.Cells(1, column.Index + 1).Value = column.Name
Next

Dim rowIndex = 2
For Each row As DataGridViewRow In DataGridView1.Rows
  If Not row.IsNewRow Then
    For colIndex As Integer = 0 To DataGridView1.Columns.Count - 1
      worksheet.Cells(rowIndex, colIndex + 1).Value = row.Cells(colIndex).Value.ToString
    Next
  End If
  rowIndex += 1
Next

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM