ASP.Net到Excel导出-列宽度和交替行着色

本文关键字:Net Excel 导出 -列 ASP | 更新日期: 2023-09-27 17:51:22

我有以下方法,最终创建一个CSV文件,并返回该文件作为对客户端请求的响应。

我怎么能改变列宽度自动适配,并有行交替着色?

public static void ExportToCSV(DataTable dt, HttpResponseBase response, string filename)
{
    response.AddHeader("content-disposition", "attachment; filename=" + filename);
    response.ClearContent();
    response.ContentType = "application/vnd.ms-excel";
    response.Charset = "UTF-8";
    response.ContentEncoding = System.Text.Encoding.Unicode;
    response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble()); 
    string tab = "";
    foreach (DataColumn dc in dt.Columns)
    {
        if (!dc.ColumnName.StartsWith("_"))
        {
            response.Write(tab + dc.ColumnName);
            tab = "'t";
        }
    }
    response.Write("'n");
    int i;
    foreach (DataRow dr in dt.Rows)
    {
        tab = "";
        for (i = 0; i < dt.Columns.Count; i++)
        {
            if (!dr.Table.Columns[i].ColumnName.StartsWith("_"))
            {
                response.Write(Utils.StripHTML(tab + dr[i].ToString().Replace("'n", " ").Replace("'t", " "))); 
                tab = "'t";
            }
        }
        response.Write("'n");
    }
    response.End();
}

ASP.Net到Excel导出-列宽度和交替行着色

CSV文件只是纯文本,其中值由商定的分隔符(通常是逗号,因此名称,在您的情况下是制表符)分隔。

Excel支持CSV文件,这样它就可以在单独的列中表示每个值。这只是可视化的表示,但文件没有实际的列,并且不能包含任何形式的格式化。

您需要将文件格式更改为Excel格式,并以这种方式创建它。您可以使用Excel互操作或将其写成Excel XML文件。我推荐第二种选择。对于Excel XML的工作示例,您可以查看以下CodeProject示例:

您正在创建一个带分隔符的文本文件。

由于该文件是一个普通的文本文件,它不能有任何格式应用。

您的要求是生成一个具有格式和一定宽度的excel文件,因此这只能通过直接生成excel文件来实现。

这可以使用互操作或通过输出所需的xml来完成,但是某种excel库可能更容易实现,而无需担心细节。我个人更喜欢EPPlus。它是一个有用的库,用于创建Excel 2007以后的Excel电子表格。您可以使用nuget或从网站下载安装该库。

下面给出了如何实现这一目标的快速概述。

public static void ExportToCSV(DataTable dt, HttpResponseBase response, string filename)
{
    response.AddHeader("content-disposition", "attachment; filename=" + filename);
    response.ClearContent();
    response.ContentType = "application/vnd.ms-excel";
    response.Charset = "UTF-8";
    response.ContentEncoding = System.Text.Encoding.Unicode;
    response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble()); 
    ExcelPackage package = new ExcelPackage();
    package.Workbook.Properties.Comments = "Demo Excel Generation";
    package.Workbook.Worksheets.Add("DemoSheet");
    ExcelWorksheet sheet = package.Workbook.Worksheets["DemoSheet"];
    bool altColour = false;
    for (int i = 1; i < 10; i++)
    {
        for (int j = 1; j < 10; j++)
        {
            sheet.Cells[i, j].Value = string.Format("{0} - {1}", i, j);
            sheet.Row(j).Style.Fill.PatternType = ExcelFillStyle.Solid;
            sheet.Row(j).Style.Fill.BackgroundColor.SetColor(altColour ? Color.Gold : Color.Goldenrod);
            altColour = !altColour;
        }
        sheet.Column(i).AutoFit(5f); // Set minimum width to 5 points
    }
    //package.File = new System.IO.FileInfo(@"C:'test.xlsx");
    //package.Save();
    package.SaveAs(response.OutputStream);
    Response.End();
}

另一个库是ClosedXML,它(在我看来)通过允许链式方法比其他可能性具有更好的语法。例如:

XLWorkbook workbook = new XLWorkbook("test.xlsx");
IXLWorksheet worksheet = workbook.AddWorksheet("Sheet1");
worksheet.Cell(1, 1).SetValue("Test").Style.Font.SetBold(true);
worksheet.AdjustToContent(); // this changes the column width to fit the content
workbook.Save();