我正在开发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.
还有其他办法吗?
答案 0 :(得分:1)
您创建的不是Excel工作表,而是HTML表。这对于每个excel用户来说都很烦人,因为加载文件时出现错误弹出是不可避免的。此外,在这种方法中,高级格式化,公式,验证等是不可能的。
我会推荐libary EPPLUS,它提供了一个非常好(和快速!)的界面来读/写xlsx文件。 图书馆有很好的许可证,所以你不需要开源你的项目或其他垃圾。
图书馆有很好的文档(示例项目)。
答案 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#