1.java导出Excel文件:
- 在Controller控制器中获取前台传过来的一些参数:
public void exportApplyerStExcel() { if (!IsPost()) { ///获取一些要用的参数 int year = this.getParaToInt("year"); int op = this.getParaToInt("op"); int zcbtp = this.getParaToInt("zcbtp"); String jgbm = getDefaultOrgId(); System.out.println("jgbm2===="+jgbm); ///具体下载逻辑在service中实现 String fileName = ReportService.exportApplyerStExcel(year,jgbm,op,zcbtp); ///返回下载的文件 renderFile(fileName); } else { this.renderText("null"); } } - 需要下载使用的表格的格式如下图:根据表格的格式生成每一行每一列,包括单元格合并以及表头信息

- 正式的生成表格:
public static String exportApplyerStExcel(int year, String gljg,int op,int zcbtp) { //获取需要在表格中填写的数据,返回类型是Record ZcglYwJbqkModel model = new ZcglYwJbqkModel(); // List<Record> contentList = model.GetApplyerSt(op,year,zcbtp,gljg); // select查询结果 ZcglYwTjbbModel mdl = new ZcglYwTjbbModel().findJgmc(gljg); String jgmc = mdl.getStr("gljg_mc"); String strAppClass = "按职称系列"; //创建excel工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); //创建第一个sheet(页),命名为 sheet1 HSSFSheet sheet = workbook.createSheet("sheet1"); // 设置表格默认列宽度为20个字节 sheet.setDefaultColumnWidth((short) 6); // 设置第一列字体的大小 int fontSize = 600;// 10号字体为600 sheet.setColumnWidth(0, fontSize * 10); //设置第二列的宽度,,,第几行(列)都是从0开始算起 sheet.setColumnWidth(1, fontSize * 10); String[] columnHeads = { "","", "受理人数", "未审人数", "已审人数", "通过人数", "不通过人数", "退回修改中人数" }; // 设置表格格式样式 HSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setAlignment(HorizontalAlignment.CENTER); // 居中 // 字体样式 HSSFFont font = workbook.createFont(); font.setBold(true); cellStyle.setFont(font); // 表格标题合并单元格//合并//第0行到第0行,第0列到第7列 的单元格 CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 7);//到第七列 // 创建单元格、也可以说添加上面合并的单元格,范围有上面cra限定了 sheet.addMergedRegion(cra); HSSFRow row = sheet.createRow(0); // 创建表的第一行 HSSFCell cell = row.createCell(0); // 创建第一行的第一个单元格 cell.setCellStyle(cellStyle); // 设置第一行第一个单元格的字体样式 //设置第一行 内的数据 cell.setCellValue(year + "年度" + "申报人数("+strAppClass+")统计表"); ///以上第一行的创建就完成了 // 第二行、用于显示 数据截止统计时间: //同理根据上图的表,第二行也需要合并,合并的范围是 首行1到 尾行1 首列0到 尾列7 CellRangeAddress craStamp1 = new CellRangeAddress(1, 1, 0, 7); //在本页中添加这个单元格 sheet.addMergedRegion(craStamp1); //获取单元格行数为1 的这一行 row = sheet.createRow(1); //获取单元格第row行的列数为0的这一行 cell = row.createCell(0); ///往第row行第cell列填上时间,下面是获取时间 Calendar cal=Calendar.getInstance(); int y=cal.get(Calendar.YEAR); int m=cal.get(Calendar.MONTH)+1; int d=cal.get(Calendar.DATE); String mon,d1; if(m<10) mon="0"+m;else mon=m+""; if(d<10) d1="0"+d;else d1=d+""; //要填的时间 String nowtime=""+y+mon+d1; //往第row行第cell列填上时间 cell.setCellValue("数据截止统计时间:" + nowtime + " " ); ///以上第二行也就是行数为1 的单元格建立好了。 // 产生表格标题行 该行的行数为2 int rowColumnTopicStart = 2; //标题内容1 String[] columnHeadsOne = { strAppClass,"申报总人数", "省职称办受理与审查情况 " }; //标题内容2 String[] columnHeadsTwo = { "受理人数", "未审人数", "已审人数", "通过人数", "不通过人数", "退回修改中人数"}; //创建行数为2的单元格的合并 行数为2-3行,列数为0-0列 的单元格的合并 cra = new CellRangeAddress(rowColumnTopicStart, rowColumnTopicStart + 1, 0, 0); //添加这样的单元格 sheet.addMergedRegion(cra);////职称系列 ////创建行数为2的单元格的合并 行数为2-3行,列数为1-1列 的单元格的合并 cra = new CellRangeAddress(rowColumnTopicStart, rowColumnTopicStart + 1, 1, 1);/ sheet.addMergedRegion(cra);////申报总人数 ////创建行数为2的单元格的合并 行数为2-3行,列数为2-7列 的单元格的合并 cra = new CellRangeAddress(rowColumnTopicStart, rowColumnTopicStart, 2, 7); sheet.addMergedRegion(cra); ////省职称办受理与审查情况 ///以上第三行 就生成完毕 ,该行的每一列还没赋值 // 给第三行设置样式 row = sheet.createRow(rowColumnTopicStart); // 生成一个样式 HSSFCellStyle headStyle = workbook.createCellStyle(); headStyle.setAlignment(HorizontalAlignment.CENTER); headStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 把字体应用到当前的样式 headStyle.setFont(font); headStyle.setWrapText(true); // 自动换行 ///生成第三行的表头 上面只是创建了第三行,还没给里面赋值 // //长度为8 for (short i = 0, j = 0; i < columnHeads.length; i++) { HSSFCell cellTopic = row.createCell(i);///创造列 cellTopic.setCellStyle(headStyle);///添加样式 HSSFRichTextString text = new HSSFRichTextString(columnHeadsOne[j]); cellTopic.setCellValue(text);////给第三行的i=2到7的这几列赋值 if (i == 2) { i += 7; } j++; } ////创建第四行 rowColumnTopicStart =2,代表行数为2 的那一行,也就是第三行 row = sheet.createRow(rowColumnTopicStart + 1); // 设置columnHeadsTwo ////给第四行里面的每列赋值 for (short i = 2, j = 0; i < columnHeads.length; i++) { HSSFCell cellTopic = row.createCell(i); cellTopic.setCellStyle(headStyle); HSSFRichTextString text = new HSSFRichTextString(columnHeadsTwo[j]); cellTopic.setCellValue(text); j++; } ///////////////////////////以上表头都设置完毕 ///////////////////////////// 下面是设置表格内容 ///从行数为4即第5 行开始填数据 int rowContentStart = 4; //样式 HSSFCellStyle contentCellStyle = workbook.createCellStyle(); contentCellStyle.setAlignment(HorizontalAlignment.LEFT); // 靠左 contentCellStyle.setWrapText(true);// 自动换行 contentCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中 HSSFRow rows = sheet.createRow(rowContentStart); // 创建第5行--用于存表格内容 //所有的数据都存放在contentList,中,这是一个Record数组,每一个元素是JSON串 //model1用于存这个数组的每一个元素方便操作 Record model1 = new ZcglYwJbqkModel().toRecord(); int rowIndex = rowContentStart; //分理出contentList中的每一个元素赋值给modle1方便读取 for (int listIndex = 0;listIndex < contentList.size() && rowIndex < contentList.size() + rowContentStart; listIndex++) { //分理出contentList中的每一个元素赋值给modle1方便读取 model1 = contentList.get(listIndex); // 得到结果集第listIndex条记录 int cellNum = 8; // 统一设置单元格样式 /////////////下面是获取每一行的数据//////////////////////// String name = model1.get("name");////职称系列或者评委会名字 BigDecimal number = new BigDecimal(0); ///申报总人数 BigDecimal m1 = model1.get("n1"); if(m1==null) m1=number; int n1=m1.intValue(); BigDecimal m2 = model1.get("n2"); if(m2==null) m2=number; int n2=m2.intValue(); BigDecimal m3 = model1.get("n3"); if(m3==null) m3=number; int n3=m3.intValue(); BigDecimal m4 = model1.get("n4"); if(m4==null) m4=number; int n4=m4.intValue(); BigDecimal m5 = model1.get("n5"); if(m5==null) m5=number; int n5=m5.intValue(); BigDecimal m6 = model1.get("n6"); if(m6==null) m6=number; int n6=m6.intValue(); int slrs = n2 + n3 ;////受理人数 /////////////获取每一行的数据完毕//////////////////////// rows = sheet.createRow(rowIndex); // 创建表格的第rowIndex行 rows.setRowStyle(contentCellStyle);///设置样式 List<HSSFCell> cellList = new ArrayList<HSSFCell>(); ///创建当前行的每一列 for (int cellCI = 0; cellCI < cellNum; cellCI++) {////在第四行创建8列 HSSFCell contentCell = rows.createCell(cellCI); contentCell.setCellStyle(contentCellStyle); cellList.add(contentCell); } ///给当前行的每一列写入数据 cellList.get(0).setCellValue(name); cellList.get(1).setCellValue(n1);///申报总人数 cellList.get(2).setCellValue(slrs);//受理人数 cellList.get(3).setCellValue(n2);//////未审人数 cellList.get(4).setCellValue(n3);////已审人数n3=n4+n5+n6 cellList.get(5).setCellValue(n4);//通过人数 cellList.get(6).setCellValue(n5);////不通过人数 cellList.get(7).setCellValue(n6);//退回修改中人数 rowIndex++; } //获取路径 String str = JFinal.me().getServletContext().getRealPath("/"); String fileName = ""; ///设置下载的文件名 fileName = "申报人数(职称系列)统计表.xls"; try { ///生成文件输出流 FileOutputStream xlsStream = new FileOutputStream(str + File.separator + "download" + File.separator + fileName); //把输出流写入Excel工作簿中 workbook.write(xlsStream); xlsStream.close(); workbook.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 生成Excel-结束 return fileName; }
本文介绍如何利用Java的POI库导出Excel文件,包括处理单元格合并和表头信息,详细展示了在Controller中操作Excel的步骤。
1153

被折叠的 条评论
为什么被折叠?



