首先第一步 导入坐标:

<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 文件内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Java 导出 CSV 文件操作详情的更多相关文章

  1. ios – 如何从Core Data创建CSV文件(swift)

    我正在构建一个带有核心数据的应用程序,它们显示在tableView中.现在我想将这些数据导出到CSV文件,这样我就可以在windows上的excel中打开它.我搜索了很多,但没有找到正确的答案.有人可以帮助我或给我一个良好的解释或教程的链接?

  2. swift 3.1如何从CSV获取数组或字典

    我怎样才能在这种CSV文件中使用数据?或者我如何打印“内部”列的第2行值并将其分配给属性/实体?我有这种从excel文件转换为Numbers的文件,我想抓取每列的数据并使用它们.原始CSV文件以数字打开:我得到的控制台输出:使用这种方法:解决方案感谢JensMeder运用在viewDidLoad中你想要做的是将字符串分成行然后分成列.Swift已经为String结构提供了components方法.然后您可以通过以下方式访问任何值

  3. 数组 – 将.csv数据导入数组

    我在过去几年使用Objective-C.现在我正在尝试Xcode6beta4与迅速.我想导入一个.csv表单我的webserver到一个数组.我在Objective-C中的旧代码是:我怎么可以在Swift这样做?有最佳做法–推荐吗?有多个swift库可用:CSVImporter,它是一个适用于处理大型csv文件的异步解析器.SwiftCSV,它是一个用于OSX和iOS的简单CSV解析库.和CSwiftV,它是符合rfc4180规范的csv解析器,但根据作者,它全部在内存中,因此不适合大文件.

  4. 读取资源文件夹android中的CSV文件

    我正在开发netbeans的Android应用程序.我正在尝试使用opencsv读取CSV文件.当我将文件放在资源文件夹中并尝试从那里读取它时,在构建无效资源目录时出错.我应该在哪里存储csv文件,以便每次应用程序启动时都可以读取它?

  5. 是否可以远程托管Android应用程序中使用的资源,使其只能由我的应用程序使用?

    基本上我想要实现的是托管一个CSV文件,我的应用程序将检索并使用该文件作为填充某些表的数据源.CSV将使用最新数据进行更新,我设想应用程序每隔一段时间就会获得最新版本,以确保其中的数据是最新的.我的问题在于是否可以确保此远程CSV资源仅供我的应用程序使用?有没有其他方法可以确保我的csv数据源仅供我的应用程序使用?

  6. PHP实现文件安全下载

    例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用"Redirect"的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。feof){echofread;}fclose;}这样就可以用PHP直接输出文件了。

  7. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  9. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部