springboot导出excel根据查询到的数据分组之后再合并单元格
时间: 2023-12-17 08:05:03 浏览: 133
在Spring Boot中,你可以使用Apache POI库来导出Excel,并且可以根据查询到的数据分组之后再合并单元格。
下面是一个示例代码,假设你的数据是从数据库中查询出来的:
```java
@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {
// 查询数据
List<Data> dataList = dataService.getDataList();
// 创建Workbook对象
Workbook workbook = new XSSFWorkbook();
// 创建Sheet对象
Sheet sheet = workbook.createSheet("Sheet1");
// 创建标题行
Row titleRow = sheet.createRow(0);
Cell titleCell = titleRow.createCell(0);
titleCell.setCellValue("分组1");
// 创建数据行
int rowIndex = 1;
for (Data data : dataList) {
Row dataRow = sheet.createRow(rowIndex++);
Cell dataCell1 = dataRow.createCell(0);
dataCell1.setCellValue("分组1");
Cell dataCell2 = dataRow.createCell(1);
dataCell2.setCellValue(data.getValue());
}
// 分组并合并单元格
int startRowIndex = 1;
int endRowIndex = 1;
String currentValue = dataList.get(0).getValue();
for (int i = 1; i < dataList.size(); i++) {
String value = dataList.get(i).getValue();
if (!currentValue.equals(value)) {
// 分组结束,合并单元格
CellRangeAddress region = new CellRangeAddress(startRowIndex, endRowIndex - 1, 0, 0);
sheet.addMergedRegion(region);
startRowIndex = i;
currentValue = value;
}
endRowIndex++;
}
// 合并最后一组
CellRangeAddress region = new CellRangeAddress(startRowIndex, endRowIndex - 1, 0, 0);
sheet.addMergedRegion(region);
// 设置列宽自适应
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
// 设置响应头
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=data.xlsx");
// 将Workbook对象写入响应输出流中
OutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
}
```
在这个示例中,我们首先查询出数据,然后创建Workbook和Sheet对象,并创建标题行和数据行。接着,我们根据数据分组并合并单元格。最后,我们将Workbook对象写入响应输出流中,以便浏览器可以下载Excel文件。
注意,这个示例中使用的是XSSFWorkbook而不是HSSFWorkbook,因为后者最多只能导出65536行数据,而前者支持更多的行数。如果你的数据超过了65536行,建议使用XSSFWorkbook。
阅读全文