使用LINQ to XML创建Excel文件的类

在软件开发过程中,经常会遇到需要将数据导出或显示为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();
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485