由于工作需要,excel每次个工作表格式一样,每次手工填写太麻烦,于是想到了服务器自己来做这个工作。
protected HSSFWorkbook wb = null; protected HSSFSheet sheet; protected HSSFRow row = null; protected HSSFCell cell = null; public void export(String url,BailChargeDTO list,String sDate,String eDate, OutputStream output) throws Exception { POIFSFileSystem fs = null; try { fs = new POIFSFileSystem(new FileInputStream(url)); wb = new HSSFWorkbook(fs); int sdate = Integer.parseInt(sDate); int edate = Integer.parseInt(eDate); for(int date = sdate ; date <= edate ; ++date){ HSSFSheet fromsheet = wb.getSheet("template"); if (fromsheet != null && wb.getSheet(String.valueOf(date)) == null) { HSSFSheet newsheet = wb.createSheet(String.valueOf(date)); new PoiExcelSheetCopy().copyRows(wb, fromsheet, newsheet, fromsheet.getFirstRowNum(), fromsheet.getLastRowNum()); } sheet = wb.getSheet(String.valueOf(date));//获取工作表名字 row = sheet.createRow(1); Cell ztCell = row.createCell(0); ztCell.setCellValue(" 日期:" + date); // 创建单元格样式对象 HSSFCellStyle cellstyle = wb.createCellStyle(); HSSFCellStyle textstyle = wb.createCellStyle(); HSSFCellStyle sumstyle = wb.createCellStyle(); // 创建字体对象 Font dateFont = wb.createFont(); dateFont.setFontHeightInPoints((short)18); // 将字体大小设置为18px dateFont.setFontName("宋体"); // 将“华文行楷”字体应用到当前单元格上 dateFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); cellstyle.setFont(dateFont); // 将字体应用到样式上面 cellstyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT); ztCell.setCellStyle(cellstyle); // Font textFont = wb.createFont(); textFont.setFontHeightInPoints((short)18); // 将字体大小设置为18px textFont.setFontName("宋体"); // 将“华文行楷”字体应用到当前单元格上 textstyle.setFont(textFont); // 将字体应用到样式上面 textstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); Font suFont = wb.createFont(); suFont.setFontHeightInPoints((short)18); // 将字体大小设置为18px suFont.setFontName("宋体"); // 将“华文行楷”字体应用到当前单元格上 suFont.setColor(HSSFColor.RED.index); sumstyle.setFont(suFont); // 将字体应用到样式上面 sumstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // int rownum = 4; List<AgentAccountDetailDTO> dtoList = new BailChargeQueryExport().sortMap(list.getAgentAccount(),date).get(String.valueOf(date)); int len = dtoList.size(); for (int j = 0; j < len; j++) { AgentAccountDetailDTO dto = dtoList.get(j); row = sheet.createRow(rownum); row.setHeightInPoints(20); Cell c = row.createCell(0); Cell d = row.createCell(1); Cell e = row.createCell(2); Cell f = row.createCell(3); Cell h = row.createCell(4); Cell i = row.createCell(5); Cell k = row.createCell(6); Cell g = row.createCell(7); c.setCellValue(new HSSFRichTextString(String.valueOf(dto.getAgentName()))); d.setCellValue(dto.getAgentId()); e.setCellValue(dto.getAgentLink()); f.setCellValue(Double.parseDouble(dto.getRfee().toString())); // row.createCell(2).setCellValue(new HSSFRichTextString(dto.getRuser())); // row.createCell(4).setCellValue(dto.getRdate()); g.setCellValue(dto.getTransDesc()); c.setCellStyle(textstyle); d.setCellStyle(textstyle); e.setCellStyle(textstyle); f.setCellStyle(textstyle); g.setCellStyle(textstyle); h.setCellStyle(textstyle); i.setCellStyle(textstyle); k.setCellStyle(textstyle); // rownum++; } row = sheet.createRow(rownum); sheet.setForceFormulaRecalculation(true); row.setHeightInPoints(20); Cell c = row.createCell(0); c.setCellValue("总数"); c.setCellStyle(sumstyle); Cell sum = row.createCell(3); sum.setCellType(HSSFCell.CELL_TYPE_FORMULA);//设置为公式 // 设置公式内容 String formula = "SUM(D5:D"+ rownum +")";//计算一列总数 if(HSSFCell.CELL_TYPE_FORMULA == sum.getCellType()){ sum.setCellFormula(formula); } sum.setCellStyle(sumstyle); } wb.setActiveSheet(1);//激活滴2个工作表,保存打开 wb.write(output); } catch (IOException e) { throw new Exception("服务器报表文件位置异常,请报告管理员!谢谢!"); }
} //对数据筛选 public Map<String ,List<AgentAccountDetailDTO>> sortMap(List<AgentAccountDetailDTO> list, int sdate){ Map<String ,List<AgentAccountDetailDTO>> map = new HashMap<String ,List<AgentAccountDetailDTO>>(); List<AgentAccountDetailDTO> dtoList = new ArrayList<AgentAccountDetailDTO>(); //重新声明一个数组list for(Iterator<AgentAccountDetailDTO> it = list.iterator();it.hasNext();){ AgentAccountDetailDTO dto = (AgentAccountDetailDTO)it.next(); if(Integer.parseInt(dto.getRdate()) == (sdate)){ //如果已经存在这个数组,就放在这里 dtoList.add(dto); } } map.put(String.valueOf(sdate), dtoList); return map; }
WPS 打开不能自动求和,ms excel 打开后可以自动求和。