本文目录导读:

在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,功能完善且使用简单。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播