如何在MVC中将数据导出到Excel工作表

时间:2014-07-08 07:44:36

标签: asp.net-mvc excel export-to-excel

我正在开发MVC中的应用程序,我想将数据导出到Excel工作表。目前我正在使用此代码 -

 public ActionResult ExportToExcel(int id)
        {
            string UserName = (string)HttpContext.Session["loggedUserName"];

            PurchaseOrderService purchaseOrderService = new PurchaseOrderService();
            PurchaseOrderDTO PurchaseOrder = purchaseOrderService.GetById(Convert.ToInt32(id));

            StringBuilder sb = new StringBuilder();
            sb.Append("<table border=`" + "1px" + "`b>");

            sb.Append("<tr>");
            sb.Append("<td><b><font face=Calibri size=3>Created By : " + UserName + "</font></b></td>");
            sb.Append("</tr>");

            sb.Append("<tr>");
            sb.Append("<td><b><font face=Calibri size=3>Purchase Order No. :" + PurchaseOrder.Id.ToString() + "</font></b></td>");
            sb.Append("</tr>");

            sb.Append("<tr>");
            sb.Append("<td><b><font face=Calibri size=3>Vendor Name : " + PurchaseOrder.VendorName.ToString() + "</font></b></td>");
            sb.Append("</tr>");

            sb.Append("<tr>");
            sb.Append("<td><b><font face=Calibri size=3>Purchase Order Date : " + PurchaseOrder.OrderDate.ToString("dd-MMM-yy") + "</font></b></td>");
            sb.Append("</tr>");

            sb.Append("<tr>");
            sb.Append("</tr>");

            sb.Append("<tr>");
            sb.Append("<td><b><font face=Calibri size=3>SR NO.</font></b></td>");
            sb.Append("<td><b><font face=Calibri size=3>PRODUCT CODE</font></b></td>");
            sb.Append("<td><b><font face=Calibri size=3>VP CODE</font></b></td>");
            sb.Append("<td><b><font face=Calibri size=3>PRODUCT DESCRIPTION</font></b></td>");
            sb.Append("<td><b><font face=Calibri size=3>QUANTITY</font></b></td>");
            sb.Append("</tr>");

            int rowCount = 1;
            var quantity = 0;

            foreach (var item in PurchaseOrder.purchaseOrderItemDTOList)
            {
                if (PurchaseOrder.purchaseOrderItemDTOList.Count > 1)
                {
                    sb.Append("<td><font face=Calibri size=" + "11px" + ">" + rowCount.ToString() + "</font></td>");
                    sb.Append("<td><font face=Calibri size=" + "11px" + ">" + item.Product.ProductCode.ToString() + "</font></td>");
                    sb.Append("<td><font face=Calibri size=" + "11px" + ">" + item.Product.VendorProductCode.ToString() + "</font></td>");
                    sb.Append("<td><font face=Calibri size=" + "11px" + ">" + item.Product.Name.ToString() + "</font></td>");
                    sb.Append("<td><font face=Calibri size=" + "11px" + ">" + item.Quantity.ToString() + "</font></td>");
                    quantity = quantity + item.Quantity;

                }
                sb.Append("</tr>");
                rowCount = rowCount + 1;
            }

            sb.Append("<tr>");
            sb.Append("<td  colspan=3></td>");
            sb.Append("<td><b><font face=Calibri size=3>Total Quantity : </font></b></td>");
            sb.Append("<td><font face=Calibri size=" + "11px" + ">" + quantity.ToString() + "</font></td>");
            sb.Append("</tr>");

            sb.Append("</table>");
            HttpContext.Response.AddHeader("content-disposition", "attachment; filename=PO NO_" + PurchaseOrder.Id +"_"+ DateTime.Now.ToString("dd-MMM-yy") + ".xls");
            this.Response.ContentType = "application/vnd.ms-excel";
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
            return File(buffer, "application/vnd.ms-excel");
        } 

此代码正常运行,但当我尝试打开excel表时,它会显示 -

The file you are trying to open is in different format than specified by the file extension.

还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

您创建的不是Excel工作表,而是HTML表。这对于每个excel用户来说都很烦人,因为加载文件时出现错误弹出是不可避免的。此外,在这种方法中,高级格式化,公式,验证等是不可能的。

我会推荐libary EPPLUS,它提供了一个非常好(和快速!)的界面来读/写xlsx文件。 图书馆有很好的许可证,所以你不需要开源你的项目或其他垃圾。

图书馆有很好的文档(示例项目)。

http://epplus.codeplex.com/

答案 1 :(得分:0)

因此,您似乎正在尝试将.html表格作为.xls文档打开,我认为这些文档无效。

获取Excel(imo)内容的最简单方法是将数据导出为分隔文件(通常是制表符或逗号)。

有几个用于在c#中创建csv文件的库,但它也非常容易手动

StringBuilder sb = new StringBuilder();
//headers
sb.AppendLine("column1, column2, column3, column4");

foreach (var item in dataItemsEnumerable)
{
    sb.AppendFormat("{0},{1},{2},{3}\n", item.value1, item.value2, item.value3, item.value4);
}

File.WriteAllText(sb.ToString, "myFile.csv");

如果您在创建XLS文件时设置了一些库,那么也可以使用一些库。看看这个https://code.google.com/p/excellibrary/

此问题也很好地解释了您的选择: Create Excel (.XLS and .XLSX) file from C#