java中使用SXSSFWorkbook 导出excel,将数据库中A表,B表,C表的数据 依次写到同一个sheet页中,ABC三张表的字段数据均不一致,且B表数据要求行列转换,给出示例代码
时间: 2024-02-24 21:56:54 浏览: 77
以下是一个示例代码,用于将三个表的数据依次写入同一个sheet页中,并且对B表的数据进行行列转换:
```java
public void exportExcel(List<A> aList, List<B> bList, List<C> cList, OutputStream out) throws Exception {
SXSSFWorkbook workbook = new SXSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
int rowIndex = 0;
// 写入A表数据
Row row = sheet.createRow(rowIndex++);
int cellIndex = 0;
for (Field field : A.class.getDeclaredFields()) {
Cell cell = row.createCell(cellIndex++);
cell.setCellValue(field.getName());
}
for (A a : aList) {
row = sheet.createRow(rowIndex++);
cellIndex = 0;
for (Field field : A.class.getDeclaredFields()) {
field.setAccessible(true);
Cell cell = row.createCell(cellIndex++);
Object value = field.get(a);
if (value != null) {
cell.setCellValue(value.toString());
}
}
}
// 写入B表数据
row = sheet.createRow(rowIndex++);
cellIndex = 0;
for (Field field : B.class.getDeclaredFields()) {
Cell cell = row.createCell(cellIndex++);
cell.setCellValue(field.getName());
}
Map<String, List<Object>> bMap = new HashMap<>();
for (B b : bList) {
for (Field field : B.class.getDeclaredFields()) {
field.setAccessible(true);
String key = field.getName();
if (!bMap.containsKey(key)) {
bMap.put(key, new ArrayList<>());
}
Object value = field.get(b);
if (value != null) {
bMap.get(key).add(value);
}
}
}
int bRowIndex = rowIndex;
for (String key : bMap.keySet()) {
row = sheet.createRow(rowIndex++);
cellIndex = 0;
Cell cell = row.createCell(cellIndex++);
cell.setCellValue(key);
for (Object value : bMap.get(key)) {
cell = row.createCell(cellIndex++);
cell.setCellValue(value.toString());
}
}
for (int i = bRowIndex; i < rowIndex; i++) {
row = sheet.getRow(i);
for (int j = i + 1; j < rowIndex; j++) {
Row nextRow = sheet.getRow(j);
Cell cell = nextRow.getCell(0);
if (cell.getStringCellValue().equals(row.getCell(0).getStringCellValue())) {
for (int k = 1; k < cellIndex; k++) {
Cell nextCell = nextRow.getCell(k);
row.createCell(k).setCellValue(nextCell.getStringCellValue());
}
sheet.removeRow(nextRow);
rowIndex--;
j--;
}
}
}
// 写入C表数据
row = sheet.createRow(rowIndex++);
cellIndex = 0;
for (Field field : C.class.getDeclaredFields()) {
Cell cell = row.createCell(cellIndex++);
cell.setCellValue(field.getName());
}
for (C c : cList) {
row = sheet.createRow(rowIndex++);
cellIndex = 0;
for (Field field : C.class.getDeclaredFields()) {
field.setAccessible(true);
Cell cell = row.createCell(cellIndex++);
Object value = field.get(c);
if (value != null) {
cell.setCellValue(value.toString());
}
}
}
workbook.write(out);
workbook.dispose();
}
```
需要注意的是,这个示例代码中使用了 Java 的反射机制,可以动态地获取一个类的字段信息,因此不需要事先知道 A 表、B 表、C 表的字段信息。同时,这个示例代码中对 B 表的数据进行了行列转换,将 B 表的每个字段作为一个列,将 B 表的每个记录作为一行,这样做是为了满足 B 表的数据要求。具体实现方法是,先将 B 表的数据存储到一个 Map 中,Map 的 key 是 B 表的字段名称,Map 的 value 是一个 List,List 中存储的是 B 表对应字段的值。然后,遍历这个 Map,将 Map 的 key 作为一个列名写入 Excel 表格中,将 Map 的 value 中的每个元素作为一行写入 Excel 表格中。最后,对写入 Excel 表格中的数据进行处理,将 B 表的数据进行行列转换。
阅读全文