在数据处理和分析工作中,经常需要将数据库中的数据导出到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 驱动使用指南