在软件开发过程中,经常会遇到需要将数据导出或显示为Excel文件的场景。虽然网络上有各种实现方法的示例,但往往缺乏可重用的类。幸运的是,从Excel 2003开始,可以创建具有特定格式的XML文件,该文件将作为Excel文件打开。创建XML文档有多种方式,可以使用System.Xml命名空间,字符串连接或使用StringBuilder(不推荐,但可行),但现在可以使用LINQto XML,创建XML变得如此简单,几乎不再有趣。
代码限制:
正如所说,这从Excel2003及以后的版本开始工作,所以如果还在使用Office XP,那么就无法使用。此外,此代码受到Excel的限制,即它不能处理超过256列或65,000行。
使用代码:
这里只是一个名为XmlExcelHelper的类,包含所有方法来添加工作表、行、单元格,甚至为字符串添加样式到新文件。需要System.Xml、System.Xml.Linq和System.Core命名空间才能使其工作。
几乎所有的方法,包括类的构造函数都有多个重载,将演示如何使用其中的一些,可以玩剩下的。这个类是完全文档化的,认为非常直接。解释Excel所需的XML节点超出了本文的范围。
XmlExcelHelper的构造函数调用一个名为CreateExcelHeader的私有方法。该方法添加了使创建的文件成为Excel文件的XML结构,要感谢Ming_Lu,他的文章位于这里,给了创建这个类所需的一切。
这是一个如何使用这个类将数据输入XML并创建一个漂亮的Excel表格的小示例。创建了一个虚拟的DataTable,但可以自定义对象、数据集或任何需要保存为Excel文件的数据。
private const string TABLE_HEADER_FORMAT_NAME = "greyBackground";
private const string SMALL_FONT_FORMAT = "smallFont";
private static DataTable CreateDataTable()
{
DataTable companies = new DataTable("Companies");
DataColumn column;
column = new DataColumn("CompanyName");
companies.Columns.Add(column);
column = new DataColumn("CompanyCountry");
companies.Columns.Add(column);
column = new DataColumn("YearSales");
companies.Columns.Add(column);
column = new DataColumn("GrossProfit");
companies.Columns.Add(column);
column = new DataColumn("CreationDate");
companies.Columns.Add(column);
companies.Rows.Add("Mexican Tequila", "Mexico", "10875600", "4975200", "03/24/1995 2:35:00PM");
companies.Rows.Add("Canadian Food", "Canada", "308450870", "103476200", "08/12/1983");
companies.Rows.Add("French Wines", "France", "285309567", "81650000", "11/21/1990 17:40:00");
companies.Rows.Add("German Beer", "Germany", "285309567", "81650000", "11/21/1990 17:40:00");
companies.Rows.Add("Russian Vodka", "Russia", "285309567", "81650000", "11/21/1990 17:40:00");
companies.Rows.Add("Spanish Paella", "Spain", "285309567", "81650000", "11/21/1990 17:40:00");
companies.Rows.Add("Argentinian Beef", "Argentina", "285309567", "81650000", "11/21/1990 17:40:00");
companies.Rows.Add("Italian Pasta", "Italy", "285309567", "81650000", "11/21/1990 17:40:00");
return companies;
}
public static void CreateReport()
{
DataTable table = CreateDataTable();
XmlExcelHelper helper = new XmlExcelHelper(@"c:\MyExcelTest.xml", "Times New Roman", 11);
helper.AddStringStyle(TABLE_HEADER_FORMAT_NAME, "Arial", 10, "#FFFFFF", "#C0C0C0", false);
helper.AddStringStyle(SMALL_FONT_FORMAT, "Arial", 8, "#000000", false);
helper.CreateSheet("International Foods");
helper.AddRow();
helper.AddCell(XmlExcelHelper.CellType.String, "Report Generated with LINQ to XML");
helper.AddRow();
helper.AddCell(XmlExcelHelper.CellType.String, SMALL_FONT_FORMAT, "Report generated on " + DateTime.Now.ToLongDateString());
helper.AddRow();
foreach (DataColumn column in table.Columns)
{
helper.AddCell(XmlExcelHelper.CellType.String, TABLE_HEADER_FORMAT_NAME, column.ColumnName);
}
foreach (DataRow row in table.Rows)
{
helper.AddRow();
helper.AddCell(XmlExcelHelper.CellType.String, row[0].ToString());
helper.AddCell(XmlExcelHelper.CellType.String, row[1].ToString());
helper.AddCell(XmlExcelHelper.CellType.Number, XmlExcelHelper.DefaultStyles.Decimal, row[2].ToString());
helper.AddCell(XmlExcelHelper.CellType.Number, XmlExcelHelper.DefaultStyles.Decimal, row[3].ToString());
helper.AddCell(XmlExcelHelper.CellType.String, row[4].ToString());
}
helper.SaveDocument();
}
如所见,该类有一个SaveDocument方法将XML文件保存到磁盘。它还有一个ExcelFileXml属性,该属性保存XML字符串,所以,如果需要在Web应用程序中从Web页面显示Excel文件,将不得不这样做:
Response.Clear();
Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
Response.AppendHeader("Content-disposition", "attachment; filename=" + helper.FileName);
Response.Write(helper.ExcelFileXml);
Response.Flush();
Response.End();