找回密碼
 註冊
搜索
查看: 12070|回復: 1

將GridView內的資料匯出成Excel檔

[複製鏈接]
發表於 2011-1-7 14:30:50 | 顯示全部樓層 |閱讀模式
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;

  11. public partial class _Default : System.Web.UI.Page  
  12. {
  13.     protected void Button2_Click(object sender, EventArgs e)
  14.     {
  15.         Response.ClearContent();
  16.         Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>");
  17.         string excelFileName = "測試Excel檔案.xls";
  18.         Response.AddHeader("content-disposition", "attachment;filename=" + Server.UrlEncode(excelFileName));
  19.         Response.ContentType = "application/excel";
  20.         System.IO.StringWriter stringWrite = new System.IO.StringWriter();
  21.         System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
  22.         GridView1.RenderControl(htmlWrite);
  23.         Response.Write(stringWrite.ToString());
  24.         Response.End();
  25.     }

  26.     public override void VerifyRenderingInServerForm(Control control)   
  27.     {
  28.         // '處理'GridView' 的控制項 'GridView' 必須置於有 runat=server 的表單標記之中   
  29.     }   
  30. }
複製代碼
當用GridView導出Execl的時候,會發生只能在執行 Render() 的過程中調用 RegisterForEventValidation的錯誤提示。
有兩種方法可以解決以上問題:
1.修改web.config(不推薦)<pages enableEventValidation ="false" ></pages>
2.直接在導出Execl的頁面修改
<%@ Page Language="C#" EnableEventValidation = "false" AutoEventWireup="true"
CodeFile="ExportGridView.aspx.cs" Inherits="ExportGridView" %>

Reference:
http://www.dotblogs.com.tw/chou/archive/2009/04/03/7831.aspx
http://www.cnblogs.com/xucanzhao/archive/2006/04/29/388576.html
http://blog.xuite.net/tolarku/blog/28080185
http://www.codedigest.com/Articl ... Table_to_Excel.aspx
 樓主| 發表於 2011-1-10 08:31:52 | 顯示全部樓層

ASP.NET - NPOI Excel 匯出 - 多工作表 Sheets

  1. Sub npoi_excel(ByVal excel_array As Array, ByVal filename As String, ByVal size As Integer) 'NPOI_Excel 多工作表匯出
  2.         '----載入函示庫
  3.         'Imports NPOI.HSSF.UserModel
  4.         'Imports System.IO
  5.         '----叫用方式----
  6.         'Dim excel_array(,) As String = {{"測試囉", "gridview1", "工作表的標題欄", "備註1"}, {"測試囉222", "gridview2", "工作表的標題欄222", "備註2"}, {"測試囉33333", "gridview1", "工作表的標題欄33333", "備註3"}}
  7.         'npoi_excel(excel_array, "file_name.xls", 3) '資料陣列、檔名、Gridview 數量
  8.         '----------------------
  9.         Dim i, j, m As Integer   '資料陣列、檔名、Gridview 數量
  10.         Dim gv(size) As GridView
  11.         Dim workbook As New HSSFWorkbook '使用 NPOI 函示庫  要載入 Imports NPOI.HSSF.UserModel
  12.         Dim ms As New MemoryStream
  13.         Dim mysheet(size + 1) As HSSFSheet  '定義工作頁
  14.         Dim up_row As Integer
  15.         Dim up_column As Integer  '記錄 Gridview 的 Row 與 Column 上限
  16.         Dim region As NPOI.HSSF.Util.Region
  17.         For i = 0 To size - 1
  18.             mysheet(i) = workbook.CreateSheet(excel_array(i, 0))
  19.             mysheet(i).DisplayGridlines = True    '宣告要畫出 Excel 格線,預設值就是 True
  20.             mysheet(i).IsPrintGridlines = True     '定義 Excel 印出時要印出框線
  21.             gv(i) = New GridView
  22.             gv(i) = CType(FindControl(excel_array(i, 1)), GridView) '取得對應的 Gridview 物件

  23.             up_row = gv(i).Rows.Count - 1          '抓取Gridview 的欄位數 column、筆數 row
  24.             up_column = gv(i).Columns.Count - 1  '從0開始,所以要減1

  25.             region = New NPOI.HSSF.Util.Region(0, 0, 0, up_column)  '合併儲存格,依欄位數
  26.             mysheet(i).AddMergedRegion(region)
  27.             mysheet(i).CreateRow(0).CreateCell(0).SetCellValue(excel_array(i, 2)) '印 Caption
  28.             'gv(i).Caption  其實也可以直接抓取 Gridview 中所定義的 Caption
  29.             For j = 0 To up_column  '印出對應的 Gridview 欄位名稱
  30.                 mysheet(i).CreateRow(1).CreateCell(j).SetCellValue(gv(i).HeaderRow.Cells(j).Text)
  31.             Next

  32.             For m = 0 To up_row          '---印出資料
  33.                 For j = 0 To up_column
  34.                     mysheet(i).CreateRow(m + 2).CreateCell(j).SetCellValue(gv(i).Rows(m).Cells(j).Text)
  35.                 Next
  36.             Next
  37.             '結尾提示文字,可以用以表現資料產出時間
  38.             mysheet(i).CreateRow(up_row + 4).CreateCell(0).SetCellValue("資料產出時間:" & Now.ToString) '時間記錄
  39.             mysheet(i).CreateRow(up_row + 5).CreateCell(0).SetCellValue(excel_array(i, 3)) '備註

  40.         Next      'For i = 0 To k
  41.         '---- 匯入 asp TABEL 的方式 ---
  42.         'mysheet(size) = workbook.CreateSheet("La La test")               
  43.         'Dim tb1x As Table = CType(FindControl(Table1.ID), Table)        '用 findcontrol 抓取 asp table 的元件內容
  44.         'For m = 0 To tb1x.Rows.Count - 1
  45.         '    For j = 0 To tb1x.Rows(m).Cells.Count - 1
  46.         '        mysheet(size).CreateRow(m).CreateCell(j).SetCellValue(tb1x.Rows(m).Cells(j).Text)
  47.         '    Next
  48.         'Next
  49.         '====匯入ASP Table ====

  50.         '-----手編 Table ---
  51.         'Dim pp As Integer = size
  52.         'Dim rsp As Integer =0 '用來做上下資料列印位置移動
  53.         'Dim csp As Integer =0 '用來做左右資料列印位置移動

  54.         'mysheet(pp) = workbook.CreateSheet("統計分析")
  55.         'mysheet(pp).DisplayGridlines = True
  56.         'mysheet(pp).IsPrintGridlines = True
  57.         'region = New NPOI.HSSF.Util.Region(0, 0, 1, 1)  '合併儲存格
  58.         'mysheet(pp).AddMergedRegion(region)
  59.         'mysheet(pp).CreateRow(rsp+0).CreateCell(csp + 0).SetCellValue("成員歸類")
  60.         'region = New NPOI.HSSF.Util.Region(0, 2, 0, 3)  '合併儲存格
  61.         'mysheet(pp).AddMergedRegion(region)
  62.         'mysheet(pp).CreateRow(rsp+0).CreateCell(csp + 2).SetCellValue("人數")
  63.         'mysheet(pp).CreateRow(rsp+1).CreateCell(csp + 2).SetCellValue("主管")
  64.         'mysheet(pp).CreateRow(rsp+1).CreateCell(csp + 3).SetCellValue("工程師")
  65.         'region = New NPOI.HSSF.Util.Region(2, 0, 7, 0)  '合併儲存格
  66.         'mysheet(pp).AddMergedRegion(region)
  67.         'mysheet(pp).CreateRow(rsp+2).CreateCell(csp + 0).SetCellValue("系統管理者")
  68.         'mysheet(pp).CreateRow(rsp+2).CreateCell(csp + 1).SetCellValue("程式設計師")

  69.         'mysheet(i).CreateRow(rsp + up_row + 4).CreateCell(csp + 0).SetCellValue("資料產出時間:" & Now.ToString) '時間記錄
  70.         'mysheet(i).CreateRow(rsp + up_row + 5).CreateCell(csp + 0).SetCellValue(excel_array(i, 3)) '備註
  71.         '=====手編====
  72.         workbook.Write(ms)
  73.         Response.AddHeader("Content-Disposition", String.Format("attachment; filename=" & filename))
  74.         Response.BinaryWrite(ms.ToArray)

  75.         ms.Close()
  76.         ms.Dispose()
  77.     End Sub
複製代碼
Reference: http://blog.xuite.net/tolarku/blog/30630114?ref=rel
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

Archiver|手機版|彩色筆小沛的知識庫

GMT+8, 2024-3-29 06:29 , Processed in 0.016614 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回復 返回頂部 返回列表