以前导出总是用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

先看一下具体用法

@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<CSVRecord> 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<Map<String, String>> recordList = new ArrayList<>(); @Before
public void init() {
for (int i = 0; i < 5; i++) {
Map<String, String> 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<Map<String, String>> list;
private CountDownLatch countDownLatch; public exprotThread(String filename, List<Map<String, String>> 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<String, String> 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依赖

<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.5</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</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. 在WINDOWS中安装使用GSL(MinGW64+Sublime Text3 & Visual Studio)

    本文介绍在Windows下安装使用GSL库,涉及GSL两个版本(官方最新版及GSL1.8 VC版).msys shell.GCC.G++等内容,最终实现对GSL安装及示例基于MinGW64在Subli ...

  2. Little Sub and Isomorphism Sequences ZOJ - 4089

    ZOJ - 4089 思路:可以反正 最长重构序列必然符合  此模式 x  +  {   }  与  {   }  +  x 那么 题意转化为了  找两个距离最长的相同的数.eeee 先离散化 然后 ...

  3. Jmeter中实现base64加密

    Jmeter已不再提供内置base64加密函数,遇到base64加密需求,需要通过beanshell实现 直接上beanshell代码: import org.apache.commons.net.u ...

  4. Java 多文件压缩成一个文件工具类

    简单修改来自博客园勇闯天涯zfc的博客 一.内容 ①使用 Java 将多个文件打包压缩成一个压缩文件: ②主要使用 java.io 下的类 二.源代码:ZIPUtil .java import jav ...

  5. CF666B. World Tour

    CF666B. World Tour 题意: 给定一张边权为 1 的有向图,求四个不同点 A, B, C, D 使得 dis(A, B) + dis(B, C) + dis(C, D) 取最大值,di ...

  6. springboot添加邮件发送及压缩功能

    springboot添加邮件发送及文件压缩功能 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190233.html 先来一段诗 ``` 就这样吧 忍受折磨 ...

  7. C#一句话判断两个List<T>是否相等

    List1.All(List2.Contains) && List1.Count == List2.Count

  8. spring-cloud-Zuul学习(三)【中级篇】--Filter链 工作原理与Zuul原生Filter【重新定义spring cloud实践】

    这里开始记录zuul中级进阶内容.前面说过了,zuul主要是一层一层的Filter过滤器组成,并且Zuul的逻辑引擎与Filter可用其他基于JVM的语言编写,比如:Groovy. 工作原理 Zuul ...

  9. 关于height、offsetheight、clientheight、scrollheight、innerheight、outerheight的区别

    二.也是平时经常用到的offsetheight 它返回的高度是内容高+padding+边框,但是注意哦,木有加margin哦,当然一般也木有啥需要把margin加进去的,以上代码为例,结果显示上图h2 ...

  10. win10企业版永久激活方法

    步骤: 1.右键点击桌面左下角"windows"图标,点击打开“命令提示符” 2.复制命令:slmgr.vbs /upk,按回车确定,弹出窗口显示“成功地卸载了产品密钥” 3.复制 ...