poi操作excl - 4793572/fengchun GitHub Wiki
Welcome to the fengchun wiki! 利用POI导出excl POI版本3.15,语言java 使用框架SpringBoot //第一步:先进行命名导出的excl的文件名,把汉字进行字节码的转换 response.setHeader("Content-Disposition", "attachment;filename="+new String(("内部讲师个人所得税推算公式").getBytes("gb2312"),"ISO-8859-1")+".xlsx"); //第二步创建Workbook和输出流 HSSFWorkbook workbook = new HSSFWorkbook(); OutputStream out = response.getOutputStream(); //创建sheet页 HSSFSheet sheet = workbook.createSheet("(导出)外部讲师审核表"); //创建第一行,和第一个单元格 // 第一行 HSSFRow row0 = sheet.createRow(0); Cell cell00 = row0.createCell(0); //设置行高和单元格的宽度 row0.setHeightInPoints(55); sheet.setColumnWidth(0, 20*256); //合并单元格 参数分别是 起式行,结束行,开始列,结束列 eg:合并第一个第一行第一个单元格到底11个单元格 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 11)); //创建workbook的样式 HSSFCellStyle style = workbook.createCellStyle(); //创建设置字体的相关样式 HSSFFont font = workbook.createFont(); //设置字体和字号 font.setFontName("宋体");//设置字体名称 font.setFontHeightInPoints((short) 14);//设置字号 //字体加粗 font.setBold(true); //创建右边框,左边框,下边框,让字体水平和垂直居中,把字体样式放到样式中 style.setBorderRight(BorderStyle.THIN);//右边框 style.setAlignment(HorizontalAlignment.CENTER); //水平居中 style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 style.setBorderBottom(BorderStyle.THIN);//下边框 style.setBorderLeft(BorderStyle.THIN);//左边框 style.setFont(font);//选择需要用到的字体格式 //单元格引用样式 cell00.setCellStyle(style); //给单元格自定义函数 eg:定义sum函数从单元格J3+到J的list集合长度+2个单元格 sheet.setForceFormulaRecalculation(true);//公式自动计算
Integer n = list.size() + 2 ; String num0 = "J" + n.toString();
cell9.setCellFormula("sum(J3:"+num0+")"); cell[j].setCellFormula("if(I4="+"外部讲师"+",O4*0.06,if(O4<=800,0,if(AND(O4>800,O4<=4000),(O4-160)/0.8-O4)))"); //设置单元格格式,是Double类型的格式,可以用来写函数进行计算 cell[j].setCellValue(Double.parseDouble(value[i][j].toString())); style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00")); //单元格位置不够的的时候进行强制换行 style1.setWrapText(true); // 强制换行 //给单元格赋值 cell15.setCellValue("备注:\n" ) //给单元格设置背景色和背景色样式 style1.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index); style1.setFillPattern(FillPatternType.SOLID_FOREGROUND); //设置单元格的位置进行下拉菜单 参数分别是 起式行,结束行,开始列,结束列 eg:是从第三行第12个单元格开始,到list长度+2个行数的12个单元格结算 String [] paymentList={"外付","合同","架构合同"}; String [] recommendList = {"主办方","移动学院"}; CellRangeAddressList regions = new CellRangeAddressList(2,list.size()+2,12,12); CellRangeAddressList recommendRegions = new CellRangeAddressList(2,list.size()+2,13,13); DVConstraint constraint = DVConstraint.createExplicitListConstraint(paymentList); DVConstraint recommendConstraint = DVConstraint.createExplicitListConstraint(recommendList); HSSFDataValidation dataValidation = new HSSFDataValidation(regions,constraint); HSSFDataValidation validation = new HSSFDataValidation(recommendRegions,recommendConstraint); sheet.addValidationData(dataValidation); sheet.addValidationData(validation); 先进行循环第一层,把表头取出来,然后在进行循环或者单个赋值进行取数据 //写这种sheet可以定义一个二维数组进行存储表头列,把下面的数据查出来进行存储到定义的二维数组中 代码如下: Object[][] value = new Object[list.size() + 2][12]; DecimalFormat df = new DecimalFormat("######0.00"); for (int m = 0; m < num.length; m++) { value[1][m] = num[m]; } for (int i = 0; i < list.size(); i++) { CourseSalary courseSalary = list.get(i); double time = this.dataTime(list.get(i).getClassOfflineCourse().getEndTime(), list.get(i).getClassOfflineCourse().getStartTime()); String courseDate = null; if (courseSalary.getClassOfflineCourse() != null && courseSalary.getClassOfflineCourse().getCourseDate() != null) { courseDate = new SimpleDateFormat("yyyy/MM/dd").format(new Date(courseSalary.getClassOfflineCourse().getCourseDate())); } double paidPay = courseSalary.getPaidPay(); value[i + 2][0] = i + 1; value[i + 2][1] = courseSalary.getClassOfflineCourse().getName(); value[i + 2][2] = time; value[i + 2][3] = courseDate;
//最后进行是把流里的缓冲数据输出和把这个流关闭了,关闭之前会把缓冲的数据都输出。 workbook.write(out); out.flush(); out.close(); 本人就做了一些简单的excl操作,进行了一些整理,希望对大家有一些帮助。