我目前正在编写ASP.NET MVC 5控制器操作以将一些数据导出到Excel文件(使用我在此处找到的一些代码)。它主要起作用。它输出一个Excel文件,我可以打开它,但不会在显示以下错误信息之前:
“'Export.xls'的文件格式和扩展名不匹配。文件可能已损坏或不安全。除非您信任它的来源,否则请不要打开它。你还要打开它吗?”< / p>
我继续选择“是”,然后打开。我可以在我的机器上重新保存并打开该文件,但我没有收到错误。它可以正常工作,唯一的另一个奇怪的是文件的网格线格式与Excel文件的格式不同,几乎更像HTML表而不是Excel表。但是,奇怪的错误消息不是可以接受的,所以我必须解决它。
这是我的代码:
public void ExportExcel()
{
// DataObject is a class that fetches the data for this method
DataObject dataObj = new DataObject();
var grid = new GridView();
// dataObj.GetDataList returns a List<T> of data model class objects
grid.DataSource = dataObj.GetDataList();
grid.DataBind();
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=Export.xls");
Response.ContentType = "application/vnd.ms-excel";
Response.Charset = "";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
grid.RenderControl(htw);
byte[] byteArray = Encoding.ASCII.GetBytes(sw.ToString());
MemoryStream s = new MemoryStream(byteArray);
StreamReader sr = new StreamReader(s, Encoding.ASCII);
Response.Write(sr.ReadToEnd());
Response.End();
}
我已经尝试将Response.ContentType设置为其他值(“application / excel”,“application / ms-excel”),但无济于事。我对ASP.NET和C#一般都是新手,因此可能会有一些我在这里缺少或做错的事情;我更习惯PHP和Zend。您将给予的任何见解或帮助将不胜感激;谢谢!
答案 0 :(得分:5)
您正在将HTML表格编写为Excel文件。基本上,你正在用这个文字:
<table>
<tr>
<td>
Stuff
</td>
</tr>
</table>
并将其编写为带有.xls
扩展名的文本文件。 Excel足够“智能”(如果您可以调用它)打开文件并正确显示它,尽管它会提醒您文件实际上不是xls
文件。
您需要处理它(不是一个好的解决方案),将表中的数据转换为csv并发送CSV(更好的解决方案)或使用Excel库创建实际的Excel文件并发送。其中,CSV可能是最简单的。
答案 1 :(得分:0)
我得到了同样的错误。所以,我开始(使用Microsoft.Office.Interop.Excel)从Nuget Manager获取它。
Here is the code
Microsoft.Office.Interop.Excel.Application xla = new Microsoft.Office.Interop.Excel.Application();
Workbook wb = xla.Workbooks.Add(XlSheetType.xlWorksheet);
Worksheet ws = (Worksheet)xla.ActiveSheet;
/ *标题在这里* /
ws.Cells[1, 1] = "Header1";
ws.Cells[1, 2] = "Header2"; ws.Cells[1, 3] = "Header3"; ws.Cells[1, 4] = "Header4"; ws.Cells[1, 5] = "Header5";
int i = 2;
/ *使用此处的列表填充数据行* /
foreach (var a in pavmm.Funds)
{
ws.Cells[i, 1] = a.FilingID;
ws.Cells[i, 2] = a.Security_Name; ws.Cells[i, 3] = a.Filing_Type; ws.Cells[i, 4] = a.st_name; ws.Cells[i, 5] = a.Permit;
i = i + 1;
}
ws.Columns.AutoFit();
ws.Rows.AutoFit();
string folder = NewFolderName + "\\";
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
string filename = ExcelsheetName + ".xlsx";
filename = filename.Replace('/', '-');
filename = filename.Replace('\\', '-');
string path = Path.Combine(folder, filename);
wb.SaveCopyAs(path);