• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET中的Excel操作(NPOI方式)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

代码准备:

     一:实体准备

               代码如下:

    /// <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 = "" };
               //把第一个单元格添加到第一行中
                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人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NETMVC开篇发布时间:2022-07-10
下一篇:
ASP.NET(C#)图片加文字、图片水印,神啊,看看吧发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap