Java实现生成csv文件并导入数据
一、需求:
下载列表,在没有过滤之前下载列表所有数据,点击过滤之后,下载过滤之后对数据,生成csv文件。
二、思路:
先根据条件(是否过滤了数据)筛选出数据,将数据导入csv文件,生成文件并返回。
三、代码实现:
1、controller层
/*** 文件下载(失败了会返回一个有部分数据的Excel)* <p>* 1. 创建excel对应的实体对象* <p>* 2. 设置返回的 参数* <p>* 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然外面再关闭流问题不大*/@ApiOperation(value = "downloadCSV", notes = "download solution")@CactusAction(url = "api/downloadCSV", method = HttpMethod.POST)@PostMapping("/downloadCSV")public void downloadAndJudgeFilter(HttpServletResponse response, HttpServletRequest request,@ApiIgnore CactusContext context, @Validated @RequestBody OrderSolutionDownloadDTO downloadDTO) throws IOException {//-------传入参数根据自己的传 CactusContext为获取到用户信息-------OrderSolutionDownloadDTO为查询的参数dto--------//-------这一块------ 根据自己的条件筛选出需要导出的数据 ---------------JSONObject criteria = null;if(downloadDTO.getFilterId() > 0){Filters filter = filtersService.getOne(Wrappers.<Filters>lambdaQuery().eq(Filters::getAccountId, context.getAccountId()).eq(Filters::getCreatorId, context.getUserId()).eq(Filters::getId, downloadDTO.getFilterId()));if (Objects.nonNull(filter)){criteria = JSONObject.parseObject(filter.getCriteria());}}else{criteria = JSONObject.parseObject(downloadDTO.getF());}List<SolutionDocument> solutionDocuments = returnAndRefundListService.downloadAndJudgeFilter(context, criteria);// --------------数据为List集合solutionDocuments------------------------------// ----------将数据传入ExportCsvUtils中ExportCsvUtils.exportCsv(response,request,solutionDocuments);}
2、ExportCsvUtils
import com.shulex.cloud.platform.ticket.consts.SolutionListConstants;
import com.shulex.cloud.platform.ticket.es.document.SolutionDocument;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;/*** @Author: c* @Description:* @Date: 2022/4/13*/
public class ExportCsvUtils {/** CSV文件列分隔符 */private static final String CSV_COLUMN_SEPARATOR = ",";/** CSV文件列分隔符 */private static final String CSV_RN = "\r\n";/*** export csv* @param response* @param request* @param list* SolutionListConstants为自定义的表头常量类*/public static void exportCsv(HttpServletResponse response, HttpServletRequest request, List<SolutionDocument> list){// 设置表格头Object[] head = {SolutionListConstants.TICKET_NUMBER,SolutionListConstants.TICKET_CREATE_DATE,SolutionListConstants.CUSTOMER_EMAIL,SolutionListConstants.CUSTOMER_NAME,SolutionListConstants.PLATFORM,SolutionListConstants.MARKET,SolutionListConstants.SELLER,SolutionListConstants.ORDER_PURCHASE_DATE,SolutionListConstants.ORDER_NUMBER,SolutionListConstants.PRODUCT_CATEGORY,SolutionListConstants.SKU,SolutionListConstants.ITEMS,SolutionListConstants.SKU_QUANTITY,SolutionListConstants.SKU_AMOUNT,SolutionListConstants.SOLUTION_CREATE_DATE,SolutionListConstants.SOLUTION_TYPE,SolutionListConstants.SOLUTION_QUANTITY,SolutionListConstants.SOLUTION_AMOUNT,SolutionListConstants.CURRENCY,SolutionListConstants.SOLUTION_NOTE};List<Object> headList = Arrays.asList(head);List<List<Object>> dataList = getNovel(list);// 导出文件路径String downloadFilePath = request.getSession().getServletContext().getRealPath("");// 导出文件名称DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");String fileName = "solution_List_"+ LocalDate.now()+"_"+dtf.format(LocalDateTime.now());// 导出CSV文件File csvFile = ExportCsvUtils.createCSVFile(headList, dataList, downloadFilePath, fileName);try {// 取得文件名。String filename = csvFile.getName();// 取得文件的后缀名。String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();// 以流的形式下载文件。FileInputStream fis = new FileInputStream(csvFile);// 设置response的HeaderString userAgent = request.getHeader("User-Agent");// 针对IE或者以IE为内核的浏览器:if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {filename = java.net.URLEncoder.encode(filename, "UTF-8");} else {// 非IE浏览器的处理:filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");}response.setHeader("Content-disposition",String.format("attachment; filename=\"%s\"", filename));response.setContentType("multipart/form-data");response.setCharacterEncoding("UTF-8");OutputStream toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");int content = 0;while ((content = fis.read()) != -1) {toClient.write(content);}fis.close();toClient.flush();toClient.close();} catch (Exception ex) {ex.printStackTrace();}}/*** 导入的数据* @param list* @return*/private static List<List<Object>> getNovel(List<SolutionDocument> list) {List<List<Object>> dataList = new ArrayList<List<Object>>();List<Object> rowList = null;// 1000000 data spent 13sif (list != null && list.size() > 0) {for (int i = 0; i < list.size(); i++) {rowList = new ArrayList<Object>();Object[] row = new Object[20];// 根据表头列数对应相应的数据row[0] = list.get(i).getTicketNumber();row[1] = list.get(i).getTicketCreateDate();row[2] = list.get(i).getCustomerEmail();row[3] = list.get(i).getCustomerName();row[4] = list.get(i).getPlatform();row[5] = list.get(i).getMarket();row[6] = list.get(i).getSeller();row[7] = list.get(i).getOrderPurchaseDate();row[8] = list.get(i).getOrderNumber();row[9] = list.get(i).getProductCategory();row[10] = list.get(i).getSku();row[11] = list.get(i).getItems();row[12] = list.get(i).getSkuQuantity();row[13] = list.get(i).getSkuAmount();row[14] = list.get(i).getSolutionCreateDate();row[15] = list.get(i).getSolutionType();row[16] = list.get(i).getSolutionQuantity();row[17] = list.get(i).getSolutionAmount();row[18] = list.get(i).getCurrency();row[19] = list.get(i).getSolutionNote();for(int j=0;j<row.length;j++){rowList.add(row[j]);}dataList.add(rowList);}}return dataList;}/*** new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());* CSV文件生成方法* @param head* @param dataList* @param outPutPath* @param filename* @return*/public static File createCSVFile(List<Object> head, List<List<Object>> dataList,String outPutPath, String filename) {File csvFile = null;BufferedWriter csvWriter = null;try {csvFile = new File(outPutPath + File.separator + filename + ".csv");File parent = csvFile.getParentFile();if (parent != null && !parent.exists()) {parent.mkdirs();}csvFile.createNewFile();// GB2312使正确读取分隔符","csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile),"GB2312"), 1024);// 测试乱码-------
// csvWriter.write('\ufeff');// csvWriter.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));// --------------// 写入文件头部writeRow(head, csvWriter);// 写入文件内容for (List<Object> row : dataList) {writeRow(row, csvWriter);}csvWriter.flush();} catch (Exception e) {e.printStackTrace();} finally {try {csvWriter.close();} catch (IOException e) {e.printStackTrace();}}return csvFile;}/*** 写一行数据方法* @param row* @param csvWriter* @throws IOException*/private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException {// 写入文件头部for (Object data : row) {StringBuffer buf = new StringBuffer();String rowStr = buf.append("\"").append(data).append("\t\",").toString();csvWriter.write(rowStr);}csvWriter.newLine();}}
3、SolutionListConstants常量类
/*** @Author: c* @Description:* @Date: 2022/4/13*/
public class SolutionListConstants {private SolutionListConstants() {}public static final String TICKET_NUMBER = "Ticket Number";public static final String TICKET_CREATE_DATE = "Ticket Create Date";public static final String CUSTOMER_EMAIL = "Customer Email";public static final String CUSTOMER_NAME = "Customer Name";public static final String PLATFORM = "Platform";public static final String MARKET = "Market";public static final String SELLER = "Seller";public static final String ORDER_PURCHASE_DATE = "Order Purchase Date";public static final String ORDER_NUMBER = "Order Number";public static final String PRODUCT_CATEGORY = "Product Category";public static final String SKU = "SKU";public static final String ITEMS = "Items";public static final String SKU_QUANTITY = "SKU Quantity";public static final String SKU_AMOUNT = "SKU Amount";public static final String SOLUTION_CREATE_DATE = "Solution Create Date";public static final String SOLUTION_TYPE = "Solution Type";public static final String SOLUTION_QUANTITY = "Solution Quantity";public static final String SOLUTION_AMOUNT = "Solution Amount";public static final String CURRENCY = "Currency";public static final String SOLUTION_NOTE = "Solution Note";
}
四、总结
由于需要传入参数,使用的是post请求,但前端弄了一天下载的数据会出现中文乱码(后端提供的这个接口通过postman测试下载的文件是完好的)遇到这个问题,不要再使用这个方法,请查看我使用的easyExcel生成excel文件的方法,强行将本文中导出的csv文件格式改成.xlsx会导致数据全部在一行,出现问题。
Java实现生成csv文件并导入数据相关推荐
- 从csv文件中导入数据到MySQL数据库
从csv文件中导入数据到MySQL数据库 转: 一.Workbench客户端导入(8.0.11基本导不全且速度奇慢) 1.点击如下图标创建数据库(非必要) 2.在表类上右键导入 二.SQL语句导入(可 ...
- spark csv 导入_Spark:生成CSV文件以导入到Neo4j
spark csv 导入 大约一年前, 伊恩(Ian)向我指向了一个芝加哥犯罪数据集,该数据集似乎非常适合Neo4j,经过长时间的拖延,我终于可以开始导入它了. 该数据集涵盖了从2001年到现在的犯罪 ...
- java导出csv文件_java导出生成csv文件的方法
本文实例为大家分享了java导出生成csv文件的具体代码,供大家参考,具体内容如下 首先我们需要对csv文件有基础的认识,csv文件类似excel,可以使用excel打开,但是csv文件的本质是逗号分 ...
- 大数据_MapperReduce_从CSV文件中读取数据到Hbase_测试---Hbase工作笔记0022
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们继续看,这里我们写完以后,一会咱们去测试一下. 可以看到上一节我们已经写了,从csv文件中 ...
- java将数据生成csv文件
1,httpRequest接口触发进程[或者可以换成其他方式触发] /** * 出入库生成CSV文件 * @param req * @param params * @return */@Request ...
- Java生成CSV文件
1.新CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils;import java.io.BufferedWriter; imp ...
- POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解...
http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...
- java 生成csv文件_Java生成CSV文件实例详解
本文实例主要讲述了java生成csv文件的方法,具体实现步骤如下: 1.新建csvutils.java文件: package com.saicfc.pmpf.internal.manage.utils ...
- java导出csv文件乱码_记一次java生成csv文件乱码的解决过程 (GB2312编码)
系统:win7 (格式:中文(简体,中国)) 工具:Eclipse (默认编码utf-8) 服务两个:[restful接口] 和 [服务*** server]. 场景:[服务*** server]多 ...
最新文章
- Codeforces Round #278 (Div. 2)
- python 如何中断程序、停止程序、退出程序?sys.exit()、os._exit()、os.kill()
- java二叉树 最大值_leetcode刷题笔记-654. 最大二叉树(java实现)
- matlab dividend,[原创]基于(Matlab/R/C++)的方差Gamma模型(Hull期权期货)随机抽样[by fantuanxiaot]...
- 普元部署包部署找不到构建_让我们在5分钟内构建和部署AutoML解决方案
- wxpython按钮形状如何修改_Python图形化界面入门教程 - 使用wxPython自定义表
- Hibernate缓存 - 第一级缓存
- 【Qt教程】1.5 - Qt5内存回收机制-对象树、窗口坐标系
- 未来语音识别技术的发展趋势将会怎样
- 识别图书ISBN号并输出查询结果的示例 | Marshal's Blog
- type(img).__module__ == np.__name__
- Esxi 6.7u3 安装之重封装网卡驱动与NVME驱动
- 写作专用各种表情和符号,使你的文章更加美观有趣!❤️❤️❤️
- 添加个人博客音乐外链
- 2022考研复习第八周
- 如何利用HTML5快速开发一款小游戏
- 物联网之STM32开发一(基础知识)
- Android数据库选择恐惧症
- 跑滴滴对车有什么要求吗
- 深入 git 必看:git 是如何被创造的?讲述 git 的诞生史、核心思想及其父:Linus Torvalds
热门文章
- Python图形界面不够美?三行代码全面美化你的Tkinter界面
- img预加载获取图片大小方法
- 计算机硬件加速怎么开,启用硬件加速是什么 是如何进行的【详解】
- PyTorch之填充操作
- 仿淘宝 图片局部放大效果
- N1刷openwrt,部分app图片无法显示
- jenkins忘记管理员密码修改
- uva 10118	Free Candies
- iOS15只是一个更好看的Linux吗?
- Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn)