微信搜索:“二十同学” 公众号,欢迎关注一条不一样的成长之路

Java对csv文件和xlsx文件进行读写的工具类,简单易用,代码如下:

需要引用的依赖

                <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.49</version></dependency><dependency><groupId>net.sourceforge.javacsv</groupId><artifactId>javacsv</artifactId><version>2.0</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.15</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><!--读取大批数据--><dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.11.0</version></dependency>

工具类:

package com.example.demo;import com.alibaba.fastjson.JSON;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.Charset;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;public class FileUtils {private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);//2003- 版本的excelprivate final static String excel2003L ="xls";//2007+ 版本的excelprivate final static String excel2007U ="xlsx";private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");public void writeCSV(String csvFilePath, List<KeyLabel> exportKeys, List<Map<String, String>> dataList) {try {// 创建CSV写对象 例如:CsvWriter(文件路径,分隔符,编码格式);CsvWriter csvWriter = new CsvWriter(csvFilePath, ',', Charset.forName("Utf-8"));// 写内容String[] headers = exportKeys.stream().map(a -> a.getLabel()).collect(Collectors.toList()).toArray(new String[exportKeys.size()]);String[] keys = exportKeys.stream().map(a -> a.getKey()).collect(Collectors.toList()).toArray(new String[exportKeys.size()]);csvWriter.writeRecord(headers);for (Map<String, String> map : dataList) {String[] writeLine = new String[keys.length];for (int j = 0; j < keys.length; j++) {if ("updateTime".equals(keys[j])) {if (map.get(keys[j]) == null || "".equals(map.get(keys[j]))) {writeLine[j] = "";} else {SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);Date date = sdf.parse(String.valueOf(map.get(keys[j])));writeLine[j] = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);}} else {writeLine[j] = map.get(keys[j]);}}csvWriter.writeRecord(writeLine);}csvWriter.close();} catch (IOException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();}}public List<Map> readCSV(String filePath) {List<Map> resultInfo = new ArrayList<>();try {// 创建CSV读对象CsvReader csvReader = new CsvReader(filePath, ',', Charset.forName("Utf-8"));// 读表头csvReader.readHeaders();// 获取表头String[] headers = csvReader.getHeaders();String[] fields = csvReader.getHeaders();StringBuilder sb = new StringBuilder();sb.append("[");while (csvReader.readRecord()) {sb.append("{");for (int i = 0; i < fields.length; i++) {sb.append("\"").append(fields[i]).append("\":\"").append(csvReader.get(headers[i])).append("\"");if (i < fields.length - 1) {sb.append(",");}}sb.append("},");}if (sb.lastIndexOf(",") > 0) {sb.deleteCharAt(sb.lastIndexOf(",")).append("]");}resultInfo = JSON.parseArray(sb.toString(), Map.class);} catch (IOException e) {e.printStackTrace();}return resultInfo;}/*** 生成excel文件* @param fileFullName 保存文件的地址(eg C:\xsls\abc.xls)* @param titles 文件头* @param values 需要写入的数据 Map<rowNo, <colNo, String>>* @return* @throws IOException*/public void saveExcel(String fileFullName, List<String> titles, Map<Integer, Map<Integer, String>> values) throws IOException {Workbook workbook = generateWorkbook(StringUtils.getFilenameExtension(fileFullName), titles, values);File file = new File(fileFullName);if (!file.exists()){file.createNewFile();}FileOutputStream fileOutputStream = new FileOutputStream(file);workbook.write(fileOutputStream);fileOutputStream.flush();}/*** 指定header名和map格式数据,生成Workbook* @param fileExtension* @param titles* @param values* @return* @throws IOException*/public static Workbook generateWorkbook(String fileExtension, List<String> titles, Map<Integer, Map<Integer, String>> values) throws IOException {Workbook  workbook = createWorkBook(fileExtension);// 生成一个sheet表格Sheet sheet = workbook.createSheet();// 设置表格默认列宽度为15个字节sheet.setDefaultColumnWidth((short) 15);// 创建标题行Row row = sheet.createRow(0);for (int i = 0; i < titles.size(); i++) {row.createCell(i).setCellValue(titles.get(i));}//标题行数int headRow = 1;//写入正文for (Integer key : values.keySet()) {row = sheet.createRow(headRow + key);Map<Integer, String> keySet = values.get(key);for (int j = 0; j < keySet.size(); j++) {Cell cell = row.createCell(j);cell.setCellValue(keySet.get(j));}}return workbook;}/*** 读取Excel为Json字符串,客户端反序列化即可得到List* @param inputStream* @param filenameExtension* @param headerMapper 【列序号】和【Json的Key名】组成Key-Value* @return* @throws Exception*/public static String getJson(InputStream inputStream, String filenameExtension, Map<Integer, String> headerMapper) throws Exception {Workbook wb = createWorkBook(filenameExtension ,inputStream);Sheet sheetAt = wb.getSheetAt(0);int lastRowNum = sheetAt.getLastRowNum();StringBuilder sb = new StringBuilder();sb.append("[");for (int i = 0; i <= lastRowNum; i++) {Row row = sheetAt.getRow(i);if (i == 0) {continue;}sb.append("{");int physicalNumberOfCells = row.getPhysicalNumberOfCells();for (int j = 0; j < physicalNumberOfCells; j++) {Object value = getCellValue(row.getCell(j));sb.append("\"").append(headerMapper.get(j)).append("\":\"").append(value).append("\"");if (j < physicalNumberOfCells - 1) {sb.append(",");}}sb.append("}");if (i < lastRowNum) {sb.append(",");}}sb.append("]");return sb.toString();}/*** 根据inputStream创建一个Workbook* 10W一下读取* @param fileType* @param inputStream* @return* @throws Exception*/private static Workbook createWorkBook(String fileType, InputStream inputStream) throws Exception {Workbook wb;if (excel2003L.equals(fileType)) {//2003-wb = new HSSFWorkbook(inputStream);} else if (excel2007U.equals(fileType)) {//2007+wb = new XSSFWorkbook(inputStream);} else {throw new Exception("解析的文件格式有误!");}return wb;}/*** 创建一个Workbook* @param fileType* @return* @throws Exception*/private static Workbook createWorkBook(String fileType) throws IOException {Workbook wb;if (excel2003L.equals(fileType)) {//2003-wb = new HSSFWorkbook();} else if (excel2007U.equals(fileType)) {//2007+  内存留存数据wb = new SXSSFWorkbook(10000);} else {throw new IOException("解析的文件格式有误!");}return wb;}/*** 读取Excel,返回Map* @param inputStream* @param filenameExtension* @param columnNos* @return* @throws Exception*/public Map<Integer,Map<Integer,Object>> getMapFromWorkBook(InputStream inputStream, String filenameExtension, List<Integer> columnNos) throws Exception {//Map<rowNo, Map<columnNo, columnValue>>Map<Integer, Map<Integer, Object>> sheetMap = new HashMap<>();Workbook wb = createWorkBook(filenameExtension ,inputStream);Sheet sheetAt = wb.getSheetAt(0);int lastRowNum = sheetAt.getLastRowNum();for (int i = 0; i <= lastRowNum; i++) {Row row = sheetAt.getRow(i);if(i == 0) {//skip headercontinue;}Map<Integer, Object> columnValMap = new HashMap<>();//按列展开for (Integer index : columnNos) {Object value = getCellValue(row.getCell(index));columnValMap.put(index, value);}sheetMap.put(i,columnValMap);}return sheetMap;}/*** 获取cell值* @param cell* @return*/public static Object getCellValue(Cell cell) {Object value = "";if (cell != null){switch (cell.getCellType()) {case Cell.CELL_TYPE_BLANK:value = "";break;case Cell.CELL_TYPE_BOOLEAN:value = cell.getBooleanCellValue();break;case Cell.CELL_TYPE_ERROR:case Cell.CELL_TYPE_FORMULA:break;case Cell.CELL_TYPE_NUMERIC:if (HSSFDateUtil.isCellDateFormatted(cell)) {value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));break;} else {value = new DecimalFormat("0").format(cell.getNumericCellValue());}break;case Cell.CELL_TYPE_STRING:value = cell.getStringCellValue();break;}}return value;}/*** 文本写入txt* @param file* @param infos*/public void writeTxt(File file,List<String> infos){try {FileOutputStream fos = new FileOutputStream(file);OutputStreamWriter osw=new OutputStreamWriter(fos, "UTF-8");BufferedWriter  bw=new BufferedWriter(osw);for (String info:infos){bw.write(info+"\t\n");}bw.close();osw.close();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public HttpServletResponse downloadFile(File file, HttpServletResponse response) {if (file.exists() == false) {logger.info("待下载的文件:" + file + "不存在.");} else {try {// 以流的形式下载文件。InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();// 清空responseresponse.reset();OutputStream toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");// 如果输出的是中文名的文件,在此处就要用URLEncoder.encode方法进行处理response.setHeader("Content-Disposition","attachment;filename=" + new String(file.getName().getBytes("GB2312"), "ISO8859-1"));toClient.write(buffer);toClient.flush();toClient.close();} catch (Exception ex) {ex.printStackTrace();} finally {try {File f = new File(file.getPath());f.delete();} catch (Exception e) {e.printStackTrace();}}}return response;}/*** 对字符串里的中文符号转换为英文括号* @param msg* @return*/public String converBracket(String msg){if (msg != null || !"".equals(msg)){msg = msg.replaceAll("(", "(").replaceAll(")", ")");}return msg;}}
package com.example.demo;public class KeyLabel {//字段private String key;//字段名private String label;public String getKey() {return key;}public void setKey(String key) {this.key = key;}public String getLabel() {return label;}public void setLabel(String label) {this.label = label;}}

读写csv,xlsx文件的工具类相关推荐

  1. 基于POI的读写Excel文件的工具类

    依赖的jar包: import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStrea ...

  2. Java代码实现解压文件包和压缩文件的工具类

    最近开发任务比较多,这两天陆陆续续整理了一点资料上传一下,这个是前段时间用到的解压和压缩文件的工具类,网上找了一些,自己补充一下,现在先分享一下,希望对各位同学有所帮助! package com.as ...

  3. 小米开源文件管理器MiCodeFileExplorer-源码研究(8)-文件排序工具类FileSortHelper

    FileSortHelper的核心功能就是,对文件集合FileInfo排序. FileInfo有若干字段,根据字段定义了4种比较器Comparator. 调用示例:Collections.sort(L ...

  4. Python写入文件的工具类

    主要分享一个写入文件的工具类,便于在开发中经常调试写入文件的情况 Python中删除文件时使用:os.remove("文件路径"),下面的工具类已经包含了这个功能 示例代码 # - ...

  5. java url类下载_Java根据url下载图片或文件的工具类-Fun言

    package cn.funyan.utils; import java.io.FileOutputStream; import java.io.IOException; import java.io ...

  6. Easy Data Transform for mac (Excel和CSV编程文件转换工具) v1.11.1激活版

    Easy Data Transform mac版是一款很优秀好用的Excel和CSV编程文件转换工具.Easy Data Transform功能强大,操作简单,使用后可以帮助用户更轻松便捷的转换表格文 ...

  7. pandas 小技巧——读取无表头的csv/xlsx文件加上指定表头

    在读取csv/xlsx文件的时候,有的文件可能没有表头,或者想更换表头,可以用pandas实现. 1.excel文件格式示例: 无表头: import pandas as pd df = pd.rea ...

  8. java文件读写的基本类_java常用工具类(三)—— 文件读取的操作类

    定义常用的文件类型 public class FileType { /** * 文件头类型 */ public static final String XML_FILE = "text/xm ...

  9. Python读写CSV格式文件

    CSV(Comma Separated Values)格式的文件常用于电子表格和数据库中内容的导入和导出.Python标准库csv提供的reader.writer对象和DictReader和DictW ...

最新文章

  1. 多帧点云拼接的全局ICP算法【附Matlab代码链接】
  2. 小强学渲染之OpenGL渲染管线详析
  3. cmake-gui出错解决方法
  4. skywalking(2)
  5. python列表相加的方法:两个list [] 加法
  6. springMVC从发送hello请求到响应的执行流程分析
  7. aspen二元体系共沸组分_应用Aspen Plus分离共沸物
  8. 樊登高效休息法心得400字_超级干货!让你快速恢复精力的高效休息法!!
  9. 电驴v1.2.2.45574最新版官方下载
  10. python列表修改元素_python修改list中所有元素类型的三种方法
  11. 图书信息管理系统的设计与实现
  12. 全球十大交易系统(Futures Truth Magazine评选)及各交易系统详解
  13. 我为什么要写微信公众号
  14. 芯动科技2023校招 FPGA岗位笔试
  15. 这三个文件在 C:\Program Files (x86)\Microsoft Office\root\Office16 下怎么会是符号链接?
  16. Paper:自动驾驶领域SAE标准之《道路机动车辆驾驶自动化系统相关术语的分类和定义》官方英文原文翻译与解读(二)
  17. 诚之和:举行虚拟婚礼、养独角兽、在月球上漫步 我们在元宇宙中能实现这些梦想
  18. 华为云 对象存储服务 OBS 上传文件 上传图片 PHP Laravel
  19. 求n阶矩阵的逆矩阵(C语言实现)
  20. 链上天眼Pro2.0正式上线

热门文章

  1. Inventory 物料库存 mtl_transactions_interface 开发[转]
  2. 二维数组解引用解释——指针
  3. Python中os.listdir的排序问题
  4. JAVA商城源码-B2B2C商城系统-独立部署,一套源码终身可用
  5. 冒泡排序的实现(Java)
  6. python 字典的学习
  7. 获诱人的实习offer、在Kaggle推AI大赛,大二学生如何做到?
  8. 高通CameraSenorBringup
  9. 如何搭建一个超级好用的JavaWeb框架?
  10. PPT之幻灯片中的大纲选项卡