ASP.Net到Excel导出 - 列宽和备用行着色

时间:2014-03-21 12:51:49

标签: c# asp.net excel

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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

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

这可以使用interop或输出所需的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();
}

答案 2 :(得分:1)

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