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