POI生成excel,自定义excel样式

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);
    }
}

 

最终效果

 

 

 

 

 

posted @ 2021-08-13 16:32  沟渠映明月  阅读(809)  评论(0编辑  收藏  举报