// 这里仅仅是数据内容的简单示例Map<String, Object> map1 = new HashMap<>();map1.put("name", "Machiel Jordan");map1.put("age", "53");map1.put("content", "迈克尔·乔丹(MichaelJordan),1963年2月17日生于美国纽约布鲁克林,前美国职业篮球运动员,司职得分后卫,绰号“飞人”(Air Jordan)");Map<String, Object> map2 = new HashMap<>();map2.put("name", "Kobe Bryant");map2.put("age", "40");map2.put("content", "科比是NBA最好的得分手之一,生涯赢得无数奖项,突破、投篮、罚球、三分球他都驾轻就熟,几乎没有进攻盲区,单场比赛81分的个人纪录就有力地证明了这一点。除了疯狂的得分外,科比的组织能力也很出众,经常担任球队进攻的第一发起人。另外科比还是联盟中最好的防守人之一,贴身防守非常具有压迫性");Map<String, Object> 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<Map<String, Object>> list = new ArrayList<Map<String, Object>>();list.add(map1);list.add(map2);list.add(map3);List<String> 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<String, Object> 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);}}
如果觉得《POI导出Excel 设置自适应列宽(中文支持)》对你有帮助,请点赞、收藏,并留下你的观点哦!