本项目采用maven工程,使用poi技术去读取excel表格。
所需jar包为:

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.0.0</version>
</dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version>
</dependency>

下面是读写excel的工具类,可读写 .xls.xlsx

工具类:

package com.jiangqi.util;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class ExcelUtil {private static final Logger logger = LoggerFactory.getLogger(ExcelUtil.class);private static final String XLS = ".xls";private static final String XLSX = ".xlsx";/*** 根据文件后缀获取对应Workbook对象** @param filePath* @param fileType* @return*/public static Workbook getWorkbook(String filePath, String fileType) {Workbook workbook = null;FileInputStream fileInputStream = null;try {File excelFile = new File(filePath);if (!excelFile.exists()) {logger.info(filePath + "文件不存在");return null;}fileInputStream = new FileInputStream(excelFile);if (fileType.equalsIgnoreCase(XLS)) {workbook = new HSSFWorkbook(fileInputStream);} else if (fileType.equalsIgnoreCase(XLSX)) {workbook = new XSSFWorkbook(fileInputStream);}} catch (Exception e) {logger.error("获取文件失败", e);} finally {try {if (null != fileInputStream) {fileInputStream.close();}} catch (Exception e) {logger.error("关闭数据流出错!错误信息:", e);return null;}}return workbook;}public static List<Object> readFolder(String filePath) {int fileNum = 0;File file = new File(filePath);List<Object> returnList = new ArrayList<>();List<Map<String, String>> resultList = new ArrayList<>();if (file.exists()) {File[] files = file.listFiles();for (File file2 : files) {if (file2.isFile()) {resultList = readExcel(file2.getAbsolutePath());returnList.add(resultList);fileNum++;}}} else {logger.info("文件夹不存在");return null;}logger.info("共有文件:" + fileNum);return returnList;}/*** 读取Excel中文件的特定的表,返回数据对象** @param filePath  文件路径* @param sheetName 表格名字(索引)* @return*/public static List<Map<String, String>> readExcel(String filePath, String sheetName) {Workbook workbook = null;List<Map<String, String>> resultList = new ArrayList<>();try {String fileType = filePath.substring(filePath.lastIndexOf("."));workbook = getWorkbook(filePath, fileType);if (workbook == null) {logger.info("获取workbook对象失败");return null;}resultList = analysisExcel(workbook, sheetName);return resultList;} catch (Exception e) {logger.error("读取Excel文件失败" + filePath + "错误信息", e);return null;} finally {try {if (null != workbook) {workbook.close();}} catch (Exception e) {logger.error("关闭数据流出错!错误信息:", e);return null;}}}/*** 批量读取Excel中的文件所有的表,返回数据对象** @param filePath 文件路径* @return*/public static List<Map<String, String>> readExcel(String filePath) {Workbook workbook = null;List<Map<String, String>> resultList = new ArrayList<>();try {String fileType = filePath.substring(filePath.lastIndexOf("."));workbook = getWorkbook(filePath, fileType);if (workbook == null) {logger.info("获取workbook对象失败");return null;}resultList = analysisExcel(workbook);return resultList;} catch (Exception e) {logger.error("读取Excel文件失败" + filePath + "错误信息", e);return null;} finally {try {if (null != workbook) {workbook.close();}} catch (Exception e) {logger.error("关闭数据流出错!错误信息:", e);return null;}}}/*** 解析Excel文件中特定的表,返回数据对象** @param workbook  生成对应的excel处理* @param sheetName 表格名字(索引)* @return*/public static List<Map<String, String>> analysisExcel(Workbook workbook, String sheetName) {List<Map<String, String>> dataList = new ArrayList<>();int sheetCount = workbook.getNumberOfSheets();//或取一个Excel中sheet数量for (int i = 0; i < sheetCount; i++) {if (!sheetName.equals(workbook.getSheetName(i))) {continue;}Sheet sheet = workbook.getSheet(sheetName);int firstRowCount = sheet.getFirstRowNum();//获取第一行的序号Row firstRow = sheet.getRow(firstRowCount);int cellCount = firstRow.getLastCellNum();//获取列数List<String> mapKey = new ArrayList<>();//获取表头信息,放在List中备用if (firstRow == null) {logger.info("解析Excel失败,在第一行没有读取到任何数据!");} else {for (int i1 = 0; i1 < cellCount; i1++) {mapKey.add(firstRow.getCell(i1).toString());}}//解析每一行数据,构成数据对象int rowStart = firstRowCount + 1;int rowEnd = sheet.getPhysicalNumberOfRows();for (int j = rowStart; j < rowEnd; j++) {Row row = sheet.getRow(j);//获取对应的row对象if (row == null) {continue;}Map<String, String> dataMap = new HashMap<>();//将每一行数据转化为一个Map对象dataMap = convertRowToData(row, cellCount, mapKey);dataList.add(dataMap);}}return dataList;}/*** 解析Excel文件中所有的表,返回数据对象** @param workbook* @return*/public static List<Map<String, String>> analysisExcel(Workbook workbook) {List<Map<String, String>> dataList = new ArrayList<>();int sheetCount = workbook.getNumberOfSheets();//或取一个Excel中sheet数量for (int i = 0; i < sheetCount; i++) {Sheet sheet = workbook.getSheetAt(i);if (sheet == null) {continue;}int firstRowCount = sheet.getFirstRowNum();//获取第一行的序号Row firstRow = sheet.getRow(firstRowCount);int cellCount = firstRow.getLastCellNum();//获取列数List<String> mapKey = new ArrayList<>();//获取表头信息,放在List中备用if (firstRow == null) {logger.info("解析Excel失败,在第一行没有读取到任何数据!");} else {for (int i1 = 0; i1 < cellCount; i1++) {mapKey.add(firstRow.getCell(i1).toString());}}//解析每一行数据,构成数据对象int rowStart = firstRowCount + 1;int rowEnd = sheet.getPhysicalNumberOfRows();for (int j = rowStart; j < rowEnd; j++) {Row row = sheet.getRow(j);//获取对应的row对象if (row == null) {continue;}Map<String, String> dataMap = new HashMap<>();//将每一行数据转化为一个Map对象dataMap = convertRowToData(row, cellCount, mapKey);dataList.add(dataMap);}}return dataList;}/*** 将每一行数据转化为一个Map对象** @param row       行对象* @param cellCount 列数* @param mapKey    表头Map* @return*/public static Map<String, String> convertRowToData(Row row, int cellCount, List<String> mapKey) {if (mapKey == null) {logger.info("没有表头信息");return null;}Map<String, String> resultMap = new HashMap<>();Cell cell = null;for (int i = 0; i < cellCount; i++) {cell = row.getCell(i);if (cell == null) {resultMap.put(mapKey.get(i), "");} else {resultMap.put(mapKey.get(i), getCellVal(cell));}}return resultMap;}/*** 获取单元格的值** @param cel* @return*/public static String getCellVal(Cell cel) {if (cel.getCellType() == CellType.STRING) {return cel.getRichStringCellValue().getString();}if (cel.getCellType() == CellType.NUMERIC) {return cel.getNumericCellValue() + "";}if (cel.getCellType() == CellType.BOOLEAN) {return cel.getBooleanCellValue() + "";}if (cel.getCellType() == CellType.FORMULA) {return cel.getCellFormula() + "";}return cel.toString();}/*** 读取Excel中文件的特定的表,返回String数据(不区分列的情况或者单列的情况)** @param filePath  文件路径* @param sheetName 表格名字(索引)* @return*/public static List<String> readExcelString(String filePath, String sheetName) {Workbook workbook = null;List<String> resultList = new ArrayList<>();try {String fileType = filePath.substring(filePath.lastIndexOf("."));workbook = getWorkbook(filePath, fileType);if (workbook == null) {logger.info("获取workbook对象失败");return null;}resultList = analysisExcelString(workbook, sheetName);return resultList;} catch (Exception e) {logger.error("读取Excel文件失败" + filePath + "错误信息", e);return null;} finally {try {if (null != workbook) {workbook.close();}} catch (Exception e) {logger.error("关闭数据流出错!错误信息:", e);return null;}}}/*** 解析Excel文件中特定的表,返回String数据(不区分列的情况或者单列的情况)* @param workbook* @param sheetName* @return*/public static List<String> analysisExcelString(Workbook workbook, String sheetName) {List<String> resultList = new ArrayList<>();//获取的结果Sheet sheet = workbook.getSheet(sheetName);//获取的表int firstRowCount = sheet.getFirstRowNum();//获取第一行的序号Row firstRow = sheet.getRow(firstRowCount);int cellCount = firstRow.getLastCellNum();//获取列数//解析每一行数据,构成数据对象int rowStart = firstRowCount + 1;int rowEnd = sheet.getPhysicalNumberOfRows();for (int j = rowStart; j < rowEnd; j++) {Row row = sheet.getRow(j);//获取对应的row对象if (row == null) {continue;}Cell cell = null;for (int i = 0; i < cellCount; i++) {cell = row.getCell(i);if (cell == null) {} else {resultList.add(getCellVal(cell));}}}return resultList;}/*** 创建新excel** @param filePath  excel的路径* @param sheetName 表格名字(索引)* @param titleRow  excel的第一行即表格头*/public static Boolean createExcel(String filePath, String sheetName, String titleRow[]) {String fileType = filePath.substring(filePath.lastIndexOf("."));Workbook workbook = getWorkbook(filePath, fileType);if (workbook == null) {logger.info("获取workbook对象失败");return false;}//创建工作表Sheet sheet = workbook.createSheet(sheetName);System.out.println(sheet.getSheetName());//创建第一行,也就是表头Row row = sheet.createRow(0);Cell cell = null;for (int i = 0; i < titleRow.length; i++) {cell = row.createCell(i);cell.setCellValue(titleRow[i]);}//新建文件try (FileOutputStream fileOutputStream = new FileOutputStream(filePath)) {workbook.write(fileOutputStream);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return true;}/*** 往excel中写入(已存在的数据无法写入).** @param filePath  文件路径* @param sheetName 表格名字(索引)* @param mapList   写入的数据*/public static void writeToExcel(String filePath, String sheetName, List<Map<String, String>> mapList) {Workbook workbook = null;String fileType = filePath.substring(filePath.lastIndexOf("."));workbook = getWorkbook(filePath, fileType);if (workbook == null) {logger.info("获取workbook对象失败");return;}
//        FileOutputStream fileOutputStream = null;//获取要写的工作表Sheet sheet = workbook.getSheet(sheetName);System.out.println("工作表:"+sheet);// 获得表头行对象Row titleRow = sheet.getRow(0);if (titleRow != null) {//获取表头的列数int columnCount = titleRow.getLastCellNum();//添加数据for (int rowId = 0; rowId < mapList.size(); rowId++) {// 创建一行:从第二行开始,跳过属性列Row row = sheet.createRow(rowId + 1);Map<String, String> map = mapList.get(rowId);System.out.println("传进去的值:"+map);//下面需要修改 列String a= map.get(titleRow.getCell(0).toString()); //获取列的数据String b= map.get(titleRow.getCell(1).toString());for (int colId = 0; colId < columnCount; colId++) {// 在一行内循环Cell first = row.createCell(0);//第一列first.setCellValue(a);Cell second = row.createCell(1);//第二列second.setCellValue(b);}}}//文件流try (FileOutputStream fileOutputStream = new FileOutputStream(filePath)) {workbook.write(fileOutputStream);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {//        //读取文件夹,批量解析Excel文件
//        System.out.println("--------------------读取文件夹,批量解析Excel文件-----------------------");
//        List<Object> returnList = readFolder("C:\\Users\\Administrator\\Desktop\\ExcelTest");
//        for (int i = 0; i < returnList.size(); i++) {//            List<Map<String, String>> maps = (List<Map<String, String>>) returnList.get(i);
//            for (int j = 0; j < maps.size(); j++) {//                System.out.println(maps.get(j).toString());
//            }
//            System.out.println("--------------------手打List切割线-----------------------");
//        }//读取单个文件System.out.println("--------------------读取并解析单个文件-----------------------");List<Map<String, String>> maps = readExcel("src/main/resources/assets/carMappers.xlsx");for (int j = 0; j < maps.size(); j++) {System.out.println(maps.get(j).toString());}}
}

结果截图:

注意:在写入excel的方法中,因技术有限,无法实现自动往列里添加数据,故需要根据实际的表去修改所要添加的列,若有大神知道,还望评论告知,谢谢

java读写Excel工具类相关推荐

  1. Java导入Excel工具类使用教程

    前言: 本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖org.apache.poi包.支持RESTful API,支持Spring ...

  2. 读写Excel工具类ExcelUtil

    突然要用到Excel的读写操作,自己写太过麻烦,在网上找了好久找到个还不错的工具类,怕自己忘掉,分享出来,也留个记录,以后可以直接拿来用. 这个工具类分三个部分: ExcelUtil.java  // ...

  3. Java解析Excel工具类(兼容xls和xlsx)

    依赖jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml< ...

  4. java 导入excel工具类_java Excel工具类,导入导出Excel数据

    java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据: 导出数据到Excel,Excel文件不存在会创建. 使用的是poi处理,兼容Excel. 对反射不够理解,目前先 ...

  5. Java操作Excel工具类

    Excel工具类 要说的话 长期作为一个c/v工程师,搞了很久但是感觉还是比较空虚,正好最近又在弄Excel相关的东西,然后就基于POI封装了一个比较简单易用的工具类.在这之前,本人水平一般般,还希望 ...

  6. 【工具篇】java导出excel工具类,多种模式自动配置,绝对值得你收藏

    文章目录 项目环境: 实现功能: 工具类实现 定义参数bean:ExportExcelBean.java 定义导出excel的表格主题:ExportExcelTheme.java [重点]导出exce ...

  7. Java 读写文件工具类

    今天简单写了一下读写文件用的工具类,方便后面开发或者测试时直接使用. import lombok.Cleanup; import java.io.*; import java.util.ArrayLi ...

  8. java 导出excel工具类

    Excel相关处理,导出调用exportExcel(response, list, "用户数据"); import java.io.File; import java.io.Fil ...

  9. 【工具篇】java导入excel工具类,简单通用,绝对值得你收藏

    定义导入的excel模板 定义需要导入的EXCEL模板,EXCEL格式变更,只需要变更对应的枚举信息就可以,如果定义多个EXCEL模板, 只要定义多个枚举就行 package org.util.exc ...

最新文章

  1. python读取大文件-强悍的Python读取大文件的解决方案
  2. nginx 重写 隐藏index.php
  3. MATLAB中的ind2vec和vec2ind函数
  4. 深圳30周年看×××之旅
  5. php如何打开数据库,php数据库怎么打开
  6. SAP Spartacus的发布方式以及语义化版本管理机制
  7. 【活动】AI人工智能技术沙龙 |杭州站
  8. How to write a custom control with NSControl ...
  9. canvas 绘制圆形进度条
  10. mysql bean分页查询_javabean 来实现 MySQL 的分页
  11. 理想更新“货车并线预警”遭用户吐槽 李想:仍在优化
  12. Python爬虫--51job爬取岗位信息并写入txt文件
  13. javascript之函数使用
  14. 【JAVA】java代码实现print2Flash转swf文件,百度文库一样。
  15. Unity UGUI源码解析
  16. matlab a1处语法无效,MATLAB常见错误
  17. E企云企业邮箱,选了不后悔
  18. 《根道果:禅修的方法与次第》读后感
  19. 关于DBF文件格式的详细说明
  20. 机器学习项目实战——集成预测政治献金

热门文章

  1. linux升级gcc没成功,gcc升级到4.5.2,到make操作时,失败了
  2. 2022-9-18 simple class management system
  3. 嵌入式LinuxC--指针与数组
  4. python爬虫40个项目_python三个爬虫项目代码实例
  5. 试试kaggle竞赛:辨别猫狗
  6. java 神剑_java语音短信的实现
  7. 7-7 稳赢 (15 分)
  8. 【计算机网络相关】内网穿透介绍
  9. 卡罗拉 (COROLLA) - 开启引擎盖
  10. 深入理解Linux操作系统守护进程的意义