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

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

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

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

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

您需要将文件的格式更改为Excel格式,并以此方式创build。 您可以使用Excel互操作或将其作为Excel XML文件编写。 我build议第二个选项。 有关Excel XML的工作示例,可以查看此CodeProject示例 。

您正在创build一个分隔文本文件。

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

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

这可以通过使用interop来完成,或者通过输出所需的xml来完成,但某种excel库可能更容易实现,而不用担心细节。 我个人比较喜欢EPPlus 。 这是一个有用的图书馆,用于创buildexcel 2007以后的Excel电子表格。 您可以使用金块安装库或从网站下载。

以下简要介绍如何实现这一目标。

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