POI导出excel列宽自适应

前提:导出的excel单元格内容长的时候显示不全,用户看的时候需要手动调整列宽,不友好不方便。需要根据单元格的内容进行自动调整列宽。

废话不多说,直接上代码

controller

@PostMapping("/export")
    @ApiOperation("导出")
    public void export( HttpServletResponse response){
        service.commonExport(response);
    }

service

public void export( HttpServletResponse response){
//表头,自己根据情况设置或者查询数据库
List<Map<String,Object>> tableTitleList;
//数据,自己根据情况设置或者查询
List<Map<String,Object>> dataList;

// 创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建数据 sheet
 HSSFSheet dataSheet = workbook.createSheet("数据");

 // 创建表头行
HSSFRow headerRow = dataSheet.createRow(0);

//设置样式
CellStyle blackStyle = workbook.createCellStyle();
//自动换行,自定义列宽使用
blackStyle.setWrapText(true);
//存储最大列宽,自定义列宽使用
Map<Integer,Integer> maxWidth = new HashMap<>();
// 新增第一列id列,第一列是id值需要隐藏,单独设置
HSSFCell idDataCell = headerRow.createCell(0);
idDataCell.setCellValue("id");
int columnIndex = 1;
for (Map<String,Object> tableTitle : tableTitleList) {
     String columnName = tableTitle.get("title").toString();
     HSSFCell cell = headerRow.createCell(columnIndex);
     cell.setCellValue(columnName);
      maxWidth.put(columnIndex,columnName.getBytes().length  * 256 + 200);
      //设置自动换行
      cell.setCellStyle(blackStyle);
       columnIndex++;
    }

// 按行填充数据
        int rowIndex = 1;
        for (Map<String, Object> data : dataList) {
            HSSFRow dataRow = dataSheet.createRow(rowIndex++);
            columnIndex = 1;
            // 首先添加该行的第一列id数据
            String id = data.get("id").toString();
            HSSFCell idTitleCell = dataRow.createCell(0);
            HSSFRichTextString idRichString = new HSSFRichTextString(id);
            idTitleCell.setCellValue(idRichString);
            // 再循环遍历其余列,添加数据
            for (Map<String,Object> tableTitle : tableTitleList) {
                String titleName = tableTitle.get("title").toString().toLowerCase();
                Object value = data.get(titleName);
                HSSFCell cell = dataRow.createCell(columnIndex);
                if (value != null) {
                    HSSFRichTextString richString = new HSSFRichTextString(value.toString());
                    cell.setCellValue(richString);
                    int length = value.toString().getBytes().length * 256 + 200;
                    //这里把宽度最大限制到15000
                    if (length>15000){
                        length = 15000;
                    }
                    maxWidth.put(columnIndex,Math.max(length,maxWidth.get(columnIndex)));  
                    //设置自动换行                   
                    cell.setCellStyle(blackStyle);
                }
                columnIndex++;
            }
        }
        // 列宽自适应
        for (int i = 1; i <= tableTitleList.size(); i++) {
            dataSheet.setColumnWidth(i,maxWidth.get(i));
        }
        // 数据sheet页id列隐藏
        dataSheet.setColumnHidden(0,true);
//写出数据
try {
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename="
                    + URLEncoder.encode("test.xls", "UTF-8"));
            OutputStream out = response.getOutputStream();
            workbook.write(out);
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
}

你可能感兴趣的:(excel)