Java实现数据库数据到Excel的高效导出

在数据处理和分析工作中,经常需要将数据库中的数据导出到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可以显著减少内存消耗,特别适合处理大规模数据。希望这个示例对需要进行数据导出的开发者有所帮助。

额外资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值