这段代码存在以下问题: 在导出到Excel中时,将所有数据都写入同一个Sheet中,如果数据量很大,可能会导致Excel文件过大或者导出失败。应该考虑将数据分成多个Sheet导出。 在合并父级相同的行时,使用了HashMap来存储合并的区域,但是HashMap并不能保证顺序,可能会导致合并后的行顺序错乱。应该使用LinkedHashMap来保证顺序。 导出时,将Excel文件写入OutputStream中,但是写入后没有关闭OutputStream。应该在写入完成后,及时关闭OutputStream。根据你这个优化下代码
时间: 2024-02-25 16:58:53 浏览: 119
Java使用POI导出大数据量Excel的方法
5星 · 资源好评率100%
好的,根据您的建议,我对代码进行了优化,以下是优化后的代码:
```
public static void main(String[] args) throws FileNotFoundException {
ArrayList<Node> nodes = new ArrayList<Node>();
Node node0 = new Node(0, "1", null);
Node node1 = new Node(1, "2", "0");
Node node2 = new Node(2, "3", "1");
Node node3 = new Node(3, "4", "1");
Node node4 = new Node(4, "5", "2");
Node node5 = new Node(5, "6", "2");
Node node6 = new Node(6, "7", "0");
nodes.add(node0);
nodes.add(node1);
nodes.add(node2);
nodes.add(node3);
nodes.add(node4);
nodes.add(node5);
nodes.add(node6);
OutputStream outputStream = new FileOutputStream("D:\javaTools\project\TestProject-dd\tree_data.xlsx");
exportToExcel(nodes, outputStream, 2);
}
public static void exportToExcel(List<Node> nodeList, OutputStream outputStream, int pageSize) {
Workbook workbook = new XSSFWorkbook();
int totalSize = nodeList.size();
int totalPage = (totalSize % pageSize == 0) ? (totalSize / pageSize) : (totalSize / pageSize + 1);
for (int i = 0; i < totalPage; i++) {
Sheet sheet = workbook.createSheet("Tree Data - Page " + (i + 1));
// 创建表头
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("Name");
headerRow.createCell(2).setCellValue("Parent ID");
// 计算当前页起始位置和结束位置
int startIndex = i * pageSize;
int endIndex = Math.min((i + 1) * pageSize, totalSize);
// 创建数据行
int rowIndex = 1;
for (int j = startIndex; j < endIndex; j++) {
Node node = nodeList.get(j);
Row row = sheet.createRow(rowIndex++);
row.createCell(0).setCellValue(node.getId());
row.createCell(1).setCellValue(node.getName());
row.createCell(2).setCellValue(node.getParentId());
}
// 合并父级相同的行
Map<String, CellRangeAddress> mergedRegions = new LinkedHashMap<>();
for (int k = 1; k < rowIndex; k++) {
Row row = sheet.getRow(k);
String parentId = row.getCell(2).getStringCellValue();
if (mergedRegions.containsKey(parentId)) {
CellRangeAddress mergedRegion = mergedRegions.get(parentId);
int lastRow = mergedRegion.getLastRow();
if (lastRow == k - 1) {
mergedRegions.put(parentId, new CellRangeAddress(lastRow, k, 2, 2));
} else {
mergedRegions.put(parentId, new CellRangeAddress(lastRow + 1, k, 2, 2));
}
} else {
mergedRegions.put(parentId, new CellRangeAddress(k, k, 2, 2));
}
}
for (CellRangeAddress mergedRegion : mergedRegions.values()) {
sheet.addMergedRegion(mergedRegion);
}
}
// 输出Excel
try {
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
```
优化后的代码实现了将数据分成多个Sheet导出,每个Sheet包含指定数量的数据行,避免了导出过大的Excel文件。同时使用LinkedHashMap来存储合并的区域,保证了合并后的行顺序不会错乱。在写入完成后,及时关闭OutputStream,避免内存泄漏。
阅读全文