java中使用SXSSFWorkbook 流式导出excel,需要导出的数据字段名称和数据从数据库返回且不固定,并且数据需要行列转换,给出示例代码
时间: 2024-02-24 15:55:15 浏览: 103
好的,以下是一个使用SXSSFWorkbook流式导出Excel的示例代码,其中数据字段名称和数据都是动态的,从数据库返回,并且需要进行行列转换:
```java
public void exportExcel(ResultSet resultSet, HttpServletResponse response) {
try {
// 创建工作簿
SXSSFWorkbook workbook = new SXSSFWorkbook();
// 创建工作表
Sheet sheet = workbook.createSheet("Sheet1");
// 获取结果集元数据
ResultSetMetaData metaData = resultSet.getMetaData();
// 获取列数
int columnCount = metaData.getColumnCount();
// 创建表头行
Row headerRow = sheet.createRow(0);
// 创建表头单元格
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnName(i);
headerRow.createCell(i - 1).setCellValue(columnName);
}
// 填充数据
int rowIndex = 1;
while (resultSet.next()) {
Row row = sheet.createRow(rowIndex++);
for (int i = 1; i <= columnCount; i++) {
Object value = resultSet.getObject(i);
if (value != null) {
row.createCell(i - 1).setCellValue(value.toString());
} else {
row.createCell(i - 1).setCellValue("");
}
}
}
// 转置表格
int rowCount = sheet.getPhysicalNumberOfRows();
int columnMaxIndex = 0;
for (int i = 0; i < rowCount; i++) {
Row row = sheet.getRow(i);
int columnCountForRow = row.getPhysicalNumberOfCells();
if (columnCountForRow > columnMaxIndex) {
columnMaxIndex = columnCountForRow;
}
}
Sheet transposedSheet = workbook.createSheet("Sheet2");
for (int i = 0; i < columnMaxIndex; i++) {
Row transposedRow = transposedSheet.createRow(i);
for (int j = 0; j < rowCount; j++) {
Row row = sheet.getRow(j);
Cell cell = row.getCell(i);
if (cell != null) {
transposedRow.createCell(j).setCellValue(cell.getStringCellValue());
} else {
transposedRow.createCell(j).setCellValue("");
}
}
}
// 设置响应头
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=export.xlsx");
// 输出Excel文件
try (OutputStream outputStream = response.getOutputStream()) {
workbook.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
// 释放资源
workbook.dispose();
} catch (SQLException e) {
e.printStackTrace();
}
}
```
以上代码中,首先根据ResultSet获取结果集元数据,然后创建表头行和表头单元格,并填充数据。接着进行行列转换,将原始表格中的行转换为列,将列转换为行。需要注意的是,在转置表格之前,需要获取最大列数,以便创建新的工作表。最后设置响应头,输出Excel文件即可。同样,需要在使用完毕后,调用workbook.dispose()方法进行清理。
阅读全文