zoukankan      html  css  js  c++  java
  • 导出Excel解决方案之一NOPI

    一、概要

    导出Excel这个功能相信很多人都做过,但是实现这个功能解决方案有好几种,今天我未大家介绍一种比较新的,其实也不新了- -!它叫NPOI,可以完美操作EXCEl的导入和导出操作,让我们一起看下代码吧(都是园子里大神写的,我借鉴一下,望海涵)

    二、导入DLL

    实现NOPI需要使用第三方DLL,官方下载地址是:http://npoi.codeplex.com/

    三、关于大数据量的导入问题

    大家都知道Excel2003每个sheet最大的行数是65536,所以大于65535的数据需要写入另一个sheet里,这里是需要注意的。

    四、代码

     1 public void ProcessRequest(HttpContext context)
     2         {
     3             context.Response.ContentType = "application/x-excel";
     4             string filename = HttpUtility.UrlEncode("人员档案.xls");//文件名进行url编码,防止乱码
     5             context.Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
     6 
     7             var list = bArchive.GetAllArchivesBase();
     8 
     9             HSSFWorkbook workBook = new HSSFWorkbook();
    10             ISheet sheet1 = workBook.CreateSheet("表单一");
    11             //sheet列表,防止记录条数大于65535
    12             List<NPOI.SS.UserModel.ISheet> sheetList = new List<NPOI.SS.UserModel.ISheet>();
    13             sheetList.Add(sheet1);
    14             //给sheet1添加数据
    15             SheetFirst(sheet1, workBook, list);
    16             //给其他sheet添加数据   从1开始:去掉第一个sheet  +1是因为有一个表头
    17             int rows = list.Count + 1;
    18             int p = rows % 65535 == 0 ? rows / 65535 : (rows / 65535) + 1;
    19             for (int i = 1; i < p; i++)
    20             {
    21                 ISheet sheet = workBook.CreateSheet("sheet" + (i + 1).ToString());
    22                 //为sheet添加数据
    23                 SheetElse(sheet, (i - 1) * 65535 + 65535, list);
    24             }
    25             // 写入到客户端 
    26             System.IO.MemoryStream ms = new System.IO.MemoryStream();
    27             workBook.Write(ms);
    28             context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyyMMddHHmmssfff")));
    29             context.Response.BinaryWrite(ms.ToArray());
    30             workBook = null;
    31             ms.Close();
    32             ms.Dispose();
    33         }
    34 
    35         //第一个Sheet,Excel最大行数是65536行
    36         protected void SheetFirst(NPOI.SS.UserModel.ISheet sheet1, NPOI.HSSF.UserModel.HSSFWorkbook book, List<ArchivesBase> datalist)
    37         {
    38             //标题
    39             NPOI.SS.UserModel.ICell cellTitle = sheet1.CreateRow(0).CreateCell(0);
    40             //cellTitle.SetCellValue("水位月报表--" + drpCategory.SelectedItem.Text);
    41             cellTitle.SetCellValue("人事档案表");
    42             //设置标题行样式
    43             NPOI.SS.UserModel.ICellStyle style = book.CreateCellStyle();
    44             style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
    45             NPOI.SS.UserModel.IFont font = book.CreateFont();
    46             font.FontHeight = 20 * 20;
    47             style.SetFont(font);
    48             cellTitle.CellStyle = style;
    49             //合并标题行
    50             sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 9));
    51 
    52             //给sheet1添加第一行的头部标题
    53             NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(1);
    54             row1.CreateCell(0).SetCellValue("档案号");
    55             row1.CreateCell(1).SetCellValue("姓名");
    56             row1.CreateCell(2).SetCellValue("性别");
    57             row1.CreateCell(3).SetCellValue("档案类型");
    58             row1.CreateCell(4).SetCellValue("毕业时间");
    59             row1.CreateCell(5).SetCellValue("毕业学校");
    60             row1.CreateCell(6).SetCellValue("身份证");
    61             //将数据逐步写入sheet1各个行
    62             for (int i = 0; i < 65535; i++)
    63             {
    64                 NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
    65                 rowtemp.CreateCell(0).SetCellValue(datalist[i].ArchivesNO == null ? "" : datalist[i].ArchivesNO.ToString());
    66                 rowtemp.CreateCell(1).SetCellValue(datalist[i].PeopleName == null ? "" : datalist[i].PeopleName.ToString());
    67                 rowtemp.CreateCell(2).SetCellValue(datalist[i].PeopleSex == null ? "" : datalist[i].PeopleSex.ToString());
    68                 rowtemp.CreateCell(3).SetCellValue(datalist[i].ArchivesClass == null ? "" : datalist[i].ArchivesClass.ToString());
    69                 rowtemp.CreateCell(4).SetCellValue(datalist[i].GraduateTime == null ? "" : datalist[i].GraduateTime.ToString());
    70                 rowtemp.CreateCell(5).SetCellValue(datalist[i].ArchivesSchool == null ? "" : datalist[i].ArchivesSchool.ToString());
    71                 rowtemp.CreateCell(6).SetCellValue(datalist[i].PeopleCardNO == null ? "" : datalist[i].PeopleCardNO.ToString());
    72             }
    73         }
    74 
    75         //其他sheet  
    76         protected void SheetElse(NPOI.SS.UserModel.ISheet sheet, int j, List<ArchivesBase> datalist)
    77         {
    78             //将数据逐步写入sheet1各个行
    79             for (int i = 0; j + i < datalist.Count; i++)//65535
    80             {
    81                 NPOI.SS.UserModel.IRow rowtemp = sheet.CreateRow(i);
    82                 rowtemp.CreateCell(0).SetCellValue(datalist[j + i].ArchivesNO == null ? "" : datalist[j + i].ArchivesNO.ToString());
    83                 rowtemp.CreateCell(1).SetCellValue(datalist[j + i].PeopleName == null ? "" : datalist[j + i].PeopleName.ToString());
    84                 rowtemp.CreateCell(2).SetCellValue(datalist[j + i].PeopleSex == null ? "" : datalist[j + i].PeopleSex.ToString());
    85                 rowtemp.CreateCell(3).SetCellValue(datalist[j + i].ArchivesClass == null ? "" : datalist[j + i].ArchivesClass.ToString());
    86                 rowtemp.CreateCell(4).SetCellValue(datalist[j + i].GraduateTime == null ? "" : datalist[j + i].GraduateTime.ToString());
    87                 rowtemp.CreateCell(5).SetCellValue(datalist[j + i].ArchivesSchool == null ? "" : datalist[j + i].ArchivesSchool.ToString());
    88                 rowtemp.CreateCell(6).SetCellValue(datalist[j + i].PeopleCardNO == null ? "" : datalist[j + i].PeopleCardNO.ToString());
    89             }
    90         }

    以上代码园子里有很多,o(∩_∩)o 我写下来防止以后忘记,也顺便学习下,话说这个NPOI真的很好用哦~~

  • 相关阅读:
    C# 上传辅助方法
    C# 经纬度计算
    C#Excel导出反射数据集
    C# 数据模板导出
    C# 百度经纬度获取地址信息
    【平台开发】— 5.后端:代码分层
    【平台开发】— 4.mysql建库建表
    【平台开发】— 3.前端开发思路
    【平台开发】— 2.前端:vue-element-admin
    【平台开发】— 1.开篇
  • 原文地址:https://www.cnblogs.com/xuguoming/p/3419608.html
Copyright © 2011-2022 走看看