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

您所在的位置:网站首页 excel行高随内容自动调整 POI导出Excel,设置自适应列宽(中文支持)

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

2024-01-03 06:38| 来源: 网络整理| 查看: 265

// 这里仅仅是数据内容的简单示例 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); } }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3