Java 导出 CSV 文件操作详情

首先第一步 导入坐标:

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.6</version>
</dependency>

第二步

引入工具类 说明下 因为这个工具类用到是Listj集合
我就顺带吧 实体类和map 之间的转换也说了

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 导出至csv文件
* */
public class CsvUtil {
//CSV文件分隔符
private final static String NEW_LINE_SEPARATOR="\n";
/** CSV文件列分隔符 */
private static final String CSV_COLUMN_SEPARATOR = ",";
/** CSV文件列分隔符 */
private static final String CSV_RN = "\r\n";

/**写入csv文件
* @param headers 列头
* @param data 数据内容
* @param filePath 创建的csv文件路径
* @throws IOException **/
public static void writeCsvWithHeader(String[] headers, List<Object[]> data, String filePath) {
//初始化csvformat
CSVFormat format = CSVFormat.DEFAULT.withHeader(headers);
try {
//根据路径创建文件,并设置编码格式
FileOutputStream fos = new FileOutputStream(filePath);
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
//创建CSVPrinter对象
CSVPrinter printer = new CSVPrinter(osw, format);

if(null!=data){
//循环写入数据
for(Object[] lineData:data){
printer.printRecord(lineData);
}
}
printer.flush();
printer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**写入csv文件
* @param headers 列头
* @param data 数据内容
* @param filePath 创建的csv文件路径
* @throws IOException **/
public static void writeCsvWithRecordSeparator(Object[] headers, List<Object[]> data, String filePath){
//初始化csvformat
CSVFormat format = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR);
try {
//根据路径创建文件,并设置编码格式
FileOutputStream fos = new FileOutputStream(filePath);
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
//创建CSVPrinter对象
CSVPrinter printer = new CSVPrinter(osw,format);
//写入列头数据
printer.printRecord(headers);

if(null!=data){
//循环写入数据
for(Object[] lineData:data){
printer.printRecord(lineData);
}
}
printer.flush();
printer.close();
System.out.println("CSV文件创建成功,文件路径:"+filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @filePath 文件路径
*/
public static List<CSVRecord> readCsvParse(String filePath){
List<CSVRecord> records = new ArrayList<>();
try {
FileInputStream in = new FileInputStream(filePath);
BufferedReader reader = new BufferedReader (new InputStreamReader(in,"GBK"));
CSVParser parser = CSVFormat.EXCEL.parse(reader);
records = parser.getRecords();
parser.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
return records;
}
}

/**
* 自定义字段
* @filePath 文件路径
*/
public static List<CSVRecord> readCsvParseWithHeader(String filePath,String[] headers){
List<CSVRecord> records = new ArrayList<>();
try {
FileInputStream in = new FileInputStream(filePath);
BufferedReader reader = new BufferedReader (new InputStreamReader(in,"GBK"));
CSVParser parser = CSVFormat.EXCEL.withHeader(headers).parse(reader);
records = parser.getRecords();
/*for (CSVRecord record : parser.getRecords()) {
System.out.println(record.get("id") + ","
+ record.get("name") + ","
+ record.get("code"));
}*/
parser.close();
}catch (IOException e){
e.printStackTrace();
}finally {
return records;
}
}
/**
* 导出至多个csv文件
* */
public void writeMuti() throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(3);
CountDownLatch doneSignal = new CountDownLatch(2);

List<Map<String, String>> recordList = new ArrayList<>();

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

doneSignal.await();
System.out.println("Finish!!!");
}
/**
* @param colNames 表头部数据
* @param dataList 集合数据
* @param mapKeys 查找的对应数据
*/
public static ByteArrayOutputStream doExport(String[] colNames, String[] mapKeys, List<Map> dataList) {
try {
StringBuffer buf = new StringBuffer();

// 完成数据csv文件的封装
// 输出列头
for (int i = 0; i < colNames.length; i++) {
buf.append(colNames[i]).append(CSV_COLUMN_SEPARATOR);
}
buf.append(CSV_RN);

if (null != dataList) { // 输出数据
for (int i = 0; i < dataList.size(); i++) {
for (int j = 0; j < mapKeys.length; j++) {
buf.append(dataList.get(i).get(mapKeys[j])).append(CSV_COLUMN_SEPARATOR);
}
buf.append(CSV_RN);
}
}
// 写出响应
ByteArrayOutputStream os = new ByteArrayOutputStream();
//OutputStream os = new ByteArrayOutputStream();
os.write(buf.toString().getBytes("GBK"));
os.flush();
os.close();
return os;
} catch (Exception e) {
LogUtils.error("doExport错误...", e);
e.printStackTrace();
}
return null;
}
public static HttpHeaders setCsvHeader(String fileName) {
HttpHeaders headers = new HttpHeaders();
try {
// 设置文件后缀
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String filename = new String(fileName.getBytes("gbk"), "iso8859-1") + sdf.format(new Date()) + ".csv";
headers.add("Pragma", "public");
headers.add("Cache-Control", "max-age=30");
headers.add("Content-Disposition", "attachment;filename="+filename);
headers.setContentType(MediaType.valueOf("application/vnd.ms-excel;charset=UTF-8"));
}catch (Exception e){
e.printStackTrace();
}
return headers;
}
}

第三步

controller 层:

package com.example.demo.controller;

import com.example.demo.service.DemoService;
import com.example.demo.util.CsvUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/demo")
public class DemoController {

@Autowired
private DemoService demoService;

@RequestMapping("/exportCsv")
public ResponseEntity<byte[]> exportCsv(){
//设置excel文件名
String fileName="用户表";
//设置HttpHeaders,设置fileName编码,排除导出文档名称乱码问题
HttpHeaders headers = CsvUtil.setCsvHeader(fileName);
byte[] value = null;
try {
//获取要导出的数据
value = this.demoService.exportCsv();
}catch (Exception e){
e.printStackTrace();
}
return new ResponseEntity<byte[]>(value,headers, HttpStatus.OK);
}
}

第四步:

service 接口

package com.example.demo.service;

public interface DemoService {
/*导出csv文件*/
byte[] exportCsv();
}

第五步:

service 实现类

package com.example.demo.service.impl;
import com.example.demo.pojo.User;
import com.example.demo.service.DemoService;
import com.example.demo.util.CsvUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class DemoServiceImpl implements DemoService {

@Override
public byte[] exportCsv() {
byte[] content = null;
try {
String[] sTitles = new String[]{"名称","年龄","性别"};
String[] mapKeys = new String[]{"name","age","sex"};
List<Map> dataList = new ArrayList<>();
//数据
for (int i = 0; i < 10; i++) {
User user = new User("小明" + i, i, "男" + i);
Map map = BeanUtils.describe(user);
dataList.add(map);
}

ByteArrayOutputStream os = CsvUtil.doExport(sTitles,mapKeys,dataList);
content = os.toByteArray();
}catch (Exception e){
e.printStackTrace();
}
return content;
}
}

补充 :

象和map 互相转换
坐标

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>

用到的工具类:

BeanUtils

1. bean(​​ ​实体类​​​)转Map

例子:

Person person=new Person();
person1.setName("张三");
person1.setSex("不男不女");
Map<String, Object> map=null;

map = BeanUtils.describe(person1);

2. map转bean(实体类)

例子: 估计谁没事也不会用map 转bean 可能是我见识短了/**

* Map转换层Bean,使用泛型免去了类型转换的麻烦。
* @param <T>
* @param map
* @param class1
* @return
*/
public static <T> T map2Bean(Map<String, String> map, Class<T> class1) {
T bean = null;
try {
bean = class1.newInstance();
BeanUtils.populate(bean, map);
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}

到此这篇关于Java 导出 CSV 文件操作详情的文章就介绍到这了,更多相关Java 导出 CSV 文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java实现CSV文件导入与导出功能

    年前在开发功能模块的时候用到了CSV文件导入导出,就此整理一下,便于大家参考. 导入导出功能很多时候用到的都是Excel文件,但是现在越来越多的使用了CSV文件进行此操作,它是一个纯文本文件,可以用记事本打开,也可以用Excel打开.CSV文件不像Excel那样有很多条条框框,它使用硬回车分割每条记录,用逗号分隔每条数据的字段. CSV格式的文件就是用硬回车和文本都好实现的表格,用Excel一读就成了表格.文件名后缀就是 .csv. 直接上代码吧! 导入部分 导入的时候基于Ajax请求,js代码

  • java实现批量导入.csv文件到mysql数据库

    这篇博文是在参加CCF时导入.csv文件时自己总结的,虽然NavicatForMysql可以导入.csv文件,可是当我导入的时候不知道是文件太大还是什么原因,总是会出现失败.然后就用java写了一个批量导入数据的类去导入该.csv文件,这里也没有考虑代码的结构,只是为了快速的完成这个工作,做一个总结. package com.cqu.price_prediction.farm; import java.io.File; import java.io.FileNotFoundException;

  • Java导出CSV文件的方法

    本文实例为大家分享了Java导出CSV文件的具体代码,供大家参考,具体内容如下 Java导出csv文件: 控制层: @Controller @RequestMapping("/historyReport/") public class HistoryStockReportController { private static final Logger LOGGER = LoggerFactory.getLogger(HistoryStockReportController.class)

  • Java避免UTF-8的csv文件打开中文出现乱码的方法

    本文实例讲述了Java避免UTF-8的csv文件打开中文出现乱码的方法.分享给大家供大家参考,具体如下: 最近又遇到了需要提供csv下载功能的需求,不同的时需要用java来实现,心想简单,就把以前php的版本重写了一遍,然后生成一份csv,用excel2007打开一看,里面的中文都是乱码,一下就懵了,以前好好的功能怎么突然不行了??以前也一直用2007的啊!于是开始了漫长的google之旅. 看来看去,说的都是输出utf-8格式的csv需要在文件头先输出BOM(BOM不懂的可以google了),

  • 一文秒懂通过JavaCSV类库读写CSV文件的技巧

    一.背景 小哈公司最近准备开发一套新的平台,具体什么平台,因为涉密,这里就不透露了.平台在最终的的技术选型中,其中主要依赖的技术栈是 Apache Flink, 一款 Apache 基金会开源的流处理框架,平台的核心业务都会交给 Flink 去处理,其中包括离线批量任务计算,以及实时任务计算. PS: 后面小哈也会分享一些 Flink 相关的文章,正在考虑要不要立个 Flag, 出一套 Flink 的入门教程系列文章,主要怕自己太懒了,泼出去的水,收不回来,那就尴尬了~

  • JAVA导出CSV文件实例教程

    以前导出总是用POI导出为Excel文件,后来当我了解到CSV以后,我发现速度飞快. 如果导出的数据不要求格式.样式.公式等等,建议最好导成CSV文件,因为真的很快. 虽然我们可以用Java再带的文件相关的类去操作以生成一个CSV文件,但事实上有好多第三方类库也提供了类似的功能. 这里我们使用apache提供的commons-csv组件 Commons CSV 文档在这里 http://commons.apache.org/ http://commons.apache.org/proper/co

  • java导出csv格式文件的方法

    本文实例为大家分享了java导出csv格式文件的具体代码,供大家参考,具体内容如下 导出csv格式文件的本质是导出以逗号为分隔的文本数据 import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException

  • Javacsv实现Java读写csv文件

    今天跟大家分享一个利用外部Jar包来实现Java操作CSV文件 一.资源下载 1.直接下载Jar包:javacsv-2.0.jar 2.利用Maven下载Jar包: <dependency> <groupId>net.sourceforge.javacsv</groupId> <artifactId>javacsv</artifactId> <version>2.0</version> </dependency>

  • java处理csv文件上传示例详解

    前言:示例只是做了一个最最基础的上传csv的示例,如果要引用到代码中去,还需要根据自己的业务自行添加一些逻辑处理. ReadCsvUtil工具类 package com.hanfengyeqiao.gjb.utils; import java.io.*; import java.util.*; /** * csv工具类 */ public class ReadCsvUtil { private static final String FIX="\uFEFF"; /** * 获取csv文

  • Java 导出 CSV 文件操作详情

    首先第一步 导入坐标: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.6</version> </dependency> 第二步 引入工具类 说明下 因为这个工具类用到是Listj集合我就顺带吧 实体类和map 之间的转换也说了 import org.apach

  • 应用Java泛型和反射导出CSV文件的方法

    本文实例讲述了应用Java泛型和反射导出CSV文件的方法.分享给大家供大家参考.具体如下: 项目中有需求要把数据导出为CSV文件,因为不同的类有不同的属性,为了代码简单,应用Java的泛型和反射,写了一个函数,完成导出功能. 复制代码 代码如下: public <T> void saveFile(List<T> list, String outFile) throws IOException {         if (list == null || list.isEmpty())

  • mysql实现查询结果导出csv文件及导入csv文件到数据库操作

    本文实例讲述了mysql实现查询结果导出csv文件及导入csv文件到数据库操作.分享给大家供大家参考,具体如下: mysql 查询结果导出csv文件: select logtime, operatingsystem, imei from GameCenterLogs where operatingsystem >= 1 and operatingsystem <=3 group by operatingsystem,imei into outfile '/tmp_logs/tmp.csv' f

  • JS实现导出Excel和CSV文件操作

    一.js导出Excel <html> <head> </head> <body> <script type="text/javascript" src="./xlsx.core.min.js"></script> <script type="text/javascript"> /** * 通用的打开下载对话框方法,没有测试过具体兼容性 * @param url 下

  • Java生成CSV文件实例详解

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

  • Java导出txt文件的方法

    本文实例讲述了Java导出txt文件的方法.分享给大家供大家参考.具体如下: 例子一 /** * export导出文件 */ @RequestMapping(value="/grab/export/csv",method={RequestMethod.GET}) public void exportCsv(HttpServletRequest request,HttpServletResponse response){ String userId = ServletRequestUti

  • 如何将Java打开CSV文件到JTable展示

    目录 概述 主要知识点 CsvReader的主要方法 实例 - 读取本地桌面的一个csv文件 本文主要介绍了如何将Java打开CSV文件到JTable展示,废话不多说,具体如下: 概述 主要知识点 a.SwingNode类 :把Java swing组件封装成一个JavaFX的Node,使得Java Swing可以和JavaFX嵌套在一起使用,JavaSwing贼丑,但操作简单,JavaFX的表格组件(TableView等)有点复杂,所以选择嵌套JavaSwing来使用,丑就丑吧 b.javacs

随机推荐