POI创建excel有三种方式,分别为HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook
HSSFWorkbook最多只能导出65533行数据,扩展名为xls
XSSFWorkbook为了解决HSSFWorkbook行数限制问题,最大可导出1048576行16384列,扩展名为xlsx,但是数据过大会导致内存占用过多引入内存溢出等问题
SXSSFWorkbook可以通过程序设置,将超过指定行数的数据直接持久化到磁盘中,从而不影响内存
poi的行数和列数是从0开始,这里在合并单元格的时候需要注意
下面通过代码实现创建excel、sheet、row、cell、单元格样式、合并单元格
//创建excel SXSSFWorkbook wb = new SXSSFWorkbook(); //压缩临时文件 wb.setCompressTempFiles(true); //定义文件名,如果需要文件夹,需要先创建文件夹,linux路径为/path,windows路径为\\path String fileName = "xxx.xlsx"; File file = new File(fileName); if (!file.exists()) { file.createNewFile(); } createExcel(SXSSFWorkbook wb); //转化成文件输出流输出到文件名的路径中生成excel OutputStream out = new FileOutputStream(file); wb.write(out); out.close(); //删除写入磁盘中的临时文件,最好放到finally中 wb.dispose();
public void createExcel(){ SXSSFSheet sheet = wb.createSheet("sheet名"); //设置sheet页中的每行的宽度,可以根据下标进行定制 for(int i = 0; i < 5; i++){ sheet.setColumnWidth(i, 5000); } //创建行 SXSSFRow row = sheet.createRow(rowNum++); //创建行内的单元格,需要从第一个单元格开始设置值,可以为null,一行多个值可以通过循环设置每行的值 SXSSFCell cell=row.createCell(i); cell.setCellValue("单元格内容"); //设置单元格样式,如果对excel的样式有要求,如字体、边框、填充色等等 cell.setCellStyle(createStyle(wb)); }
public CellStyle createStyle(SXSSFWorkbook wb){ CellStyle style = wb.createCellStyle(); //设置字体 style.setFont(getFont(wb)); //设置对齐方式 style.setAlignment(HorizontalAlignment.CENTER); //设置垂直对齐方式 style.setVerticalAlignment(VerticalAlignment.CENTER); //设置是否锁定 style.setLocked(true); //设置是否自动换行 style.setWrapText(false); //设置边框 style.setBorderBottom(BorderStyle.NONE); style.setBorderLeft(BorderStyle.NONE); style.setBorderTop(BorderStyle.NONE); style.setBorderRight(BorderStyle.NONE); return style; }
public Font getFont(SXSSFWorkbook wb){ Font font = workwbbook.createFont(); font.setFontName("华文彩云"); font.setFontHeightInPoints((short) 60); font.setBold(true); font.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); return font; }
//合并单元格 //开始行 结束行 第几列 颜色 public void mergeCell(SXSSFWorkbook workbook, SXSSFSheet sheet, int startRowIndex, int endRowIndex, int columnIndex, Short color){ //设置合并单元格的样式,不然合并后可能会丢失边框,具体可以自己定义 CellStyle style = workbook.createStyle(); if(color != null) { //填充单元格 style.setFillPattern(FillPatternType.SOLID_FOREGROUND); //设置单元格背景色,可以参考HSSFColor.HSSFColorPredefined.BLACK.getIndex() style.setFillForegroundColor(color); } for(int i = startRowIndex; i <= endRowIndex; i++) { Row row = sheet.getRow(i); if(row == null){ break; } Cell cell = row.getCell(columnIndex); cell.setCellStyle(style); } }
最终效果