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 = "" };
     //把第一个单元格添加到第一行中
      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:单元格及行的样式 

如何将这两个都融合到上面提到的规范中去??? 


0 0