基于hutool生成csv文件
创始人
2025-05-31 07:02:51
0

场景说明

场景说明:

基于hutool 生成csv文件 随机文件名【getRandomFileName()】
指定路径【path】下生成csv 这里引用了一个循环模拟数据接收 这个数据来源可以是rabbitMQ、redis等 一次性获取多条数据推送
每条数据生成一行csv 并且csv有自己的表头
当读取csv的行量【readSize()】超过最大值【csvMaxSize】时 重新生成一个带表头的文件createCsv();
如果行量没超过最大值时 继续追加数据 由于hutool没有提供直接的接口方法做追加数据:这里采纳了hutool读取csv数据【readData()】 合并新数据模式写入文件
循环推送 做了34次推送 每次推两条
由于推送每次是多条 判断当前如果小于最大值【csvMaxSize】时 就会当前量【readSize()】+ 每次推送量 会使文件实际行量大于等于最大值【csvMaxSize】 下一次推送时才能发现行量超过最大值【csvMaxSize】 出发生成新文件

测试方法

测试方法:

搞一个空maven项目
放上我的pom 直接放 不用的也可以自己删吧删吧
把java代码建一个TestController 为了测试方便 一大坨都给你放这里头了
运行
访问 http://127.0.0.1:8080/swagger-ui.html

代码


具体代码如下:

代码:

package com.dragon.controller;import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.csv.*;import cn.hutool.core.util.CharsetUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import java.io.*;
import java.lang.reflect.Field;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;@Api(value = "测试")
@RestController
@RequestMapping("/test")
public class TestController {private String csvName;private String path= "D:\\cscFile\\";private int csvMaxSize=20;@Data@Setter@Getterpublic class User {private String id;private String name;private String nickname;private String sex;private String age;}/*** 获取并组装导出数据*/@ApiOperation(value = "测试连通性", httpMethod = "GET")@ResponseBody@RequestMapping(value = "/p", method = RequestMethod.GET)public void getUserList() {//创建文件件 放置表头createCsv();//模拟每次接受消息for(int i=1;i<35;i++){//模拟数据环节List userList=new ArrayList<>();User tempA  = new User();//模拟每次推两条tempA.setId("AID-A:"+Integer.toString(i));tempA.setSex("A男");tempA.setName("Aname:wanger");tempA.setNickname("Anickname:Jay");tempA.setAge("A30");userList.add(tempA);User tempB  = new User();tempB.setId("BID-B:"+Integer.toString(i));tempB.setSex("B男");tempB.setName("Bname:wanger");tempB.setNickname("Bnickname:Jay");tempB.setAge("B30");userList.add(tempB);//检查csv行数 超过规定重建文件List result= new ArrayList();if(readSize(path+csvName) >csvMaxSize){createCsv();}//先读取文件内容 列宽List fileCsvRows = new ArrayList<>();fileCsvRows = readData(path+csvName);if(fileCsvRows.size()>0){for(int lineKey=0;lineKeyresult.add(fileCsvRows.get(lineKey));}}//保存开始------------------------for(User user:userList){//遍历用户列表的数据 列数Field[] declaredFields =new Field[4];try {//将对象要显示的字段插入对应标题位置declaredFields[0]=user.getClass().getDeclaredField("name");declaredFields[1]=user.getClass().getDeclaredField("nickname");declaredFields[2]=user.getClass().getDeclaredField("sex");declaredFields[3]=user.getClass().getDeclaredField("id");//获取UserList对象的数据作为listValueString[] listValue = new String[declaredFields.length];for(int x=0;xdeclaredFields[x].setAccessible(true);  //设置为允许操作//将属性值添加到listValue对应的索引位置下listValue[x] = String.valueOf(declaredFields[x].get(user)) ;//将listValue添加到result中}result.add(listValue);} catch (Exception  e) {e.printStackTrace();}}//将组装好的结果集传入导出csv格式的工具类this.createCsvFile(result,csvName);//保存结束------------------------}}public void createCsv(){csvName=getRandomFileName("dzbs-")+".csv";//自定义标题别名,作为第一行listNameString[] listName = new String[4];listName[0]="用户名";listName[1]="用户昵称";listName[2]="性别";listName[3]="id";//获取String[]类型的数据至result中List newResult= new ArrayList();//将listName添加到result中newResult.add(listName);this.createCsvFile(newResult,csvName);}/*** 导出csv格式工具类* 创建文件并放置数据  这里放置了表头一行数据* @param result 导出数据* @param fileName 文件名*/public void createCsvFile(List result,String fileName){try {File csvFile = new File(fileName);  //构造文件//导入HuTool中CSV工具包的CsvWriter类//设置导出字符类型, CHARSET_UTF_8
//            CsvWriter writer = CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);CsvWriter writer = CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_GBK);writer.write(result);  //通过CsvWriter中的write方法写入数据writer.close();   //关闭CsvWriter//保存文件FileInputStream fileInputStream=new FileInputStream(csvFile);this.saveFile(fileInputStream,csvFile.getName());}catch (Exception e){System.out.println(e);}}/*** 文件保存 覆盖保存* @param inputStream* @param fileName*/private void saveFile(InputStream inputStream, String fileName) {OutputStream os = null;try {//保存文件路径// 1K的数据缓冲 1024000 1Mbyte[] bs = new byte[1024000];// 读取到的数据长度int len;// 输出的文件流保存到本地文件File tempFile = new File(path);if (!tempFile.exists()) {tempFile.mkdirs();}os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);// 开始读取while ((len = inputStream.read(bs)) != -1) {os.write(bs, 0, len);}} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {// 完毕,关闭所有链接try {os.close();inputStream.close();} catch (IOException e) {e.printStackTrace();}}}/* ** 检查文件是否存在* 读取数据封装到实体 读取行数*/private int readSize(String fileName) {CsvReader reader = CsvUtil.getReader();//从文件中读取CSV数据int size = 0;try {CsvData data = reader.read(FileUtil.file(fileName), CharsetUtil.CHARSET_GBK);size = data.getRowCount();}catch (Exception e){System.out.println("尚未生成:"+fileName+ " --即将创建 ");}return size;}/* ** 读取数据封装到实体*/private  List readData(String fileName) {CsvReader reader = CsvUtil.getReader();List scvData = new ArrayList<>();try {CsvData data = reader.read(FileUtil.file(fileName), CharsetUtil.CHARSET_GBK);scvData = data.getRows();}catch (Exception e){
//            System.out.println("尚未生成:"+fileName+ " --即将创建 ");}return scvData;}public static String getRandomFileName(String pre) {SimpleDateFormat simpleDateFormat;simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");Date date = new Date();String str = simpleDateFormat.format(date);Random random = new Random();int rannum = (int) (random.nextDouble() * (99999 - 10000 + 1)) + 10000;// 获取5位随机数return  pre+ str + rannum;// 当前时间}}

依赖


maven依赖:


4.0.0org.springframework.bootspring-boot-starter-parent2.5.0 com.dragonspringboot_rabbitmq_consumerv1.3jarspringboot_rabbitmq_consumerDemo project for Spring Boot1.8org.springframework.bootspring-boot-starter-weblog4j-apiorg.apache.logging.log4jlog4j-to-slf4jorg.apache.logging.log4jorg.apache.logging.log4jlog4j-core2.16.0log4j-apiorg.apache.logging.log4jorg.apache.logging.log4jlog4j-api2.16.0org.apache.logging.log4jlog4j-to-slf4j2.16.0log4j-apiorg.apache.logging.log4jorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-starter-data-jdbc2.5.0com.baomidoumybatis-plus-boot-starter3.3.0mybatis-plus-corecom.baomidouio.springfoxspringfox-boot-starter3.0.0cn.hutoolhutool-all5.6.5com.baomidoumybatis-plus-core3.3.0org.projectlomboklombokorg.springframework.amqpspring-rabbitnet.sf.json-libjson-lib2.2.3jdk15commons-langcommons-langcommons-loggingcommons-loggingcom.alibabafastjson1.2.78org.apache.maven.pluginsmaven-surefire-plugintrueorg.springframework.bootspring-boot-maven-pluginlibBOOT-INF/lib/**/*.jarsrc/main/java**/*.propertiessrc/main/resources

相关内容

热门资讯

【必须收藏】C语言·专升本·期... 《C语言程序设计》是计算机专业的必修棵,除了学校的期末考试,计算机二级考...
Python自动化测试多个运行... 目录 前言 使用Python版本管理工具 使用Python虚拟环境 poetry 管理工具 前言 ...
如何利用Web3D技术打造在线... 随着Web3D技术的不断发展,越来越多的企业和组织开始将其应用于虚拟展览馆的建设中。虚...
讀聽評述|“分手费”借条无效 ... 近日,海南万宁一女子以自杀胁迫前男友签下百万“借条”索要分手费,法院最终认定协议无效。这一判决不仅维...
经济政策一线微观察|银发专列激... 随着我国老龄化进程加快,“银发族”成为文旅市场新蓝海。银发专列应运而生,凭借适老化设施与贴心服务,为...
23人送医,损失超3亿韩元!首... 据央视新闻报道,当地时间5月31日,首尔地铁5号线一列车发生火灾,乘客被紧急疏散。据初步调查,火灾原...
Integer类型比较(127...   这个是比较基础的问题,也是常见的问题,也是经常会被问到的问题...
EtherNet/IP网络模型 一、常识入门 0.为什么需要CIP协议 CIP协议(Common Industrial...
【服务器数据恢复】StorNe... 服务器数据恢复环境: 服务器+10个磁盘柜,每个磁盘柜24块磁盘...
原创 说... 很多人都在遵从传统规范,要遵守传统的礼仪道德,遵守传统的习俗,遵守传统的行业伦理,甚至遵守传统的宗教...