Java POI导出CSV文件

简介

CSV(Comma Separated Values)文件是一种常见的数据存储格式,它以纯文本形式存储表格数据,每行表示一条记录,每个字段之间使用逗号分隔。在Java中,我们可以使用Apache POI库来导出CSV文件。Apache POI是一个用于处理Microsoft Office文件的开源Java库,它提供了一组API用于创建、读取和修改Excel、Word和PowerPoint文件。

本文将介绍如何使用Java POI库导出CSV文件,包括创建Workbook、Sheet、Row和Cell对象,设置单元格的值和样式,以及将数据写入CSV文件。

准备工作

首先,我们需要在项目中引入Apache POI的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖项:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

创建CSV文件

首先,我们需要创建一个CSV文件。在Excel中,一个文件可以包含多个Sheet,每个Sheet可以包含多行多列的数据。在Java中,我们可以使用WorkbookSheetRowCell对象来表示这些概念。

下面是创建CSV文件的代码示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class CsvExporter {

    public static void main(String[] args) {
        // 创建Workbook对象
        Workbook workbook = new XSSFWorkbook();

        // 创建Sheet对象
        Sheet sheet = workbook.createSheet("Sheet1");

        // 创建第一行
        Row headerRow = sheet.createRow(0);

        // 设置列名
        Cell headerCell1 = headerRow.createCell(0);
        headerCell1.setCellValue("姓名");

        Cell headerCell2 = headerRow.createCell(1);
        headerCell2.setCellValue("年龄");

        // 创建数据行
        Row dataRow = sheet.createRow(1);

        // 设置数据
        Cell dataCell1 = dataRow.createCell(0);
        dataCell1.setCellValue("张三");

        Cell dataCell2 = dataRow.createCell(1);
        dataCell2.setCellValue(20);

        // 将Workbook写入文件
        try (FileOutputStream fileOut = new FileOutputStream("data.csv")) {
            workbook.write(fileOut);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 关闭Workbook对象
        try {
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们首先创建一个Workbook对象,这可以是HSSFWorkbook(对应于xls格式)或XSSFWorkbook(对应于xlsx格式)。然后,我们创建一个Sheet对象,命名为"Sheet1"。接下来,我们创建第一行,并设置列名。然后,我们创建数据行,并设置数据。最后,我们将Workbook对象写入到名为"data.csv"的文件中,并关闭Workbook对象。

读取数据生成CSV文件

除了手动设置单元格的值,我们还可以从数据源(如数据库、Excel文件等)中读取数据,并将其生成为CSV文件。

下面是从数据库读取数据并生成CSV文件的代码示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;

public class CsvExporter {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, username, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {

            // 创建Workbook对象
            Workbook workbook = new XSSFWorkbook();

            // 创建Sheet对象
            Sheet sheet = workbook.createSheet("Sheet1");

            // 创建第一行
            Row headerRow = sheet.createRow(0);

            // 设置列名
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            for (int i = 1; i <= columnCount; i++) {
                Cell headerCell = headerRow.createCell(i - 1);
                headerCell.setCellValue(metaData.getColumnName(i));
            }

            // 创建数据行
            int rowNum = 1;
            while (rs.next()) {
                Row