首页 > 代码库 > 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&lt;List&lt;IExcelModel&gt;&gt; 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方式)