Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “从网页导出到Excel”按钮在文件下载到用户计算机后出现错误:“导出到Excel”;“文件格式或文件扩展名无效”;_C#_Html_Asp.net - Fatal编程技术网

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”无法解决。你知道为什么吗?没问题,你是在使用上面的
语句应用
中的样式吗?