首页 > 代码库 > ASP.NET中的Excel操作(NPOI方式)
ASP.NET中的Excel操作(NPOI方式)
代码准备:
一:实体准备
代码如下:
/// <summary> /// 一个能添加到将要导出到指定行的实体类型规范 /// data:{int StartColIndex ? 0, int ColSpan, object Value, bool Center} /// </summary> public interface IExcelModel { /// <summary> /// 开始列的索引(即使是有合并单元格的情况,也得按未合并单元格时算) /// </summary> int StartColIndex { get; set; } /// <summary> /// 这个值一共占多少个单元格 /// </summary> int ColSpan { get; set; } /// <summary> /// 值 /// </summary> object Value { get; set; } /// <summary> /// 是否居中 /// </summary> bool Center { get; set; } }
上面的接口代码,是对要生成的Excel的单元格的规范,Center:表示是否居中,Value:表示显示的值,ColSpan:表示单元格(列)的合并数,
StartColIndex:表示是第几个单元格,而且跟单元格的合并没有关系。
二:帮助方法类(Helper)准备
/// <summary> /// 使用NPOI由IList<List<IExcelModel>> datas导出Excel /// </summary> public static void ExportDataSetToExcel(string fileName, HSSFWorkbook book, ISheet sheet, IList<List<IExcelModel>> datas) { MemoryStream ms = ExportDataSetToExcel(book,sheet,datas) as MemoryStream; System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8)); HttpContext.Current.Response.BinaryWrite(ms.ToArray()); HttpContext.Current.Response.End(); ms.Close(); ms = null; }
上面方法中,IList<List<IExcelModel>>表示的是一个List<IExcelModel>的集合,而每一个List<IExcelModel>就是一些个单元格的集合,也就是一行。IList<List<IExcelModel>>就是表示要生成的Excel表是由多行的数据组成的。
fileName表示最后要保存的文件名,要带后缀名。
上面方法需要引用的方法代码如下:
private static Stream ExportDataSetToExcel(HSSFWorkbook book, ISheet sheet, IList<List<IExcelModel>> datas) { // create memory stream MemoryStream ms = new MemoryStream(); // process excel file AddDatasToExcelSheet(book, sheet, datas); book.Write(ms); ms.Flush(); ms.Position = 0; book = null; return ms; }
上面方法需要引用的方法代码如下:
/// <summary> /// 将指定数据构造到 Excel 中 /// </summary> /// <param name="book"></param> /// <param name="sheet"></param> /// <param name="datas"></param> public static void AddDatasToExcelSheet(HSSFWorkbook book, ISheet sheet, IList<List<IExcelModel>> datas) { for (int i = 0; i < datas.Count(); i++) { AddDatasToExcelRow(book, sheet, i, datas[i]); } } /// <summary> /// 添加一个数据集合到将要导出的 Excel 的指定行。 /// </summary> public static void AddDatasToExcelRow(HSSFWorkbook book, ISheet sheet, int rowIndex, List<IExcelModel> datas) { IRow row = sheet.CreateRow(rowIndex); ICellStyle cs = book.CreateCellStyle(); foreach (dynamic data in datas) { ICell cell = row.CreateCell(data.StartColIndex); cell.SetCellValue(data.Value); if (data.ColSpan > 1) { CellRangeAddress cra = new CellRangeAddress(rowIndex, rowIndex, data.StartColIndex, data.StartColIndex + data.ColSpan - 1); sheet.AddMergedRegion(cra); } if (data.Center) { //ICellStyle cs = book.CreateCellStyle();//放在这里会报错:The maximum number of cell styles was exceeded. You can define up to 4000 styles cs.VerticalAlignment = VerticalAlignment.Center; cs.Alignment = HorizontalAlignment.Center; cell.CellStyle = cs; } } }
代码实战:
IList<List<IExcelModel>> excelList = new List<List<IExcelModel>>(); //第一行 List<IExcelModel> firstRow = new List<IExcelModel>(); //第一个单元格 IExcelModel tempFRCell = new ExcelModel() { StartColIndex = 0, ColSpan = 1, Center = true, Value = http://www.mamicode.com/"" }; //把第一个单元格添加到第一行中 firstRow.Add(tempFRCell); //把第一个行添加到excelList excelList.Add(firstRow); //最后的 HSSFWorkbook book = new HSSFWorkbook(); ISheet sheet = book.CreateSheet(); //book.Add(sheet); ExcelConstructHelper.ExportDataSetToExcel("示例.xls", book, sheet, excelList);
这样就可以实现网页上直接下载一个Excel文件了。
未解决的问题:
1:单元格的纵向合并
2:单元格及行的样式
如何将这两个都融合到上面提到的规范中去???
----------------------------------------------欢迎批评与交流!!!--------------------------
ASP.NET中的Excel操作(NPOI方式)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。