Java案例怎么导出CSV数据?

wen java案例 78

本文目录导读:

Java案例怎么导出CSV数据?

  1. 使用 OpenCSV 库(推荐)
  2. 使用 Apache Commons CSV
  3. 手动实现(不依赖第三方库)
  4. Web应用中的CSV导出(Spring Boot示例)
  5. 批量导出大量数据的优化版本
  6. 使用建议

在Java中导出CSV数据有多种实现方式,以下介绍几种常用方法:

使用 OpenCSV 库(推荐)

添加Maven依赖

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.7.1</version>
</dependency>

示例代码

import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
public class CsvExportExample {
    // 方法1:导出到文件
    public static void exportToFile(String filePath) {
        try (CSVWriter writer = new CSVWriter(new FileWriter(filePath))) {
            // 写入表头
            String[] header = {"ID", "姓名", "年龄", "邮箱"};
            writer.writeNext(header);
            // 写入数据
            String[] data1 = {"1", "张三", "25", "zhangsan@example.com"};
            String[] data2 = {"2", "李四", "30", "lisi@example.com"};
            String[] data3 = {"3", "王五", "28", "wangwu@example.com"};
            writer.writeNext(data1);
            writer.writeNext(data2);
            writer.writeNext(data3);
            System.out.println("CSV文件已导出到: " + filePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 方法2:导出为字符串(可用于Web下载)
    public static String exportToString() {
        try (StringWriter stringWriter = new StringWriter();
             CSVWriter writer = new CSVWriter(stringWriter)) {
            // 批量写入数据
            List<String[]> data = new ArrayList<>();
            data.add(new String[]{"商品ID", "商品名称", "价格"});
            data.add(new String[]{"P001", "笔记本电脑", "5999"});
            data.add(new String[]{"P002", "手机", "3999"});
            data.add(new String[]{"P003", "耳机", "299"});
            writer.writeAll(data);
            return stringWriter.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    public static void main(String[] args) {
        // 导出到文件
        exportToFile("D:/data.csv");
        // 导出为字符串
        String csvContent = exportToString();
        System.out.println("CSV内容:\n" + csvContent);
    }
}

使用 Apache Commons CSV

添加Maven依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.10.0</version>
</dependency>

示例代码

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import java.io.FileWriter;
import java.io.StringWriter;
public class CommonsCsvExample {
    public static void exportWithCommons(String filePath) {
        try (FileWriter out = new FileWriter(filePath);
             CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT
                     .withHeader("ID", "姓名", "电话"))) {
            printer.printRecord("1", "小明", "13800138000");
            printer.printRecord("2", "小红", "13900139000");
            printer.printRecord("3", "小刚", "13700137000");
            System.out.println("CSV导出完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        exportWithCommons("D:/contacts.csv");
    }
}

手动实现(不依赖第三方库)

import java.io.*;
import java.util.List;
public class ManualCsvExport {
    // 手动导出CSV
    public static void exportManual(String filePath, List<String[]> data) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
            for (String[] row : data) {
                StringBuilder line = new StringBuilder();
                for (int i = 0; i < row.length; i++) {
                    String field = row[i];
                    // 处理包含逗号、引号或换行的字段
                    if (field.contains(",") || field.contains("\"") || field.contains("\n")) {
                        field = "\"" + field.replace("\"", "\"\"") + "\"";
                    }
                    line.append(field);
                    // 添加逗号分隔
                    if (i < row.length - 1) {
                        line.append(",");
                    }
                }
                writer.write(line.toString());
                writer.newLine();
            }
            System.out.println("CSV文件已手动导出");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        List<String[]> data = List.of(
            new String[]{"ID", "名称", "描述"},
            new String[]{"1", "产品A", "这是一个包含,逗号的描述"},
            new String[]{"2", "产品B", "包含\"引号\"的描述"},
            new String[]{"3", "产品C", "普通描述"}
        );
        exportManual("D:/products.csv", data);
    }
}

Web应用中的CSV导出(Spring Boot示例)

import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CsvDownloadController {
    @GetMapping("/download/csv")
    public ResponseEntity<byte[]> downloadCsv() {
        try {
            // 生成CSV内容
            StringBuilder csvContent = new StringBuilder();
            csvContent.append("序号,姓名,部门,工资\n");
            csvContent.append("1,张三,技术部,15000\n");
            csvContent.append("2,李四,市场部,12000\n");
            csvContent.append("3,王五,财务部,13000\n");
            byte[] csvBytes = csvContent.toString().getBytes("GBK"); // 使用GBK编码支持中文
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", "员工数据.csv");
            headers.setContentLength(csvBytes.length);
            return ResponseEntity.ok()
                    .headers(headers)
                    .body(csvBytes);
        } catch (Exception e) {
            return ResponseEntity.badRequest().build();
        }
    }
}

批量导出大量数据的优化版本

import com.opencsv.CSVWriter;
import java.io.*;
import java.util.List;
public class LargeDataCsvExport {
    // 批量导出大量数据
    public static void exportLargeData(String filePath, List<String[]> dataBatch) {
        final int BATCH_SIZE = 1000; // 分批写入
        try (CSVWriter writer = new CSVWriter(new FileWriter(filePath))) {
            // 写入表头
            writer.writeNext(new String[]{"ID", "姓名", "年龄", "地址"});
            int count = 0;
            for (String[] row : dataBatch) {
                writer.writeNext(row);
                count++;
                // 每批数据后刷新缓冲区
                if (count % BATCH_SIZE == 0) {
                    writer.flush();
                    System.out.println("已写入 " + count + " 条数据");
                }
            }
            System.out.println("总共写入 " + count + " 条数据");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用建议

  1. 小规模数据:使用OpenCSV或手动实现即可
  2. Web应用下载:使用Spring Boot的ResponseEntity方案
  3. 大数据量导出:建议分批写入并注意内存管理
  4. 中文支持:导出时使用GBK编码避免Excel打开乱码
  5. 特殊字符处理:注意转义包含逗号、引号、换行的字段

选择哪种方式取决于你的具体需求,如果是新项目推荐使用OpenCSV,功能完善且使用简单。

抱歉,评论功能暂时关闭!