[英]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.