在数据处理和分析工作中,经常需要将数据库中的数据导出到Excel文件中。本文将提供一个Java实现的示例,展示如何边从数据库读取数据,边将其写入Excel文件,同时注重内存效率。
环境配置:
- Java 1.8 或更高版本
- MySQL 5.7(或其他数据库)
- Apache POI 5.2.3(用于Excel操作)
- Maven(项目管理工具)
确保在pom.xml
中添加了Apache POI的依赖。
示例代码:
可以在pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class DatabaseToExcelStreaming {
public static void main(String[] args) {
// 数据库连接配置
Properties properties = new Properties();
properties.put("user", "your_username");
properties.put("password", "your_password");
String jdbcUrl = "jdbc:mysql://localhost:3306/your_database";
String query = "SELECT id, name, ... FROM your_table"; // 你的查询
// Excel文件的路径
String excelFilePath = "output.xlsx";
// 使用SXSSFWorkbook创建一个基于流的写入器,适用于大文件
try (SXSSFWorkbook workbook = new SXSSFWorkbook()) {
Sheet sheet = workbook.createSheet("Data");
// 创建标题行
Row titleRow = sheet.createRow(0);
titleRow.createCell(0).setCellValue("ID");
titleRow.createCell(1).setCellValue("Name");
// 可以继续添加其他列的标题...
// 加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
try (Connection connection = DriverManager.getConnection(jdbcUrl, properties);
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery()) {
int rowNum = 1; // 行号,从1开始,用于跳过标题行
int maxRowInSheet = workbook.getSpreadsheetLocale().getMaxRows(); // 最大行数限制
while (resultSet.next() && rowNum < maxRowInSheet) {
Row row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(resultSet.getInt("id"));
row.createCell(1).setCellValue(resultSet.getString("name"));
// 可以继续添加其他列的数据...
// 每写入一定数量的行后,自动flush,减少内存占用
if (rowNum % 1000 == 0) {
workbook.write(new FileOutputStream(excelFilePath));
workbook.dispose();
workbook = new SXSSFWorkbook();
sheet = workbook.createSheet("Data");
}
}
// 写入剩余的数据
workbook.write(new FileOutputStream(excelFilePath));
System.out.println("数据已写入Excel文件:" + excelFilePath);
} catch (IOException | ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码解释: 本示例使用了Apache POI的SXSSF(Streaming XLSX)来创建可以在内存使用较低时处理大量数据的Excel文件。代码中详细注释了每一步的操作。
结果展示: 执行上述代码后,将在指定路径生成一个Excel文件,其中包含了数据库表中的所有数据。
总结: 本文提供了一个高效的Java实现方法,用于将数据库数据导出到Excel文件。使用SXSSFWorkbook可以显著减少内存消耗,特别适合处理大规模数据。希望这个示例对需要进行数据导出的开发者有所帮助。
额外资源:
- Apache POI 官方文档:Apache POI Documentation
- MySQL JDBC 驱动使用指南