zoukankan      html  css  js  c++  java
  • 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 = "" };
                   //把第一个单元格添加到第一行中
                    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:单元格及行的样式
           如何将这两个都融合到上面提到的规范中去???
     ----------------------------------------------欢迎批评与交流!!!--------------------------

  • 相关阅读:
    北京各银行收取的帐户管理费
    Windows Beta2 不能识别VMWare的声卡
    Windows Vista 不再支持.hlp文件了
    不是所有的x64下的VMWare都可以安装Windows Vista x64
    Delphi下操作PDF文件的控件
    DriverWorks的KPciConfiguration不支持x64平台的解决方法
    查找Windows文件来历的好方法
    在iSEDQuickPDF中如何输出带中文的PDF文件
    英语听力简单研究
    How To Use A Launchpad PPA (Add, Remove, Purge, Disable) In Ubuntu
  • 原文地址:https://www.cnblogs.com/bsyblog/p/4253778.html
Copyright © 2011-2022 走看看