java导出csv文件_JAVA导出CSV文件实例教程

本文介绍了如何使用Apache Commons CSV库在Java中快速导出CSV文件,对比了CSV与Excel的性能,并提供了详细的代码示例,包括读写CSV文件以及并行导出多个CSV文件的方法。
摘要由CSDN通过智能技术生成

b55485bf45541dbd581ea5fca50260ec.png

以前导出总是用POI导出为Excel文件,后来当我了解到CSV以后,我发现速度飞快。

如果导出的数据不要求格式、样式、公式等等,建议最好导成CSV文件,因为真的很快。

虽然我们可以用Java再带的文件相关的类去操作以生成一个CSV文件,但事实上有好多第三方类库也提供了类似的功能。

这里我们使用apache提供的commons-csv组件

Commons CSV

文档在这里

先看一下具体用法

@Test public void testWrite() throws Exception {

FileOutputStream fos = new FileOutputStream("E:/cjsworkspace/cjs-excel-demo/target/abc.csv");

OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");

CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader("姓名", "年龄", "家乡");

CSVPrinter csvPrinter = new CSVPrinter(osw, csvFormat);// csvPrinter = CSVFormat.DEFAULT.withHeader("姓名", "年龄", "家乡").print(osw);

for (int i = 0; i < 10; i++) {

csvPrinter.printRecord("张三", 20, "湖北");

}

csvPrinter.flush();

csvPrinter.close();

}

@Test public void testRead() throws IOException {

InputStream is = new FileInputStream("E:/cjsworkspace/cjs-excel-demo/target/abc.csv");

InputStreamReader isr = new InputStreamReader(is, "GBK");

Reader reader = new BufferedReader(isr);

CSVParser parser = CSVFormat.EXCEL.withHeader("name", "age", "jia").parse(reader);// CSVParser csvParser = CSVParser.parse(reader, CSVFormat.DEFAULT.withHeader("name", "age", "jia"));

List list = parser.getRecords(); for (CSVRecord record : list) {

System.out.println(record.getRecordNumber() + ":" + record.get("name") + ":" + record.get("age") + ":" + record.get("jia"));

}

parser.close();

} /**

* Parsing an Excel CSV File */

@Test public void testParse() throws Exception {

Reader reader = new FileReader("C:/Users/Administrator/Desktop/abc.csv");

CSVParser parser = CSVFormat.EXCEL.parse(reader); for (CSVRecord record : parser.getRecords()) {

System.out.println(record);

}

parser.close();

} /**

* Defining a header manually */

@Test public void testParseWithHeader() throws Exception {

Reader reader = new FileReader("C:/Users/Administrator/Desktop/abc.csv");

CSVParser parser = CSVFormat.EXCEL.withHeader("id", "name", "code").parse(reader); for (CSVRecord record : parser.getRecords()) {

System.out.println(record.get("id") + ","

+ record.get("name") + ","

+ record.get("code"));

}

parser.close();

} /**

* Using an enum to define a header */

enum MyHeaderEnum {

ID, NAME, CODE;

}

@Test public void testParseWithEnum() throws Exception {

Reader reader = new FileReader("C:/Users/Administrator/Desktop/abc.csv");

CSVParser parser = CSVFormat.EXCEL.withHeader(MyHeaderEnum.class).parse(reader); for (CSVRecord record : parser.getRecords()) {

System.out.println(record.get(MyHeaderEnum.ID) + ","

+ record.get(MyHeaderEnum.NAME) + ","

+ record.get(MyHeaderEnum.CODE));

}

parser.close();

} private List> recordList = new ArrayList<>();

@Before public void init() { for (int i = 0; i < 5; i++) {

Map map = new HashMap<>();

map.put("name", "zhangsan");

map.put("code", "001");

recordList.add(map);

}

}

@Test public void writeMuti() throws InterruptedException {

ExecutorService executorService = Executors.newFixedThreadPool(3);

CountDownLatch doneSignal = new CountDownLatch(2);

executorService.submit(new exprotThread("E:/0.csv", recordList, doneSignal));

executorService.submit(new exprotThread("E:/1.csv", recordList, doneSignal));

doneSignal.await();

System.out.println("Finish!!!");

} class exprotThread implements Runnable { private String filename; private List> list; private CountDownLatch countDownLatch; public exprotThread(String filename, List> list, CountDownLatch countDownLatch) { this.filename = filename; this.list = list; this.countDownLatch = countDownLatch;

}

@Override public void run() { try {

CSVPrinter printer = new CSVPrinter(new FileWriter(filename), CSVFormat.EXCEL.withHeader("NAME", "CODE")); for (Map map : list) {

printer.printRecord(map.values());

}

printer.close();

countDownLatch.countDown();

} catch (IOException e) {

e.printStackTrace();

}

}

}

CSV与EXCEL

/**

* 测试写100万数据需要花费多长时间 */

@Test public void testMillion() throws Exception { int times = 10000 * 10;

Object[] cells = {"满100减15元", "100011", 15}; // 导出为CSV文件

long t1 = System.currentTimeMillis();

FileWriter writer = new FileWriter("G:/test1.csv");

CSVPrinter printer = CSVFormat.EXCEL.print(writer); for (int i = 0; i < times; i++) {

printer.printRecord(cells);

}

printer.flush();

printer.close(); long t2 = System.currentTimeMillis();

System.out.println("CSV: " + (t2 - t1)); // 导出为Excel文件

long t3 = System.currentTimeMillis();

XSSFWorkbook workbook = new XSSFWorkbook();

XSSFSheet sheet = workbook.createSheet(); for (int i = 0; i < times; i++) {

XSSFRow row = sheet.createRow(i); for (int j = 0; j < cells.length; j++) {

XSSFCell cell = row.createCell(j);

cell.setCellValue(String.valueOf(cells[j]));

}

}

FileOutputStream fos = new FileOutputStream("G:/test2.xlsx");

workbook.write(fos);

fos.flush();

fos.close(); long t4 = System.currentTimeMillis();

System.out.println("Excel: " + (t4 - t3));

}

Maven依赖

org.apache.commons

commons-csv

1.5

org.apache.poi

poi

3.17

org.apache.poi

poi-ooxml

3.17

junit

junit

4.12

test

最后,刚才的例子中只写了3个字段,100万行,生成的CSV文件有十几二十兆,太多的话建议分多个文件打包下周,不然想象一个打开一个几百兆的excel都费劲。

以上就是JAVA导出CSV文件实例教程的详细内容,更多关于JAVA导出CSV文件的资料请关注脚本之家其它相关文章!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值