POI实现前端传入的参数与实体类字段顺序不一致时导出数据
/**
* 导出百万数据
*
* @param sheetName
* @param titleList
* @param dataList 类型是List<Map<String, Object>>
* @return
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static SXSSFWorkbook getSXSSFWorkbook2(String sheetName, // 页名
List<Map<String, String>> titleList, // 表头列表
List<Map<String, Object>> dataList, //数据集合
Map<String, Map<String, String>> i18nMap) //国际化处理
throws IllegalArgumentException {
// 创建keyList和valueList分别用来存储titleList集合中map集合的key和value
List<String> keyList = new ArrayList<>();
List<String> valueList = new ArrayList<>();
Map<Integer, String> tltleMap = new LinkedHashMap<>();
Map<String, Map<String, Object>> dataMap = new LinkedHashMap<>();
// 遍历titleList集合,获取其中map集合的key集合和value集合
for (int i = 0; i < titleList.size(); i++) {
// 获取表头集合中的map集合
Map<String, String> map = new HashMap<>();
map = titleList.get(i);
// 通过map.keySet()方法
// 通过得到key的值,然后获取value;
for (String key : map.keySet()) {
String value = map.get(key);
keyList.add(key);
tltleMap.put(i, value);
valueList.add(value);
}
}
// 遍历dataList集合,获取其中map集合
for (int i = 0; i < dataList.size(); i++) {
// 获取数据集合中的map集合
dataMap.put(String.valueOf(i), dataList.get(i));
}
// 创建工作薄对象
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(1000);
Sheet sheet = sxssfWorkbook.createSheet(sheetName);
// 创建第一行,作为header表头
Row row = sheet.createRow(0);
// 循环创建header单元格并赋值
for (int i = 0; i < valueList.size(); i++) {
// 设置宽
sheet.setColumnWidth(i, 1000 * 5);
// 设置高
row.setHeightInPoints(25);
Cell cell = row.createCell(i);
cell.setCellValue(valueList.get(i));
}
Map<Integer, String> headersFieldMap = new LinkedHashMap<>();
for (int i = 0; i < keyList.size(); i++) {
if (!keyList.get(i).equals(null)) {
headersFieldMap.put(i, keyList.get(i));
}
}
// 表格列标题一行对应的字段的集合
// Collection headersFieldCo = headersFieldMap.values();
int dtoRow = 1;// 内容栏 导出数据dtoList的行序号
for (int j = 0; j < dataList.size(); j++) {
row = sheet.createRow(dtoRow);
dtoRow++;
int zdCell = 0;
for (short i = 0; i < keyList.size(); i++) {// 遍历属性,比对
String value = "";
String ssd = keyList.get(i);
if (!dataList.get(0).containsKey(keyList.get(i))) {
continue;
}
if (dataList.get(dtoRow - 2).get(ssd) != null && dataList.get(dtoRow - 2).get(ssd) != "") {
value = dataList.get(dtoRow - 2).get(ssd).toString();
}
try {
if (i18nMap != null && i18nMap.containsKey(keyList.get(i))) {
Object val = valueList.get(i);
String textVal = null;
if (val != null) {
textVal = val.toString();
//根据属性值获取响应的国际化处理
Map<String, String> ss = i18nMap.get(keyList.get(i));
//获取国际化值要是不为null,则赋值到单元格中
if (ss.get(val.toString()) != null) {
textVal = ss.get(val.toString());
}
} else {
// 字段内容值为null时,进行处理
textVal = "";
if (i18nMap.get(keyList.get(i)).containsKey("null")) {
textVal = i18nMap.get(keyList.get(i)).get("null");
}
}
row.createCell(zdCell).setCellValue(textVal);// 写进excel对象
} else {
row.createCell(zdCell).setCellValue(value);// 写进excel对象
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
zdCell++;
}
}
//FileOutputStream fos = new FileOutputStream("D:/demo.xlsx");
//sxssfWorkbook.write(out);
//fos.flush(); // 刷新缓冲区
//fos.close(); // 释放资源
return sxssfWorkbook;
}
// 大标题的样式
public static CellStyle bigTitle(Workbook wb) {
CellStyle style = wb.createCellStyle();
//设置字体样式
Font font = wb.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) 16); //字体大小
font.setBold(true);//字体加粗
style.setFont(font);
//设置边框样式
style.setAlignment(HorizontalAlignment.CENTER); // 横向居中
style.setVerticalAlignment(VerticalAlignment.CENTER); // 纵向居中
style.setBorderTop(BorderStyle.THIN); // 上细线
style.setBorderBottom(BorderStyle.THIN); // 下细线
style.setBorderLeft(BorderStyle.THIN); // 左细线
style.setBorderRight(BorderStyle.THIN); // 右细线
style.setWrapText(true);//设置是否自动换行
return style;
}
//小标题样式
public static CellStyle title(Workbook wb) {
CellStyle style = wb.createCellStyle();
//设置字体样式
Font font = wb.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) 14); //字体大小
font.setBold(true);//字体加粗
style.setFont(font);
//设置边框样式
style.setAlignment(HorizontalAlignment.CENTER); // 横向居中
style.setVerticalAlignment(VerticalAlignment.CENTER); // 纵向居中
style.setBorderTop(BorderStyle.THIN); // 上细线
style.setBorderBottom(BorderStyle.THIN); // 下细线
style.setBorderLeft(BorderStyle.THIN); // 左细线
style.setBorderRight(BorderStyle.THIN); // 右细线
style.setWrapText(true);//设置是否自动换行
return style;
}
//正文样式
public static CellStyle text(Workbook wb) {
CellStyle style = wb.createCellStyle();
//设置字体样式
Font font = wb.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) 12); //字体大小
style.setFont(font);
//设置边框样式
style.setAlignment(HorizontalAlignment.CENTER); // 横向居中
style.setVerticalAlignment(VerticalAlignment.CENTER); // 纵向居中
style.setBorderTop(BorderStyle.THIN); // 上细线
style.setBorderBottom(BorderStyle.THIN); // 下细线
style.setBorderLeft(BorderStyle.THIN); // 左细线
style.setBorderRight(BorderStyle.THIN); // 右细线
style.setWrapText(true);//设置是否自动换行
return style;
}
这里我是借鉴了另外一位博主写的博客
附上链接:https://www.cnblogs.com/pikachu-zhaof/p/9711662.html