C# “从网页导出到Excel”按钮在文件下载到用户计算机后出现错误:“导出到Excel”;“文件格式或文件扩展名无效”;
这是导出按钮:C# “从网页导出到Excel”按钮在文件下载到用户计算机后出现错误:“导出到Excel”;“文件格式或文件扩展名无效”;,c#,html,asp.net,C#,Html,Asp.net,这是导出按钮: protected void btnExportToExcel_Click(object sender, EventArgs e) { var dataTable = (DataTable) Session["finalSchedulesTable"]; var dummyGv = new GridView {AllowPaging = false, DataSource = dataTable};
protected void btnExportToExcel_Click(object sender, EventArgs e)
{
var dataTable = (DataTable) Session["finalSchedulesTable"];
var dummyGv = new GridView {AllowPaging = false, DataSource = dataTable};
dummyGv.DataBind();
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=Schedules " + DateTime.Now.ToString(CultureInfo.InvariantCulture).Replace("/", "-").Replace(":", "_") + ".xlsx");
Response.Charset = "";
//Response.ContentType = "application/vnd.ms-excel";
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
var sw = new StringWriter();
var hw = new HtmlTextWriter(sw);
for (int i = 0; i < dummyGv.Rows.Count; i++)
{
//Apply text style to each Row
dummyGv.Rows[i].Attributes.Add("class", "textmode");
}
dummyGv.RenderControl(hw);
//style to format numbers to string
const string style = @"<style> .textmode { mso-number-format:\@; } </style>";
Response.Write(style);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
}
protectedvoid btnExportToExcel\u单击(对象发送方,事件参数e)
{
var dataTable=(dataTable)会话[“finalSchedulesTable”];
var dummyGv=newgridview{allowpage=false,DataSource=dataTable};
dummyGv.DataBind();
Response.Clear();
Response.Buffer=true;
Replace(“/”,“-”)。Replace(“:”,“”)+”.xlsx”);
响应。Charset=“”;
//Response.ContentType=“application/vnd.ms excel”;
Response.ContentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;
var sw=新的StringWriter();
var hw=新的HtmlTextWriter(sw);
对于(int i=0;i
如果我在上面的代码中将文件扩展名更改为“.xls”,则该过程可以正常工作,但是,当我尝试打开该文件时,仍然会收到以下消息:
您试图打开的文件“filename.xls”的格式与文件扩展名指定的格式不同。请在打开该文件之前,确认该文件未损坏且来源可靠。是否立即打开该文件
如果我说“是”,它会正常打开文件
这里的问题是我不想让这个消息弹出。我该如何着手解决这个问题
我所要做的就是将数据导出到Excel,并允许用户正常打开文件(无任何警告消息)。我过去使用的方法利用EPPlus库: 因此,将其包括在项目中,然后可以调用此方法,只需传入数据表:
public static void DumpExcel(DataTable dataTable)
{
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DataTable");
worksheet.Cells["A1"].LoadFromDataTable(dataTable, true);
for (int i = 1; i <= dataTable.Columns.Count; i++)
{
worksheet.Column(i).AutoFit();
if (dataTable.Columns[i - 1].DataType == System.Type.GetType("System.DateTime"))
{
worksheet.Column(i).Style.Numberformat.Format = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
}
}
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=table.xlsx");
HttpContext.Current.Response.BinaryWrite(package.GetAsByteArray());
HttpContext.Current.Response.End();
}
}
我经常使用此方法,不会收到您描述的错误。我过去使用的方法使用EPPlus库: 因此,将其包括在项目中,然后可以调用此方法,只需传入数据表:
public static void DumpExcel(DataTable dataTable)
{
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DataTable");
worksheet.Cells["A1"].LoadFromDataTable(dataTable, true);
for (int i = 1; i <= dataTable.Columns.Count; i++)
{
worksheet.Column(i).AutoFit();
if (dataTable.Columns[i - 1].DataType == System.Type.GetType("System.DateTime"))
{
worksheet.Column(i).Style.Numberformat.Format = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
}
}
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=table.xlsx");
HttpContext.Current.Response.BinaryWrite(package.GetAsByteArray());
HttpContext.Current.Response.End();
}
}
我经常使用它,不会收到像您描述您的
响应那样的错误。ContentType
是XLSX的类型。XLS是不同的。您正在使用什么版本的excel打开文件?我尝试了这两个版本,但得到了相同的问题:Response.ContentType=“application/vnd.ms excel”;Response.ContentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;你用这种方法做的太多了。在这里,您只需要Response.AddHeader,然后提供文件内容。没有style
或任何其他bs。您的响应.ContentType
是XLSX的。XLS是不同的。您正在使用什么版本的excel打开文件?我尝试了这两个版本,但得到了相同的问题:Response.ContentType=“application/vnd.ms excel”;Response.ContentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;你用这种方法做的太多了。在这里,您只需要Response.AddHeader,然后提供文件内容。没有style
或任何其他bs。顺便说一句,我试图加粗,但“.style”无法解析。你知道为什么吗?没问题,你在上面的语句中使用了的样式吗?顺便说一句,我想加粗,但是“.style”无法解决。你知道为什么吗?没问题,你是在使用上面的语句应用中的样式吗?