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