我一直在試圖實現一個將GridViews導出到Excel工作表的簡單方法。不過,我卡在這一塊,現在相當長的一段:ASP.NET:將GridView導出到Excel的正確方式,包括動態添加的行
我GridView
有AutoGenerateColumns
設置爲true
,因爲數據源是動態的,而不是真正可預見的(改變列的數量隨着時間的推移)。它會自動創建的HeaderRow
是不適合我,所以我也設置ShowHeader
到false
並創建了自己的OnRowCreated
事件,像這樣:
if (e.Row.RowType == DataControlRowType.Header) {
gv.Controls[0].Controls.AddAt(0, GetHeader());
gv.Controls[0].Controls.AddAt(1, GetSubHeader());
}
其中GetHeader()
和GetSubHeader()
都返回一個GridViewRow
(有兩個行中使用不同的colspans,rowspans和東西)。這一切都很好地工作在網站上,但是,當我嘗試了GridView
使用OpenXML的出口是這樣的:
ExcelPackage excel = new ExcelPackage();
var workSheet = excel.Workbook.Worksheets.Add("List 1");
var totalCols = gv.Rows[0].Cells.Count;
var totalRows = gv.Rows.Count;
var headerRow = gv.HeaderRow;
for (int i = 0; i < totalCols; i++) {
workSheet.Cells[1,i+1].Value = headerRow.Cells[i].Text;
}
for (int i = 0; i < totalCols; i++) {
for (int j = 0; j < totalRows; j++) {
workSheet.Cells[j+2,i+1].Value = gv.Rows[j].Cells[i].Text;
}
}
return excel;
我所得到的是與被隱藏在原始HeaderRow表 - 我想我應該跳過顯然第一個週期 - 然後是具有實際數據的行。我沒有在OnRowCreated
中添加兩行的痕跡。
有沒有人請解釋爲什麼會發生這種情況,我該如何解決這個問題?該方法理想情況下應始終導出整個GridView,因爲它顯示在網站上。
注意:另一種使用HtmlTextWriter和GridView.RenderControl()
的方式可能不是一種選擇,因爲我下載後甚至無法在Excel中打開文件(OpenOffice做得很好),然後我在某處讀取表格實際上可用於數據處理,在這種情況下是至關重要的。
編輯:當我在OnRowDataBound
,而不是OnRowCreated
添加兩個HeaderRow
S,爲他們的循環帳戶,但所有進入工作表是空白的領域,它也似乎他們沒有被gv.Rows.Count
考慮,如循環永遠不會到達我表格中的最後兩行。
我試過調試,實際上所有返回的gv.Rows[j].Cells[i].Text;
都是""
,即使這些單元格的Text
屬性已設置,並且表格在網站上顯示OK。
我覺得這種行爲很混亂,我想我錯過了很大的東西。有人能告訴我爲什麼會發生這種情況嗎?
謝謝,但正如我上面提到的,這不工作,因爲Excel拒絕打開下載的文件。雖然OpenOffice可以毫無問題地打開它,這讓我很困惑o_o。 – Epsiloney
我從您的代碼中看到您正在使用ExcelPackage類。如果您的代碼有效,請嘗試使用Excel類。正如我所說,我的答案只是一條路。還有其他許多例子。只要做一個搜索。 –