【问题标题】:ASP.Net to Excel export - column width and alternate row coloringASP.Net 到 Excel 导出 - 列宽和交替行着色
【发布时间】:2014-03-21 12:51:48
【问题描述】:

我有以下方法最终创建一个 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();
}

【问题讨论】:

  • 您不能对 CSV 格式应用任何格式。
  • 这个方法中的什么使它成为 CSV?我不能说。我唯一认识的是response.ContentType = "application/vnd.ms-excel";
  • 我可以将格式更改为 Excel 然后进行更改吗?
  • 无论你做什么都不要使用互操作。您正在这里创建一个制表符分隔的文件。我认为最好的方法是创建一个 XML 格式的 Excel 文件。一种方法是在 Excel 中创建一个示例文件,然后将其保存为所需的 XML 格式。然后看看结构并模仿它。

标签: c# asp.net excel


【解决方案1】:

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

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

您需要将文件格式更改为 Excel 格式,然后以这种方式创建。您可以使用 Excel 互操作或将其编写为 excel XML 文件。我推荐第二种选择。有关 Excel XML 的工作示例,您可以查看this CodeProject example

【讨论】:

    【解决方案2】:

    您当前正在创建一个分隔文本文件。

    由于该文件是普通文本文件,因此不能应用任何格式。

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

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

    下面简要概述了如何实现这一点。

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

    【讨论】:

    • 您如何将此代码合并到我发布的方法中?此方法是对 Web 服务的响应。
    • @hermann 我已更新代码以包装在 ExportToCSV 方法中。它需要测试,但它应该是这样工作的。您需要用自己的循环替换循环 - 以生成您需要的任何内容。
    【解决方案3】:

    另一个库是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();
    

    【讨论】:

    • 您如何将此代码合并到我发布的方法中?此方法是对 Web 服务的响应。
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2016-12-23
    • 2019-07-22
    • 2011-01-19
    • 2014-05-03
    相关资源
    最近更新 更多