1、CsvToXlsxUtil工具类:

import cn.hutool.core.util.ObjectUtil;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jumpmind.symmetric.csv.CsvReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;/*** Csv 转 Xlsx 工具类*/
public class CsvToXlsxUtil {private static final Logger log = LoggerFactory.getLogger(CsvToXlsxUtil.class);/*** CSV常用分隔符,如需动态扩展设置成配置项*/private static final char[] DELIMITERS = {',',';','\001',' ','\t','|','#','&'};/*** 读取CSV文件并写入到XLSX文件中,默认编码** @param csvFileAddress 文件地址*/public static String csvToXlsx(String csvFileAddress) {return csvToXlsx(csvFileAddress, "UTF-8");}/*** @param inputStream 输入流*/public static InputStream csv2xlsx(InputStream inputStream, String fileName) {return csvStream2xlsxStream(inputStream, fileName);}/*** 读取CSV文件并写入到XLSX文件中,指定CSV文件编码** @param csvFileAddress 文件地址* @param charset        编码*/public static String csvToXlsx(String csvFileAddress, String charset) {String xlsxFileAddress = "";FileOutputStream fileOutputStream = null;try {char delimiter = getDelimiter(csvFileAddress);//xlsx file addressxlsxFileAddress = csvFileAddress.replace("csv", "xlsx");XSSFWorkbook workBook = new XSSFWorkbook();XSSFSheet sheet = workBook.createSheet(getSheetName(csvFileAddress));int rowNum = -1;CsvReader csvReader = new CsvReader(csvFileAddress, delimiter, Charset.forName(charset));while (csvReader.readRecord()) {rowNum++;XSSFRow currentRow = sheet.createRow(rowNum);for (int i = 0; i < csvReader.getColumnCount(); i++) {currentRow.createCell(i).setCellValue(csvReader.get(i));}}fileOutputStream = new FileOutputStream(xlsxFileAddress);workBook.write(fileOutputStream);return getFileName(xlsxFileAddress);} catch (Exception e) {log.error("CsvToXlsxUtil exception :", e);} finally {try {assert fileOutputStream != null;fileOutputStream.close();} catch (IOException e) {log.error("CsvToXlsxUtil close FileOutputStream exception :", e);}}return getFileName(xlsxFileAddress);}/*** @param inputStream 输入流*/public static InputStream csvStream2xlsxStream(InputStream inputStream, String fileName) {FileOutputStream fileOutputStream = null;try {fileName = fileName.replace(".csv", ".xlsx");XSSFWorkbook workBook = new XSSFWorkbook();XSSFSheet sheet = workBook.createSheet("sheet1");int rowNum = -1;CsvReader csvReader = new CsvReader(inputStream, StandardCharsets.UTF_8);while (csvReader.readRecord()) {rowNum++;XSSFRow currentRow = sheet.createRow(rowNum);for (int i = 0; i < csvReader.getColumnCount(); i++) {currentRow.createCell(i).setCellValue(csvReader.get(i));}}File file = new File("/" + fileName);fileOutputStream = new FileOutputStream(file);workBook.write(fileOutputStream);InputStream input = new FileInputStream(file);file.delete();return input;} catch (Exception e) {log.error("CsvToXlsxUtil exception :", e);} finally {try {if (ObjectUtil.isNotNull(fileOutputStream)) {assert fileOutputStream != null;fileOutputStream.close();}} catch (IOException e) {log.error("CsvToXlsxUtil close FileOutputStream exception :", e);}}return null;}/*** 设置excel文件的sheet名称* 获取CSV文件名作为Excel文件的sheet名称** @param path 资源路径*/private static String getSheetName(String path) {try {String[] file = getFileName(path).split("\\.");return file[0];} catch (Exception e) {log.error("CsvToXlsxUtil get sheet name exception : ", e);return "Sheet";}}/*** 根据资源路径切割获取文件名** @param path 资源路径*/private static String getFileName(String path) {String[] paths = path.contains("\\") ? path.split("\\\\") : path.split("/");return paths[paths.length - 1];}/*** 常用CSV分隔符数组遍历资源第一行,分隔的字段数多的为资源分隔符* 异常情况下默认用’,‘作为分隔符** @param path 资源路径*/private static char getDelimiter(String path) {BufferedReader br = null;char delimiter = ',';try {br = new BufferedReader(new FileReader(path));String line = br.readLine();CsvReader csvReader;int columCount = 0;for (char delimiterTest : DELIMITERS) {csvReader = new CsvReader(getStringStream(line), delimiterTest, StandardCharsets.UTF_8);if (csvReader.readRecord()) {int newColumnCount = csvReader.getColumnCount();if (newColumnCount > columCount) {columCount = newColumnCount;delimiter = delimiterTest;}}}} catch (Exception e) {log.error("CsvToXlsxUtil get delimiter exception :", e);} finally {try {assert br != null;br.close();} catch (IOException e) {log.error("CsvToXlsxUtil get delimiter close BufferedReader exception :", e);}}return delimiter;}/*** 字符串转输入流* 把CSV文件第一行数据转成输入流** @param sInputString 字符串*/private static InputStream getStringStream(String sInputString) {if (null != sInputString && !"".equals(sInputString)) {try {return new ByteArrayInputStream(sInputString.getBytes());} catch (Exception e) {log.error("CsvToXlsxUtil get StringStream exception :", e);}}return null;}
}

2、importTest测试类:

import CsvToXlsxUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;@SpringBootTest
@RunWith(SpringRunner.class)
public class importTest {private static final String EXT_XLSX = ".xlsx";private static final String EXT_XLS = ".xls";private static final String EXT_CSV = ".csv";@Testpublic void test() {//csv 文件 => xlsx 文件String csvFile = "D:/test/test.csv";System.out.println(CsvToXlsxUtil.csvToXlsx(csvFile));}@Testpublic void importExcel(MultipartFile file) {//csv 流 => xlsx 流if (file == null || file.isEmpty() || ObjectUtils.isEmpty(file.getOriginalFilename())) {System.out.println("文件不能为空");} else {String fileName = file.getOriginalFilename();if (!(fileName.endsWith(EXT_XLSX) || fileName.endsWith(EXT_XLS) || fileName.endsWith(EXT_CSV))) {System.out.println("文件类型不正确");}try {InputStream inputStream = file.getInputStream();if (fileName.endsWith(EXT_CSV)) {inputStream = CsvToXlsxUtil.csvStream2xlsxStream(file.getInputStream(), fileName);}} catch (IOException e) {System.out.println(e.getMessage());}}}
}

Java之Csv转 Xlsx工具类相关推荐

  1. java 兼容excel_Java解析Excel工具类(兼容xls和xlsx)

    依赖jar org.apache.poi poi-ooxml 4.0.1 ExcelUtils.java package javax.utils; import java.io.File; impor ...

  2. (转)JAVA 十六个常用工具类

    (转)JAVA 十六个常用工具类 一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流.socket.或者selector且不抛出异常.通常放在f ...

  3. JAVA实现 PDF转换 常用工具类(html转PDF、PDF添加页码、PDF文件下载、PDF添加印章或者水印)

    JAVA实现 PDF转换 常用工具类(html转PDF.PDF添加页码.PDF文件下载.PDF添加印章或者水印)可直接使用 package com.bestvike.util; import com. ...

  4. JAVA 文件上传下载工具类

    JAVA 文件上传下载工具类 import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org. ...

  5. java inputtools_Java后台开发常用工具类

    本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数据库连接.格式转换.文件操作.发送邮件等等.提高开发效率,欢迎收藏与转载. 数据库连接工具类 数据库连接工具类--仅仅获得连接对象 ...

  6. java中定义一个CloneUtil 工具类

    其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...

  7. 【java笔记】Collections集合工具类

    java.utils.Collections是集合工具类,用来对集合进行操作 常用方法: public static<T>boolean addAll(Collection<T> ...

  8. Java(35):Java Base64编码和解码工具类

    Java Base64编码和解码工具类 Base64Util工具类: package com.ciphergateway.utils; import java.io.UnsupportedEncodi ...

  9. java常用地图坐标系转换工具类,支持谷歌,腾讯,百度等主流的地理坐标转换

    package com.shen.springboot.redis.util;import java.util.ArrayList; import java.util.HashMap; import ...

最新文章

  1. AngularJS:为什么ng-bind在角度上优于{{}}?
  2. mxnet输出训练loss
  3. hibernate02环境的搭建
  4. CnCommon 的一些通用函数说明
  5. 多久没有给家里打过电话了?
  6. Linux内存管理slub分配器
  7. 创意三维c4d形式设计节气海报学习案例
  8. [导入]C++ OpenGL底层和C# GUI无缝联合!
  9. Swift 团队开源 Collections,提供更多高效数据结构
  10. 知识问答题小程序头脑王者源码
  11. mysql查询语句创建临时表_MySQL 临时表_mysql临时表创建_mysql临时表创建
  12. 读“人生有一种牛逼,叫我能背下来”
  13. 赔 1100 万美元!谷歌招聘年龄歧视
  14. BeanUtils.populate()封装bean属性为null的四种失效原因
  15. linux 下打开png文件,png文件扩展名,png文件怎么打开?
  16. 收藏史上最私募基金投资模式及策略
  17. 清华大学地学系全球超分3弧秒海陆DEM数据下载
  18. 提升网站访问速度--Yslow优化
  19. 分享未注册淘宝热卖域名
  20. nginx动静分离实例

热门文章

  1. MYSQL学习笔记(自用)第三章
  2. OpenMAX编程初识
  3. 2017_10_16-compile_gcc_from_source
  4. 副业收入是我做程序员的2倍!副业这么有 “钱”景,我要考虑转行吗?
  5. Anaconda安装caffe(超简单)
  6. 奥的斯 蓝牙模块 全套制作资料
  7. 2.6.18-2内核中对S3C2440的引导启动分析
  8. Android开发学习——3.平台版本、SDK版本、API级别
  9. 关于 wkhtmltopdf:html 转 pdf 的命令行工具
  10. 检验真爱粉!豆瓣入局内容付费市场,北岛诗歌课卖128元