本文目录导读:

在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();
}
}
}
使用建议
- 小规模数据:使用OpenCSV或手动实现即可
- Web应用下载:使用Spring Boot的ResponseEntity方案
- 大数据量导出:建议分批写入并注意内存管理
- 中文支持:导出时使用GBK编码避免Excel打开乱码
- 特殊字符处理:注意转义包含逗号、引号、换行的字段
选择哪种方式取决于你的具体需求,如果是新项目推荐使用OpenCSV,功能完善且使用简单。