POI导出Excel,设置自适应列宽(中文支持)

        // 这里仅仅是数据内容的简单示例
        Map map1 = new HashMap<>();
        map1.put("name", "Machiel Jordan");
        map1.put("age", "53");
        map1.put("content", "迈克尔·乔丹(Michael Jordan),1963年2月17日生于美国纽约布鲁克林,前美国职业篮球运动员,司职得分后卫,绰号“飞人”(Air Jordan)");

        Map map2 = new HashMap<>();
        map2.put("name", "Kobe Bryant");
        map2.put("age", "40");
        map2.put("content", "科比是NBA最好的得分手之一,生涯赢得无数奖项  ,突破、投篮、罚球、三分球他都驾轻就熟,几乎没有进攻盲区,单场比赛81分的个人纪录就有力地证明了这一点。除了疯狂的得分外,科比的组织能力也很出众,经常担任球队进攻的第一发起人。另外科比还是联盟中最好的防守人之一,贴身防守非常具有压迫性");

        Map map3 = new HashMap<>();
        map3.put("name", "LeBron James");
        map3.put("age", "34");
        map3.put("content", "勒布朗·詹姆斯(LeBron James),1984年12月30日出生在美国俄亥俄州阿克伦,美国职业篮球运动员,司职小前锋,绰号“小皇帝”,效力于NBA洛杉矶湖人队。");


        XSSFWorkbook workBook = new XSSFWorkbook();
        XSSFSheet sheet = workBook.createSheet("业务报表");

        // 构建表头
        XSSSFRow headRow = sheet.createRow(0);

        XSSFCell cell;

        for (int i = 0; i < fields.size(); i++) {
            cell = headRow.createCell(i);
            cell.setCellStyle(headStyle);
            cell.setCellValue(fields.get(i).fieldName());

        }

        // 构建表体
        List> list = new ArrayList>();
        list.add(map1);
        list.add(map2);
        list.add(map3);

        List dataStrList = new ArrayList<>();
        dataStrList.add("name");
        dataStrList.add("age");
        dataStrList.add("content");

        if (list != null && list.size() > 0) {
            for (int j = 0; j < list.size(); j++) {
                XSSFRow bodyRowX = sheet.createRow(j + 1);
                Map mapVO = list.get(j);
                for (int i = 0; i < dataStrList.size(); i++) {
                    cell = bodyRowX.createCell(i);
                    cell.setCellStyle(bodyStyle);
                    Object cellValue = mapVO.get(dataStrList.get(i));
                    // 大多数Excel导出要求保留两位小数
                    // 根据单元格的数值类型进行小数位数格式设置
                    if (Integer.class.isAssignableFrom(cellValue.getClass())) {
                        cell.setCellValue(cellValue == null ? "" : String.valueOf(cellValue));
                    } else if (Number.class.isAssignableFrom(cellValue.getClass())) {
                        cell.setCellValue(new BigDecimal((Double) cellValue).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
                        bodyStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));// 保留两位小数,没有的以.00代替
                        cell.setCellStyle(bodyStyle);
                    } else {
                        cell.setCellValue(cellValue == null ? "" : String.valueOf(cellValue));
                    }
                }
            }
            // 必须在单元格设值以后进行
            // 设置为根据内容自动调整列宽    
            for (int k = 0; k < dataStrList .size(); k++) {
                sheet.autoSizeColumn(k);
            }
            // 处理中文不能自动调整列宽的问题
            this.setSizeColumn(sheet, dataStrList.size());
        }

我们使用autoSizeColumn方法可以把Excel设置为根据内容自动调整列宽,然而这个方法对中文并不起效,只对数字和字母有效

可以在其后再加入这个方法;

// 自适应宽度(中文支持)
    private void setSizeColumn(XSSFSheet sheet, int size) {
        for (int columnNum = 0; columnNum < size; columnNum++) {
            int columnWidth = sheet.getColumnWidth(columnNum) / 256;
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                XSSFRow currentRow;
                //当前行未被使用过
                if (sheet.getRow(rowNum) == null) {
                    currentRow = sheet.createRow(rowNum);
                } else {
                    currentRow = sheet.getRow(rowNum);
                }

                if (currentRow.getCell(columnNum) != null) {
                    XSSFCell currentCell = currentRow.getCell(columnNum);
                    if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
                        int length = currentCell.getStringCellValue().getBytes().length;
                        if (columnWidth < length) {
                            columnWidth = length;
                        }
                    }
                }
            }
            sheet.setColumnWidth(columnNum, columnWidth * 256);
        }
    }

 

你可能感兴趣的:(Java)