开源项目-csv导入导出工具类(代码片段)

IT学习日记 IT学习日记     2022-12-21     757

关键词:



  • 💂 个人网站: IT知识小屋
  • 🤟 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

文章目录


前言

  又是一年虐狗日,身为一名经验丰富的单身狗,虽然不能给读者分配"女朋友",但是也希望给大家费分享一些能够提高效率的轮子,帮助大家抽出更多时间摸鱼。

  上一次通过文章跟读者分享了自己写的轮子《摸鱼轮子》,读者的反馈还不错。趁热打铁,赶紧推出的摸鱼轮子第二版-CSV轮子,希望能够帮助更多人节省开发时间,提高摸鱼效率。

  本篇文章会对《轮子之王》开源项目中集成的轮子进行详解介绍,从功能集成从技术选项再到技术实现,帮助大家更好理解轮子是否适用于自己的业务。


项目地址

  Gitee地址: https://gitee.com/it-learning-diary/it-wheels-king

  Github地址: https://github.com/it-learning-diary/it-wheels-king


CSV轮子

  CSV(Comma Separated Values)逗号分隔值,也可以称为字符分隔符,因为分隔字符也可以不是逗号,以纯文本方式存储表格数据(数字和文本)。

  与excel等文件相比,excel文件中会包含许多格式信息,占用的空间会更大,CSV是以纯文本的方式存储,故体积会更小,适合存放结构化的信息,如数据导出、流量统计等。


集成目的

  在日常的开发工作中,导入导出是非常常见的业务,通常来讲,CSV以纯文本方式存储数据,占用的存储空间比excel更少,同时在window环境下默认是使用excel方式打开CSV文件的,因为它本质上是一个文本文件,因此CSV文件的导入导出功能非常常用,故特意在轮子之王项目中集成CSV轮子。


技术架构选择

  JAVA语言中,操作CSV文件相关的框架比较多,常见的有以下几种:

一、Javacsv

  官方地址: https://sourceforge.net/projects/javacsv/

  简介: 它是一个小型的快速开源java库,用于读取和写入CSV和普通分隔文本文件。所有类型的CSV文件都可以处理,txt,Excel格式化,等等。

  特点: 轻量,且快速,但是已经停止维护许久了,不推荐使用

二、Opencsv

  官方地址: http://opencsv.sourceforge.net/#quick_start

  简介: JAVA中易于使用的CSV解析依赖库,设计出来的目的是因为当时CSV解析器没有商业友好的许可证,最低支持JAVA8。

  特点: 该项目已被Apache基金会收录,可以免费用于商业应用程序中,有较全的官网文档和Apache基金会进行维护,但是最低支持的JAVA版本为8,对一些使用低版本的用户不是很友好。

三、Apache-common-csv

  官方地址: https://commons.apache.org/proper/commons-csv/

  简介: 创建目的是为了在ASL许可证下构架一个通用的、简单的读取和写入CSV的接口,作者希望通过common-csv替换掉之前与csv相关的一些框架如opencsv、skife csv等。

  特点: 被Apache收录,持续维护更新,有较全的官方文档。

四、Univocity-parsers(推荐使用)

  官方地址: https://www.univocity.com/pages/univocity_parsers_tutorial

  简介: JAVA语言编写,号称你能发现的最快的关于CSV文件的JAVA解析器,同时支持固定宽度格式文件和TSV文件,开源、已经被Apache收录了

  特点: 支持CSV、TSV、固定宽度格式文件解析,有完整的官方文档、被Apache收录,持续在更新迭代。


  经过对常用的CSV操作框架对比,考虑到性能、后续拓展性、以及官方文档完整性等方面因素,最终决定使用:Univocity-parser来处理CSV文件。


源码解析

  理论千遍不如实践一遍,下面一起来看看封装的CSV轮子源码吧!

CSV导入轮子

  部分源码如下,详细源请到文章末尾领取:

/**
     *
     * @param inputStream
     * @param errorList
     * @param rowDto
     * @param rowAction
     * @param <T>
     */
    public static <T extends Object> void importCsvWithString(InputStream inputStream, List<String> errorList, Class rowDto, ThrowingConsumer<List<String[]>> rowAction) 
        // 定义bean解析者:用于将csv中数据绑定到实体属性中,然后存储带list集合上
        RowListProcessor rowListProcessor = new RowListProcessor();
        CsvParserSettings setting = getDefaultSetting(errorList);
        setting.setProcessor(rowListProcessor);
        // 创建csv文件解析
        CsvParser csvParser = new CsvParser(setting);
        csvParser.parse(inputStream);
        // 获取数据映射后的集合
        List<String[]> rowDataList = rowListProcessor.getRows();
        // 执行数据持久化
        persistentStringDataToDb(rowDataList, rowAction);
    

    /**
     * 将数据持久化到数据库中
     * 具体数据落库的业务逻辑方法:此处的逻辑是将数据从csv中读取出来后,然后进行自己的业务处理,最后进行落库操作
     * 不懂的可以参考:UserServiceImpl下的uploadUserListWithCsv方法案例
     *
     * @param data
     * @param persistentActionMethod
     */
    private static <T> void persistentStringDataToDb(List<String[]> data, ThrowingConsumer<List<String[]>> persistentActionMethod) 
        // 对数据分组,批量插入
        List<List<String[]>> dataList = ListUtil.split(data, ImportConstant.MAX_INSERT_COUNT);
        dataList.stream().forEach(persistentActionMethod);
    

CSV导出轮子

  部分源码如下,详细源请到文章末尾领取:


 /**
     * 导出csv文件(表头和数据都以字符串的形式)
     *
     * @param response
     * @param head
     * @param rowDataList
     */
    public static <T> void exportCsvWithString(HttpServletResponse response, String fileName, List<T> head, List<List<T>> rowDataList) 
        CsvWriter writer = null;
        try 
            response.setContentType(ExportConstant.EXCEL_CONTENT_TYPE);
            response.setCharacterEncoding(ExportConstant.UTF_8);
            response.setHeader(ExportConstant.CONTENT_DISPOSITION, ExportConstant.ATTACHMENT_FILENAME + fileName + ExportConstant.CSV_SUFFIX);
            CsvWriterSettings setting = getDefaultWriteSetting();
            writer = new CsvWriter(response.getOutputStream(), setting);
            writer.writeHeaders(head);
            writer.writeStringRows(rowDataList);
            writer.flush();
         catch (Exception e) 
            log.error("CsvExportUtil exportCsv in error:", e);
         finally 
            if (Objects.nonNull(writer)) 
                writer.close();
            
        
    

    /**
     * 导出csv文件(表头和行都以实体的方式)
     *
     * @param response
     * @param head
     * @param rowDataList
     */
    public static <T> void exportCsvWithBean(HttpServletResponse response, String fileName, T head, List<T> rowDataList) 
        CsvWriter writer = null;
        try 
            // 设置响应头格式
            response.setContentType(ExportConstant.EXCEL_CONTENT_TYPE);
            response.setCharacterEncoding(ExportConstant.UTF_8);
            response.setHeader(ExportConstant.CONTENT_DISPOSITION, ExportConstant.ATTACHMENT_FILENAME + fileName + ExportConstant.CSV_SUFFIX);

            // 设置导出格式
            CsvWriterSettings setting = getDefaultWriteSetting();
            // 创见bean处理器,用于处理写入数据
            BeanWriterProcessor<?> beanWriter = new BeanWriterProcessor<>(head.getClass());
            setting.setRowWriterProcessor(beanWriter);

            // 导出数据
            writer = new CsvWriter(response.getOutputStream(), setting);
            writer.processRecords(rowDataList);
            writer.flush();
         catch (Exception e) 
            log.error("CsvExportUtil exportCsvWithBean in error:", e);
         finally 
            if (Objects.nonNull(writer)) 
                writer.close();
            
        
    


下一迭代

  下一迭代预计添加如下功能:

  • PDF轮子
  • FTP上传下载轮子
  • 更多功能期待读者提出issue或者私信

写在最后

  5月20号这天 ,希望博主的分享能够给你带来一些帮助 ,更多轮子功能集成,欢迎到下面地址了解,如果对您有帮助,希望能收到您的点赞、关注、收藏哦!节日快乐,祝各位单身狗早日遇到良人。

  Gitee地址: https://gitee.com/it-learning-diary/it-wheels-king

  Github地址: https://github.com/it-learning-diary/it-wheels-king

poi导出导入工具类介绍

 介绍: ApachePOI是Apache软件基金会的开源项目,POI提供API给Java程序对MicrosoftOffice格式档案读和写的功能。.NET的开发人员则可以利用NPOI(POIfor.NET)来存取MicrosoftOffice文档的功能。 1.常用类介绍:HSSFWorkbook:  代表一个ExcEL文... 查看详情

2.自定义@excel注解实现数据excel形式导入导出(代码片段)

...学,所以照猫画虎呗,但是难受的是需要复制并根据自己项目修改作者自定义的工具类以及导入这些工具类的依赖包。由于吃了这个苦,我决定把这个艰辛的CV操作通过一张逻辑图来表达,方便我以后复用。下面证实开始介绍这... 查看详情

关于个人开源项目(vueapp)的一些总结(代码片段)

关于个人开源项目(vueapp)的一些总结项目地址https://github.com/BYChoo/record项目简介此项目名叫:Record。是以Vue全家桶(vue,vue-router,vuex)+axios+express+mongodb技术栈开发的一个校园考勤网站,专门为老师定制的。网站目前实现了登录注册、... 查看详情

数据导入导出(代码片段)

mongoexport来导出数据,示例./mongoexport-dmydb-cusers-o../databak/mydb.bak1:-d:指定要导出的数据库2:-c:指定要导出的集合3:-o:指定输出的数据文件导出成csv格式的,比如:./mongoexport-dmydb-cuser-csv-fuserId,name-o../databak/mydb.csv1:-csv:指定... 查看详情

java常用工具类(从开源项目smartframework项目copy过来备用)(代码片段)

1.数组操作工具类packageorg.smart4j.framework.util;importorg.apache.commons.lang.ArrayUtils;/***数组操作工具类**@authorhuangyong*@since1.0*/publicclassArrayUtil/***判断数组是否非空*/publicstaticbooleanisNotEmpty(Object[]ar 查看详情

几行代码就能实现复杂的excel导入导出,这个工具类真心强大!(代码片段)

来源:blog.csdn.net/weixin_43225813/article/details/108995011功能介绍IMPORTExcelHandle核心处理器ExcelWorkbookManageexcel所有工作表管理ExcelInitConfig配置文件初始化AbstractFileParser文件转换类alanpoiimport有何优势?用户不需要额外引 查看详情

java中excel导入导出工具类(代码片段)

1.导入工具1packagecom.linrain.jcs.test;234importjxl.Cell;5importjxl.Sheet;6importjxl.Workbook;7importjxl.write.Label;8importjxl.write.WritableSheet;910importjava.io.InputStream;11importjava.lang.reflect.Field;12importjava.text.SimpleDateFormat;13importjava.util.*;141516/**17*@Description:导入e... 查看详情

csv文件转换帮助类(代码片段)

...,特此封装了一个工具类CsvHelper。特此说一句,C#将数据导出到CSV文件的速度比较快,有时候导出Excel文件很慢的时候可以选择先导出.csv文 查看详情

pandas导入导出(代码片段)

pandas可以读取与存取的资料格式有很多种,像csv、excel、json、html与pickle等…1、读取csvimportpandasaspd#加载模块#读取csvdata=pd.read_csv(‘student.csv‘)#打印出dataprint(data)2、将资料存取为pickledata.to_pickle(‘student.pickle‘)  查看详情

原创poi操作excel导入导出工具类excelutil(代码片段)

...,难免会有疏漏,敬请谅解。主要使用ApachePOI进行Excel的导入、导出使用读取Excel中的数据原始数据如下:方法:publicstaticList<List<String>>readFile(InputStreamins,intheadRowNum)throwsException使用方式:StringfilePath="excel文件路径&quo... 查看详情

[开源]masterchief快速开发辅助类库(代码片段)

C#开发辅助类库,和士官长一样身经百战且越战越勇的战争机器,能力无人能出其右。GitHub:MasterChief欢迎Star,欢迎Issues;项目架构思维导图:目录1.数据库访问2.日志3.缓存4.配置5.验证码6.序列化与反序列化7.EXCEL导入导出8.文件... 查看详情

数据准备1数据导入导出(代码片段)

数据准备1数据导入、导出?读取Excel(.xlrx文件)并进行导出备份importpandasaspdfrompandasimportDataFrame#Pandas可以直接从xlsx(excel)、csv等文件中导入数据,也可以输出到xlsx(excel)、csv格式中score=DataFrame(pd.read_excel(io=‘C:\Users\HP\Desktop\1... 查看详情

php导入execl的工具类方法(代码片段)

最近在做一个项目,有大量的execl表单导入导出,模板格式也比较简单,都是一维格式。但是抵不住量多,每次写导入导出的时候都要单独写。就想着怎么偷个懒。所以就写了一下几个工具方法。字母对应的数字(顺序A对应1)1/**2*... 查看详情

solr导入csv文件(代码片段)

...动生成,也可以是从数据库中导出来的。参见PostgreSQL导入导出数据,将Postgres中的表导出为csv文件。数据上传上传csv文件示例,curlhttp://solr-server:8983/solr/your-collection/update/csv--data-binary&# 查看详情

2008r2ad帐号的批量导入和导出(代码片段)

一、导入1、如下图类别新建一个EXCEL表格,另存为CSV格式2、打开CMD导入CSV文件脚本下载地址因为csvde无法导入密码,首先将策略里的密码复杂性禁用,最小字符改为0csvde-i-fC:\hey.csv-k-jC:\-i:指定为导入模式,默认为导出模式-f:... 查看详情

java导出csv文件

首先第一步导入坐标<dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.6</version></dependency>第二布引入工具类说明下因为这个工具类用到是Li 查看详情

postgre导出单表和导入(代码片段)

pg除了可以通过dump的方式导入和导出。如果只是导出数据,可以直接使用copy导出COPYuserTO'/tmp/data/test.csv'WITHcsv;COPYuser(name,password)TO'/tmp/data/test.csv'WITHcsv;COPY(select*fromuser)TO'/tmp/data/test.csv'WITHcsv;COPY(selectname,agefromuser)... 查看详情

开源项目:数据库表结构生成文档工具(代码片段)

...信息部分代码2、导出Html文档代码五、运行效果六、项目开源地址一、软件介绍今天给大家分享我自己编写的数据库表结构文档生成工具,方便大家在实际开发当中,可以很方便导出业务系统的表结构,也可以作为项... 查看详情