Java之Csv转 Xlsx工具类
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工具类相关推荐
- 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 ...
- (转)JAVA 十六个常用工具类
(转)JAVA 十六个常用工具类 一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流.socket.或者selector且不抛出异常.通常放在f ...
- JAVA实现 PDF转换 常用工具类(html转PDF、PDF添加页码、PDF文件下载、PDF添加印章或者水印)
JAVA实现 PDF转换 常用工具类(html转PDF.PDF添加页码.PDF文件下载.PDF添加印章或者水印)可直接使用 package com.bestvike.util; import com. ...
- JAVA 文件上传下载工具类
JAVA 文件上传下载工具类 import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org. ...
- java inputtools_Java后台开发常用工具类
本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数据库连接.格式转换.文件操作.发送邮件等等.提高开发效率,欢迎收藏与转载. 数据库连接工具类 数据库连接工具类--仅仅获得连接对象 ...
- java中定义一个CloneUtil 工具类
其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...
- 【java笔记】Collections集合工具类
java.utils.Collections是集合工具类,用来对集合进行操作 常用方法: public static<T>boolean addAll(Collection<T> ...
- Java(35):Java Base64编码和解码工具类
Java Base64编码和解码工具类 Base64Util工具类: package com.ciphergateway.utils; import java.io.UnsupportedEncodi ...
- java常用地图坐标系转换工具类,支持谷歌,腾讯,百度等主流的地理坐标转换
package com.shen.springboot.redis.util;import java.util.ArrayList; import java.util.HashMap; import ...
最新文章
- AngularJS:为什么ng-bind在角度上优于{{}}?
- mxnet输出训练loss
- hibernate02环境的搭建
- CnCommon 的一些通用函数说明
- 多久没有给家里打过电话了?
- Linux内存管理slub分配器
- 创意三维c4d形式设计节气海报学习案例
- [导入]C++ OpenGL底层和C# GUI无缝联合!
- Swift 团队开源 Collections,提供更多高效数据结构
- 知识问答题小程序头脑王者源码
- mysql查询语句创建临时表_MySQL 临时表_mysql临时表创建_mysql临时表创建
- 读“人生有一种牛逼,叫我能背下来”
- 赔 1100 万美元!谷歌招聘年龄歧视
- BeanUtils.populate()封装bean属性为null的四种失效原因
- linux 下打开png文件,png文件扩展名,png文件怎么打开?
- 收藏史上最私募基金投资模式及策略
- 清华大学地学系全球超分3弧秒海陆DEM数据下载
- 提升网站访问速度--Yslow优化
- 分享未注册淘宝热卖域名
- nginx动静分离实例
热门文章
- MYSQL学习笔记(自用)第三章
- OpenMAX编程初识
- 2017_10_16-compile_gcc_from_source
- 副业收入是我做程序员的2倍!副业这么有 “钱”景,我要考虑转行吗?
- Anaconda安装caffe(超简单)
- 奥的斯 蓝牙模块 全套制作资料
- 2.6.18-2内核中对S3C2440的引导启动分析
- Android开发学习——3.平台版本、SDK版本、API级别
- 关于 wkhtmltopdf:html 转 pdf 的命令行工具
- 检验真爱粉!豆瓣入局内容付费市场,北岛诗歌课卖128元