1

这是导出按钮:

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();
        }

如果我在上面的代码中将文件扩展名更改为“.xls”,则该过程有效,但是,当我尝试打开文件时仍然收到以下消息:

“您尝试打开的文件 'filename.xls' 的格式与文件扩展名指定的格式不同。在打开文件之前,请确认文件没有损坏并且来自受信任的来源。您要打开现在存档?”

如果我说“是”,它将正常打开文件。

这里的问题是我不希望此消息弹出。我该如何解决这个问题?

我要做的就是将数据导出到 Excel 并允许用户正常打开文件(没有任何警告消息)。

4

1 回答 1

1

我过去使用的方法利用了 EPPlus 库: http ://epplus.codeplex.com/

所以把它包含在你的项目中,然后你可以调用这个方法,只需传入你的DataTable:

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();
    }
}

您也可以轻松添加样式,例如,如果您希望标题行加粗:

worksheet.Row(1).Style.Font.Bold = true;

我经常使用它并且没有收到您描述的错误

于 2013-07-16T18:13:46.583 回答