C#使用NOPI生成excel要点记载
很久没动手写博客了,最近由于公司比较忙,接触了不同类容,对自己的技术和业务理解有了更深入的理解。今天有点小空,将前段时间所运用到的一些知识点记录下来。
由于公司业务需要统计一些数据,所以对于我们来说,最后是整一个报表,免得随时都来找你导出数据,还需要写SQL,上服务器,导出数据,特别麻烦。所以得空做了报表的功能,其中附带了导出数据为excel。由于首次接触,以前也知识了解了一下,此次就深入的好好的研究了一下。对于报表的数据提取这些到没什么,主要是在导出数据和下载。经过了多方收集资料和对比之后,最后选定了NOPI做为导出excel的工具。至于其他的需要在本地服务器上安装软件什么的,觉得特别麻烦,觉得不可取。由于每个公司每个业务导出的报表样式及规则都不同,故这里只记录一下NOPI的要点。
1.创建一个Excel文件
1 HSSFWorkbook workbook = new HSSFWorkbook();
2.创建一个Excel的Sheet
1 HSSFSheet sheet = workbook.CreateSheet(); 2 sheet.createFreezePane(1, 3);// 冻结
3.设置每列宽度样式
1 方法一: 2 sheet.SetColumnWidth(0, 30 * 100);//注意,这里是和C#一样,从0开始 3 方法二: 4 //设置列宽 5 6 int columnWidth = sheet.GetColumnWidth(0) / 256;//获取当前列宽度 7 int length = Encoding.UTF8.GetBytes(sheet.GetRow(index).GetCell(i).ToString()).Length;//获取当前单元格的内容宽度 8 if (columnWidth < length + 1) 9 columnWidth = length + 1; 10 sheet.SetColumnWidth(i, columnWidth * 256);//列宽
4.设置样式
1 // Sheet样式 2 HSSFCellStyle sheetStyle = workbook.createCellStyle(); 3 // 背景色的设定 4 sheetStyle.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index); 5 // 前景色的设定 6 sheetStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); 7 // 填充模式 8 sheetStyle.setFillPattern(HSSFCellStyle.FINE_DOTS); 9 // 设置列的样式 10 for (int i = 0; i <= 14; i++) { 11 sheet.setDefaultColumnStyle((short) i, sheetStyle); 12 }
5.设置excel第一行及标题
1 HSSFRow title = sheet.CreateRow(0); 2 3 string[] titles = { "出团日期", "订单编号", "产品编号", "产品名称", "下单时间", "成人数", "儿童数", "销售价", "保险", "合同", "手续费", "实际收入" }; 4 for (int i = 0; i < titles.Length; i++) 5 { 6 title.CreateCell(i).SetCellValue(titles[i]); 7 }
6.设置单元格公式、样式
1 样式: 2 // 设置字体 3 HSSFFont headfont = workbook.createFont(); 4 headfont.setFontName("黑体"); 5 headfont.setFontHeightInPoints((short) 22);// 字体大小 6 headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 7 // 另一个样式 8 HSSFCellStyle headstyle = workbook.createCellStyle(); 9 headstyle.setFont(headfont); 10 headstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 11 headstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中 12 headstyle.setLocked(true); 13 headstyle.setWrapText(true);// 自动换行 14 // 另一个字体样式 15 HSSFFont columnHeadFont = workbook.createFont(); 16 columnHeadFont.setFontName("宋体"); 17 columnHeadFont.setFontHeightInPoints((short) 10); 18 columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 19 // 列头的样式 20 HSSFCellStyle columnHeadStyle = workbook.createCellStyle(); 21 columnHeadStyle.setFont(columnHeadFont); 22 columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 23 columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中 24 columnHeadStyle.setLocked(true); 25 columnHeadStyle.setWrapText(true); 26 columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);// 左边框的颜色 27 columnHeadStyle.setBorderLeft((short) 1);// 边框的大小 28 columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);// 右边框的颜色 29 columnHeadStyle.setBorderRight((short) 1);// 边框的大小 30 columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单元格的边框为粗体 31 columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色 32 // 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式) 33 columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index); 34 35 HSSFFont font = workbook.createFont(); 36 font.setFontName("宋体"); 37 font.setFontHeightInPoints((short) 10); 38 // 普通单元格样式 39 HSSFCellStyle style = workbook.createCellStyle(); 40 style.setFont(font); 41 style.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 左右居中 42 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);// 上下居中 43 style.setWrapText(true); 44 style.setLeftBorderColor(HSSFColor.BLACK.index); 45 style.setBorderLeft((short) 1); 46 style.setRightBorderColor(HSSFColor.BLACK.index); 47 style.setBorderRight((short) 1); 48 style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单元格的边框为粗体 49 style.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色. 50 style.setFillForegroundColor(HSSFColor.WHITE.index);// 设置单元格的背景颜色. 51 // 另一个样式 52 HSSFCellStyle centerstyle = workbook.createCellStyle(); 53 centerstyle.setFont(font); 54 centerstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 55 centerstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中 56 centerstyle.setWrapText(true); 57 centerstyle.setLeftBorderColor(HSSFColor.BLACK.index); 58 centerstyle.setBorderLeft((short) 1); 59 centerstyle.setRightBorderColor(HSSFColor.BLACK.index); 60 centerstyle.setBorderRight((short) 1); 61 centerstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单元格的边框为粗体 62 centerstyle.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色. 63 centerstyle.setFillForegroundColor(HSSFColor.WHITE.index);// 设置单元格的背景颜色. 64 65 公式: 66 //设置时间格式 67 HSSFCellStyle cellStyleGroupDate = workbook.CreateCellStyle(); 68 HSSFDataFormat dateGroup = workbook.CreateDataFormat(); 69 cellStyleGroupDate.DataFormat = dateGroup.GetFormat("yyyy-mm-dd"); 70 //设置时间格式 71 HSSFCellStyle cellStyleInsertDate = workbook.CreateCellStyle(); 72 HSSFDataFormat dateInsert = workbook.CreateDataFormat(); 73 cellStyleInsertDate.DataFormat = dateInsert.GetFormat("yyyy-mm-dd hh:mm:ss"); 74 //设置金额格式 75 HSSFCellStyle money = workbook.CreateCellStyle(); 76 money.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00"); 77 78 79 给单元格设置公式 80 row.GetCell(0).CellStyle = cellStyleGroupDate;
7.填充数据
这不就有自己决定了,这里就不记录了
8.输出流,并下载
1 MemoryStream ms = new MemoryStream(); 2 workbook.Write(ms); 3 string s = Request.Browser.Type; 4 if (s.IndexOf("IE") != -1) 5 { 6 Response.AddHeader("Content-Disposition", string.Format("attachment;filename=" + HttpUtility.UrlEncode("XXXXX(" + begin.ToString("yyyy-MM-dd") + "---" + end.ToString("yyyy-MM-dd") + ")", System.Text.Encoding.UTF8) + ".xls")); 7 } 8 else 9 { 10 Response.AddHeader("Content-Disposition", string.Format("attachment;filename=" + HttpUtility.UrlEncode("用XXXXXXXX(" + begin.ToString("yyyy-MM-dd") + "---" + end.ToString("yyyy-MM-dd") + ")", System.Text.Encoding.UTF8) + ".xls")); 11 } 12 Response.BinaryWrite(ms.ToArray()); 13 workbook = null; 14 ms.Close(); 15 ms.Dispose();