【问题标题】:Export GridView to multiple Excel sheet将 GridView 导出到多个 Excel 工作表
【发布时间】:2011-11-29 18:33:16
【问题描述】:

我的 Web 应用程序中有两个 Gridview。我需要在单击 (ExcelExpot) 按钮时将值导出到 Excel 中相应的 Sheet1 和 Sheet2。

  protected void ExportToExcel()
    {

        this.GridView1.EditIndex = -1;
        Response.Clear();
        Response.Buffer = true;
        string connectionString = (string)ConfigurationSettings.AppSettings["ConnectionString"];
        SqlConnection sqlconnection = new SqlConnection(connectionString);
        String sqlSelect = "select * from login";
        sqlconnection.Open();
        SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(sqlSelect, connectionString);
        //DataTable dt1
        DataTable dt1 =new DataTable();
        mySqlDataAdapter.Fill(dt1);

        //LinQ Query for dt2
        var query = (from c in dt.AsEnumerable()
        select new {id= c.Field<string>("id"),name=c.Field<string>("name"),city=c.Field<string>("city")}) ;
        DataTable dt2 = new DataTable();
        d2=query.CopyToDatatable();

        DataSet ds=new DataSet();
        ds.Tabls.Add(dt1);
        ds.Tabls.Add(dt2);
        Excel.Application excelHandle1 = PrepareForExport(ds);
        excelHandle1.Visible = true;

    } 
  // code for PrepareForExport(ds);
         PrepareForExport(ds)
             {

                two tables in two worksheets of Excel...

              }

【问题讨论】:

  • aned 规则是什么? Sheet1 上有一些记录,Sheet2 上有一些记录,或者您可以将所有记录放在一张工作表中,然后使用 Excel 互操作来克隆该工作表吗?
  • Gridviews 有,不同的数据不能合并。

标签: asp.net excel gridview


【解决方案1】:

您需要创建工作簿,根据需要添加更多工作表(默认为三个),然后填写单元格。

文件顶部:

using Excel=Microsoft.Office.Interop.Excel;

然后是生成Excel文件的主要代码

Excel.Application excel = new Application();

var workbook = (Excel._Workbook) (excel.Workbooks.Add(Missing.Value));

for (var i = 0; i < dataset.Tables.Count; i++)
{
    if (workbook.Sheets.Count <= i)
    {
        workbook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing, 
                            Type.Missing);
    }

    var currentSheet = (Excel._Worksheet)workbook.Sheets[i];
    for (var y = 0; y < dataset.Tables[i].Rows.Count; y++)
    {
        for (var x = 0; x < dataset.Tables[i].Rows[y].ItemArray.Count(); x++)
        {
            currentSheet.Cells[y, x] = dataset.Tables[i].Rows[y].ItemArray[x];
        }
    }
}

workbook.SaveAs("C:\\Temp\\book.xlsx", Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, 
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
                Type.Missing);

workbook.Close();
excel.Quit();

Response.WriteFile(C:\\Temp\\book.xlsx");

不知道这是否会奏效,但它应该能让你朝着正确的方向前进

(也:Type.MissingMissing.Value 来自命名空间 System.Reflection,仅供参考)

【讨论】:

  • +1,您可能希望包含这样一个事实,即您必须拥有using Excel = Microsoft.Office.Interop.Excel; 才能使其工作。我知道 OP 可能知道这一点,但只是为了让将来看到这一点的人完全清楚 =)
【解决方案2】:

EPPlus 做这件事是小菜一碟。无需 Interop 程序集,只需 2 行代码即可完成所有工作:

ws.Cells["A1"].LoadFromDataTable(dt1, true);
ws2.Cells["A1"].LoadFromDataTable(dt2, true);

完整代码:

protected void ExportExcel_Click(object sender, EventArgs e)
{

     //LinQ Query for dt2
    var query = (from c in dt.AsEnumerable()
    select new {id= c.Field<string>("id"),name=c.Field<string>("name"),city=c.Field<string>("city")}) ;
    DataTable dt2 = new DataTable();
    dt2=query.CopyToDatatable();

    //DataTable dt1
    DataTable dt1 =new DataTable();
    mySqlDataAdapter.Fill(dt1);

    using (ExcelPackage pck = new ExcelPackage())
    {
        ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Page 1");
        ExcelWorksheet ws2 = pck.Workbook.Worksheets.Add("Page 2");

        ws.Cells["A1"].LoadFromDataTable(dt1, true);
        ws2.Cells["A1"].LoadFromDataTable(dt2, true);

        //Write it back to the client
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("content-disposition", "attachment;  filename=ExcelDemo.xlsx");
        Response.BinaryWrite(pck.GetAsByteArray());
        Response.Flush();
        Response.End();
    }
}

请注意,我复制并粘贴了您的代码以收集数据。我希望这些行能生成一个 DataTable。

【讨论】:

    【解决方案3】:

    您可以只使用 ADO.NET,而不是使用某些 3rd 方库或 Excel 自动化(增加了开销)。

    http://support.microsoft.com/kb/316934#10

    您只需将您习惯使用的 T-SQL 用于 OleDbCommand 对象。

    CREATE TABLE Sheet1 (id INT, name char(255))
    CREATE TABLE Sheet2 (id INT, name char(255))
    // for inserts use a parameterized command with ?'s
    INSERT INTO Sheet1 (id, name) VALUES(?, ?)
    INSERT INTO Sheet1 (id, name) VALUES(?, ?)
    

    您将使用 Path.GetTempFileName 创建临时 excel 文件并将其输出,之后您可以删除临时文件。

    【讨论】:

      【解决方案4】:

      我同意@Andrew Burgess 的观点,并将他的代码实施到我的一个项目中。只是为了记录,代码中有一些小错误会导致一些 COM 异常。更正后的代码如下(问题是 Excel 从 1 到 n 对工作表、行、列进行编号,而不是从零开始)。

      using Excel = Microsoft.Office.Interop.Excel;
      using System.Reflection;
      using System.IO;
      
              //Print using Ofice InterOp
              Excel.Application excel = new Excel.Application();
      
              var workbook = (Excel._Workbook)(excel.Workbooks.Add(Missing.Value));
      
              for (var i = 0; i < dataset.Tables.Count; i++)
              {
      
                      if (workbook.Sheets.Count <= i)
                      {
                          workbook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing,
                                              Type.Missing);
                      }
      
                      //NOTE: Excel numbering goes from 1 to n
                      var currentSheet = (Excel._Worksheet)workbook.Sheets[i + 1]; 
      
                      for (var y = 0; y < dataset.Tables[i].Rows.Count; y++)
                      {
                          for (var x = 0; x < dataset.Tables[i].Rows[y].ItemArray.Count(); x++)
                          {
                              currentSheet.Cells[y+1, x+1] = dataset.Tables[i].Rows[y].ItemArray[x];
                          }
                      }
              }
      
              string outfile = @"C:\APP_OUTPUT\EXCEL_TEST.xlsx";
      
              workbook.SaveAs( outfile, Type.Missing, Type.Missing, Type.Missing,
                              Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,
                              Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                              Type.Missing);
      
              workbook.Close();
              excel.Quit();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        相关资源
        最近更新 更多