【问题标题】:Send query results to Excel from ASP.NET website从 ASP.NET 网站将查询结果发送到 Excel
【发布时间】:2008-09-29 14:35:23
【问题描述】:

我们允许用户在我们的网站中创建临时查询。我们希望用户选择他们的标准,然后单击提交并将结果自动传输到 Excel。我让应用程序填充数据表,然后使用数据表创建制表符分隔的字符串。问题是让它变得优秀。

将数据流式传输到 Excel 的最佳方式是什么?最好不要让用户在点击提交按钮后关闭一个空窗口。

【问题讨论】:

    标签: asp.net excel


    【解决方案1】:

    将页面的文件类型更改为 excel,并且仅将构建表格所需的 HTML 流式传输到页面。代码来自here

    //for demo purpose, lets create a small datatable & populate it with dummy data
    System.Data.DataTable workTable = new System.Data.DataTable();
    
    //The tablename specified here will be set as the worksheet name of the generated Excel file. 
    workTable.TableName = "Customers";
    workTable.Columns.Add("Id");
    workTable.Columns.Add("Name");
    System.Data.DataRow workRow;
    
    for (int i = 0; i <= 9; i++)
    {
    workRow = workTable.NewRow();
    workRow[0] = i;
    workRow[1] = "CustName" + i.ToString();
    workTable.Rows.Add(workRow);
    }
    
    //...and lets put DataTable2ExcelString to work
    string strBody = DataTable2ExcelString(workTable);
    
    Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
    Response.AppendHeader("Content-disposition", "attachment; filename=my.xls");
    Response.Write(strBody);
    

    【讨论】:

    • 请注意,这不会创建一个普通的 excel 文件,就像您打开 excel 并手动创建一个......它是一个 html 文件。
    【解决方案2】:

    如果您创建的页面只是一个包含结果的表格并将页面的内容类型设置为“application/vnd.ms-excel”,那么输出将在 Excel 中。

    Response.ContentType = "application/vnd.ms-excel";
    

    如果您想强制保存,您可以执行以下操作:

    Response.AddHeader("Content-Disposition", "attachment; filename=somefilename.xls");
    

    【讨论】:

      【解决方案3】:

      我已经有了一个 utils 函数。将其放入数据表后,您可以使用

      将其与响应一起导出
              public static void DataTabletoXLS(DataTable DT, string fileName)
          {
              HttpContext.Current.Response.Clear();
              HttpContext.Current.Response.Charset = "utf-16";
              HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
              HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", fileName));
              HttpContext.Current.Response.ContentType = "application/ms-excel";
      
              string tab = "";
              foreach (DataColumn dc in DT.Columns)
              {
                  HttpContext.Current.Response.Write(tab + dc.ColumnName.Replace("\n", "").Replace("\t", ""));
                  tab = "\t";
              }
              HttpContext.Current.Response.Write("\n");
      
              int i;
              foreach (DataRow dr in DT.Rows)
              {
                  tab = "";
                  for (i = 0; i < DT.Columns.Count; i++)
                  {
                      HttpContext.Current.Response.Write(tab + dr[i].ToString().Replace("\n", "").Replace("\t", ""));
                      tab = "\t";
                  }
                  HttpContext.Current.Response.Write("\n");
              }
              HttpContext.Current.Response.End();
                     }
      

      【讨论】:

      • +1。但是,这又如何:返回多个结果集、使用现有的 Excel 模板、多个工作表,并将每个结果集放置在相应工作表上的相应单元格中?
      【解决方案4】:

      我建议使用filehandler (.ashx) 唯一的问题是从DataTable 创建excel 文件。有很多第三方产品可以为您执行此操作(例如,Infragistics 提供了一个可以执行此操作的组件)。

      我强烈反对的一件事是在您的服务器上使用 Excel 互操作...它非常重量级并且不受支持。

      【讨论】:

        【解决方案5】:

        拥有数据集后,您可以将其转换为对象[,] 并将其插入 Excel 文档。然后您可以将文档保存到磁盘并将其流式传输给用户。

                //write the column headers
                for (int cIndex = 1; cIndex < 1 + columns; cIndex++)
                    sheet.Cells.set_Item(4, cIndex, data.Columns[cIndex - 1].Caption);
                if (rows > 0)
                {
        
                    //select the range where the data will be pasted
                    Range r = sheet.get_Range(sheet.Cells[5, 1], sheet.Cells[5 + (rows - 1), columns]);
        
                    //Convert the datatable to an object array
                    object[,] workingValues = new object[rows, columns];
        
                    for (int rIndex = 0; rIndex < rows; rIndex++)
                        for (int cIndex = 0; cIndex < columns; cIndex++)
                            workingValues[rIndex, cIndex] = data.Rows[rIndex][cIndex].ToString();
        
                    r.Value2 = workingValues;
                 }
        

        【讨论】:

        【解决方案6】:

        我将使用 .xls 文件扩展名的处理程序和一个免费组件将 DataTable 转换为原生 xls 格式。此站点http://www.csvreader.com/ 中的组件比 URL 所暗示的更多。最新版本的 excel 将抱怨 HTML 格式的 XLS 文件。还要记住要返回的数据的大小。您的 Web 服务器应该对此扩展使用压缩,并且您的代码应该检查返回的行数是否大于 Excel 在一个工作表中可以显示的行数;可能需要多张纸。 http://www.mrexcel.com/archive2/23600/26869.htm

        【讨论】:

          【解决方案7】:

          请使用此代码解决您的问题。此代码将 excel 表转换为文本格式。希望这能解决您的问题

              grdSrcRequestExport.RenderControl(oHtmlTextWriter);
              string s = "";
              s=oStringWriter.ToString().Replace("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">", "");
              s="<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\"><head><meta http-equiv=Content-Type content=\"text/html; charset=us-ascii\"><meta name=ProgId content=Excel.Sheet><meta name=Generator content=\"Microsoft Excel 11\"><table x:str border=0 cellpadding=0 cellspacing=0 width=560 style='border-collapse: collapse;table-layout:fixed;width:420pt'>"+s.ToString()+"</table></body></html>";
              //Byte[] bContent = System.Text.Encoding.GetEncoding("utf-8").GetBytes();
              Response.Write(s);
          

          【讨论】:

            猜你喜欢
            • 2017-03-11
            • 2016-07-23
            • 2023-03-10
            • 2011-08-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-08
            • 1970-01-01
            相关资源
            最近更新 更多