从ASP.NET网站将查询结果发送到Excel

时间:2008-09-29 14:35:23

标签: asp.net excel

我们允许用户在我们的网站上创建即席查询。我们希望用户选择他们的条件,然后单击“提交”并将结果自动流式传输到Excel。我有应用程序填充DataTable,然后使用数据表创建制表符分隔字符串。问题是如何做到这一点。

将数据流式传输到Excel的最佳方法是什么?在单击提交按钮后,我们不必让用户关闭空窗口。

7 个答案:

答案 0 :(得分:10)

将页面的文件类型更改为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);

答案 1 :(得分:1)

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

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

如果要强行保存,可以执行以下操作:

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

答案 2 :(得分:1)

我有一个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();
               }

答案 3 :(得分:0)

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

我强烈推荐的一件事是在服务器上使用Excel互操作......它非常重量级,不受支持。

答案 4 :(得分:0)

获得数据集后,可以将其转换为对象[,]并将其插入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;
         }

答案 5 :(得分:0)

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

答案 6 :(得分:0)

请使用此代码来解决您的问题。此代码会将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);