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