使用ASP.NET网站

时间:2015-10-23 13:15:05

标签: asp.net excel office-automation

我有一个ASP.NET应用程序,可以帮助用户创建包含特定数据的Gridview。生成此表后,我希望用户按下一个按钮,并能够将表保存为Excel文档。我知道有两种不同的方法:

  1. 将HtmlTextWriter与ContentType“application / vnd.ms-excel”一起使用,将文件作为HttpResponse发送。我使用GridView1.RenderControl(htmlTextWriter)来渲染gridview。这几乎可以工作,但是当文件打开时,excel文件总是会显示警告,因为内容与扩展名不匹配。我尝试了各种内容类型无济于事。这是有道理的,我猜,因为我正在使用HtmlWriter。这似乎也不是一个好习惯。

  2. 我尝试的第二件事是使用Office Automation生成Excel文件。但是对于要生成的文件,我需要将其保存到磁盘然后再次读取。根据我的阅读,这是唯一的方法,因为Excel对象只有在保存后才会成为真正的Excel文件。我发现Excel类中的.saveas方法会因为写权限而抛出异常,即使我试图保存在App_Data文件夹中也是如此。所以我做了一些研究,发现显然Office Web Automation不支持Web服务:https://support.microsoft.com/en-us/kb/257757

  3.   

    Microsoft目前不推荐,也不支持,   任何无人值守的Microsoft Office应用程序的自动化,   非交互式客户端应用程序或组件(包括ASP,   ASP.NET,DCOM和NT服务),因为Office可能会出现不稳定   Office在此环境中运行时的行为和/或死锁。

    肯定有一种保存方式让网站生成Excel文件并提供给用户!?我无法想象这个问题没有解决或者很少见到没有人关心它,但我找不到任何好的解决方案。

1 个答案:

答案 0 :(得分:0)

创建excel文件最简单(也是最好)的方法是使用epplus

Epplus sample for webapplication

            using (ExcelPackage pck = new ExcelPackage())
            {
                ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");

                //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
                ws.Cells["A1"].LoadFromDataTable(tbl, true);

                //Format the header for column 1-3
                using (ExcelRange rng = ws.Cells["A1:C1"])
                {
                    rng.Style.Font.Bold = true;
                    rng.Style.Fill.PatternType = ExcelFillStyle.Solid;                      //Set Pattern for the background to Solid
                    rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(79, 129, 189));  //Set color to dark blue
                    rng.Style.Font.Color.SetColor(Color.White);
                }

                //Example how to Format Column 1 as numeric 
                using (ExcelRange col = ws.Cells[2, 1, 2 + tbl.Rows.Count, 1])
                {
                    col.Style.Numberformat.Format = "#,##0.00";
                    col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
                }

                //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());
}