導出Excel解決方案之一NOPI

1、概要

導出Excel這個功能相信不少人都作過,可是實現這個功能解決方案有好幾種,今天我未你們介紹一種比較新的,其實也不新了- -!它叫NPOI,能夠完美操做EXCEl的導入和導出操做,讓咱們一塊兒看下代碼吧(都是園子裏大神寫的,我借鑑一下,望海涵)app

2、導入DLL

實現NOPI須要使用第三方DLL,官方下載地址是:http://npoi.codeplex.com/學習

3、關於大數據量的導入問題

你們都知道Excel2003每一個sheet最大的行數是65536,因此大於65535的數據須要寫入另外一個sheet裏,這裏是須要注意的。大數據

4、代碼

 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真的很好用哦~~編碼

相關文章
相關標籤/搜索