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

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

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

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

Commons CSV

文档在这里

http://commons.apache.org/

http://commons.apache.org/proper/commons-csv/

http://commons.apache.org/proper/commons-csv/user-guide.html

先看一下具体用法

  1. @Test
  2. public void testWrite() throws Exception {
  3. FileOutputStream fos = new FileOutputStream("E:/cjsworkspace/cjs-excel-demo/target/abc.csv");
  4. OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
  5.  
  6. CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader("姓名", "年龄", "家乡");
  7. CSVPrinter csvPrinter = new CSVPrinter(osw, csvFormat);
  8.  
  9. // csvPrinter = CSVFormat.DEFAULT.withHeader("姓名", "年龄", "家乡").print(osw);
  10.  
  11. for (int i = 0; i < 10; i++) {
  12. csvPrinter.printRecord("张三", 20, "湖北");
  13. }
  14.  
  15. csvPrinter.flush();
  16. csvPrinter.close();
  17.  
  18. }
  19.  
  20. @Test
  21. public void testRead() throws IOException {
  22. InputStream is = new FileInputStream("E:/cjsworkspace/cjs-excel-demo/target/abc.csv");
  23. InputStreamReader isr = new InputStreamReader(is, "GBK");
  24. Reader reader = new BufferedReader(isr);
  25.  
  26. CSVParser parser = CSVFormat.EXCEL.withHeader("name", "age", "jia").parse(reader);
  27. // CSVParser csvParser = CSVParser.parse(reader, CSVFormat.DEFAULT.withHeader("name", "age", "jia"));
  28. List<CSVRecord> list = parser.getRecords();
  29. for (CSVRecord record : list) {
  30. System.out.println(record.getRecordNumber()
  31. + ":" + record.get("name")
  32. + ":" + record.get("age")
  33. + ":" + record.get("jia"));
  34. }
  35.  
  36. parser.close();
  37. }
  38.  
  39. /**
  40. * Parsing an Excel CSV File
  41. */
  42. @Test
  43. public void testParse() throws Exception {
  44. Reader reader = new FileReader("C:/Users/Administrator/Desktop/abc.csv");
  45. CSVParser parser = CSVFormat.EXCEL.parse(reader);
  46. for (CSVRecord record : parser.getRecords()) {
  47. System.out.println(record);
  48. }
  49. parser.close();
  50. }
  51.  
  52. /**
  53. * Defining a header manually
  54. */
  55. @Test
  56. public void testParseWithHeader() throws Exception {
  57. Reader reader = new FileReader("C:/Users/Administrator/Desktop/abc.csv");
  58. CSVParser parser = CSVFormat.EXCEL.withHeader("id", "name", "code").parse(reader);
  59. for (CSVRecord record : parser.getRecords()) {
  60. System.out.println(record.get("id") + ","
  61. + record.get("name") + ","
  62. + record.get("code"));
  63. }
  64. parser.close();
  65. }
  66.  
  67. /**
  68. * Using an enum to define a header
  69. */
  70. enum MyHeaderEnum {
  71. ID, NAME, CODE;
  72. }
  73.  
  74. @Test
  75. public void testParseWithEnum() throws Exception {
  76. Reader reader = new FileReader("C:/Users/Administrator/Desktop/abc.csv");
  77. CSVParser parser = CSVFormat.EXCEL.withHeader(MyHeaderEnum.class).parse(reader);
  78. for (CSVRecord record : parser.getRecords()) {
  79. System.out.println(record.get(MyHeaderEnum.ID) + ","
  80. + record.get(MyHeaderEnum.NAME) + ","
  81. + record.get(MyHeaderEnum.CODE));
  82. }
  83. parser.close();
  84. }
  85.  
  86. private List<Map<String, String>> recordList = new ArrayList<>();
  87.  
  88. @Before
  89. public void init() {
  90. for (int i = 0; i < 5; i++) {
  91. Map<String, String> map = new HashMap<>();
  92. map.put("name", "zhangsan");
  93. map.put("code", "001");
  94. recordList.add(map);
  95. }
  96. }
  97.  
  98. @Test
  99. public void writeMuti() throws InterruptedException {
  100. ExecutorService executorService = Executors.newFixedThreadPool(3);
  101. CountDownLatch doneSignal = new CountDownLatch(2);
  102.  
  103. executorService.submit(new exprotThread("E:/0.csv", recordList, doneSignal));
  104. executorService.submit(new exprotThread("E:/1.csv", recordList, doneSignal));
  105.  
  106. doneSignal.await();
  107. System.out.println("Finish!!!");
  108. }
  109.  
  110. class exprotThread implements Runnable {
  111.  
  112. private String filename;
  113. private List<Map<String, String>> list;
  114. private CountDownLatch countDownLatch;
  115.  
  116. public exprotThread(String filename, List<Map<String, String>> list, CountDownLatch countDownLatch) {
  117. this.filename = filename;
  118. this.list = list;
  119. this.countDownLatch = countDownLatch;
  120. }
  121.  
  122. @Override
  123. public void run() {
  124. try {
  125. CSVPrinter printer = new CSVPrinter(new FileWriter(filename), CSVFormat.EXCEL.withHeader("NAME", "CODE"));
  126. for (Map<String, String> map : list) {
  127. printer.printRecord(map.values());
  128. }
  129. printer.close();
  130. countDownLatch.countDown();
  131. } catch (IOException e) {
  132. e.printStackTrace();
  133. }
  134. }
  135. }

CSV与EXCEL

  1.   /**
  2. * 测试写100万数据需要花费多长时间
  3. */
  4. @Test
  5. public void testMillion() throws Exception {
  6. int times = 10000 * 10;
  7. Object[] cells = {"满100减15元", "100011", 15};
  8.  
  9. // 导出为CSV文件
  10. long t1 = System.currentTimeMillis();
  11. FileWriter writer = new FileWriter("G:/test1.csv");
  12. CSVPrinter printer = CSVFormat.EXCEL.print(writer);
  13. for (int i = 0; i < times; i++) {
  14. printer.printRecord(cells);
  15. }
  16. printer.flush();
  17. printer.close();
  18. long t2 = System.currentTimeMillis();
  19. System.out.println("CSV: " + (t2 - t1));
  20.  
  21. // 导出为Excel文件
  22. long t3 = System.currentTimeMillis();
  23. XSSFWorkbook workbook = new XSSFWorkbook();
  24. XSSFSheet sheet = workbook.createSheet();
  25. for (int i = 0; i < times; i++) {
  26. XSSFRow row = sheet.createRow(i);
  27. for (int j = 0; j < cells.length; j++) {
  28. XSSFCell cell = row.createCell(j);
  29. cell.setCellValue(String.valueOf(cells[j]));
  30. }
  31. }
  32. FileOutputStream fos = new FileOutputStream("G:/test2.xlsx");
  33. workbook.write(fos);
  34. fos.flush();
  35. fos.close();
  36. long t4 = System.currentTimeMillis();
  37. System.out.println("Excel: " + (t4 - t3));
  38. }

Maven依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.commons</groupId>
  4. <artifactId>commons-csv</artifactId>
  5. <version>1.5</version>
  6. </dependency>
  7.  
  8. <dependency>
  9. <groupId>org.apache.poi</groupId>
  10. <artifactId>poi</artifactId>
  11. <version>3.17</version>
  12. </dependency>
  13.  
  14. <dependency>
  15. <groupId>org.apache.poi</groupId>
  16. <artifactId>poi-ooxml</artifactId>
  17. <version>3.17</version>
  18. </dependency>
  19.  
  20. <dependency>
  21. <groupId>junit</groupId>
  22. <artifactId>junit</artifactId>
  23. <version>4.12</version>
  24. <scope>test</scope>
  25. </dependency>
  26. </dependencies>

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

Java导出CSV文件的更多相关文章

  1. java导出csv文件使用Excel打开乱码问题

    写一个csv文件,发现使用 notpad++ 打开是没有问题的,但是使用 Excel 打开之后显示乱码 刚开始的代码是这样子的: ByteArrayOutputStream os = new Byte ...

  2. Java生成CSV文件实例详解

    本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

  3. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  4. Java 导出 CSV

    package com.cib.cap4j.cfn.util; import java.io.BufferedWriter; import java.io.File; import java.io.F ...

  5. java 操作 csv文件

    CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...

  6. Spring Boot下的一种导出CSV文件的代码框架

    1.前言 ​ CSV,逗号分隔值(Comma-Separated Values),即为逗号分隔的文本文件.如果值中含有逗号.换行符.制表符(Tab).单引号及双引号,则需要用双引号括起来:如果值中包含 ...

  7. 导出csv文件示例

    导出csv文件示例 csv文件默认以英文逗号,做为列分隔符换行符\n作为行分隔符,写入到一个.csv文件即可.含有英文逗号,和换行符会发生数据输出会出现混乱,下面列出一些处理方法.特殊字符处理1.含有 ...

  8. mysql SQLyog导入导出csv文件

    1.选择数据库表 --> 右击属性 --> 备份/导出 --> 导出表数据作为 --> 选择cvs --> 选择下面的“更改” --> 字段 --> 变量长度 ...

  9. PHP 读取/导出 CSV文件

    工作中经常会有遇到导入/导出的需求,下面是常用的方法.读取CSV文件,可以分页读取,设置读取行数,起始行数即可.导出CSV文件,用两种方法进行实现. /** * 读取CSV文件 * @param st ...

随机推荐

  1. nginx配置ssl验证

    在上一篇博客中,我们只是通过nginx搭建了反向代理服务,由于需要在小程序中使用https服务,所以需要申请安全证书. 1.在所购买的域名商那申请免费的ssl证书,我买的是阿里的,所以直接在阿里上申请 ...

  2. PBRT笔记(9)——贴图

    采样与抗锯齿 当高分辨率贴图被缩小时,贴图会出现严重的混淆现象.虽然第7章中的非均匀采样技术可以减少这种混叠的视觉影响,但是更好的解决方案是实现基于分辨率进行采样的纹理函数. 可以在使用贴图时先对贴图 ...

  3. [linux]CentOS安装pre-built Nginx

    官方文档:https://nginx.org/en/linux_packages.html Nginx安装分为软件包安装和pre-built安装.这里使用的pre-built安装,不用自己编译. 设置 ...

  4. Git 实用指南

    传送门: https://mp.weixin.qq.com/s?__biz=MzI3MzgxNDY2MQ==&mid=2247484159&idx=1&sn=2d28513ef ...

  5. 自制vbs消息轰炸机

    自制消息轰炸机 目标 做一个简单的,可以自己输入参数的vbs程序 准备 电脑qq 脚本设计成了可以指定发给某个好友轰炸的形式,在写好以后容错性比较强,但这意味着你想换人的话,需要重新改代码 vbs脚本 ...

  6. 开发中少不了的Fun -- 获取地址栏URL参数

    假设这是一个url地址 http://localhost:8080/a/b/c?a=1&b=2#abc,里面包含的部分: protocol: 'http:', // 协议 host: 'loc ...

  7. MUI消息推送

    一.push通过H5+实现 简单实现方式:通过轮询服务器是否有新消息推送过来 mui.plusReady(function() { plus.navigator.closeSplashscreen() ...

  8. [LeetCode] Smallest Subtree with all the Deepest Nodes 包含最深结点的最小子树

    Given a binary tree rooted at root, the depth of each node is the shortest distance to the root. A n ...

  9. Java解析json字符串和json数组

    Java解析json字符串和json数组 public static Map<String, String> getUploadTransactions(String json){ Map ...

  10. Redmine 安装、搭建

    参考两个博客: 1.https://blog.csdn.net/g19881118/article/details/59476045 2.https://www.cnblogs.com/chendal ...