前段时间帮朋友弄一个对excel文件操作的方法,大功告成后特此分享出来,以便后面用到后可以直接CTRL+C&CTRL+V。

这里一是读取excel表格中的数据(包含表格中的公式及各种复杂数据类型),二是修改excel表格中某一个单元格中的数据(并且保证修改后表格中的公式计算得到的数能够实时刷新)。

其实像这种工具类网上搜一下全是,但是大部分都是非常混乱的有头没尾的对自己的业务无法应用的或者根本就是看不懂,下面这些方法是我结合网上某些例子及参考其他资料整理出的一款非常使用且简单易懂的excel工具类,欢迎欣赏和借鉴。

废话不多话直接上代码。

注:以下通过Java对excel操作采用的是apache下的poi来完成。

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17-beta1</version>
</dependency>

根据不同的excel表格类型创建对应的工作簿Workbook:

/*** 根据文件格式创建Workbook* @param filePath* @return*/
private static Workbook createWorkbook(String filePath) {​//文件后缀名String extString = filePath.substring(filePath.lastIndexOf("."));    try {InputStream is = new FileInputStream(filePath);//如果文件后缀名为xlsif (".xls".equals(extString)) {this.wb = new HSSFWorkbook(is);}//如果文件后缀名为xlsxelse if (".xlsx".equals(extString)) {this.wb = new XSSFWorkbook(is);} else {this.wb = null;}}catch (Exception e) {e.printStackTrace();}return wb;
}

解析单元格中的数据:

/*** 解析单元格中的内容* @param cell 单元格* @return 单元格中的数据*/
private static Object getCellFormatValue(Cell cell){Object cellValue = null;if(cell!=null){if (0 == cell.getCellType()) {//判断cell是否为日期格式if(DateUtil.isCellDateFormatted(cell)){cellValue = cell.getDateCellValue();}else {//处理整型cellValue = cell.getNumericCellValue();//百分比数值String showValue= CellFormat.getInstance(cell.getCellStyle().getDataFormatString()).apply(cell).text;if (showValue.indexOf("%") != -1) {cellValue = showValue;}}}else if(1 == cell.getCellType()){//字符串类型cellValue = cell.getRichStringCellValue().getString();}else  if(2 == cell.getCellType()) {//表达式cellValue = CellFormat.getInstance(cell.getCellStyle().getDataFormatString()).apply(cell).text;}else if (4 == cell.getCellType()) {//boolean类型cellValue = cell.getBooleanCellValue();}}return cellValue;
}

读取excel表格中的数据:

public static List<Map<Object,Object>> readExcelData(File file) {​//用来存放表中数据List<Map<Object,Object>> mapList = null;Workbook wb =null;
​String filePath = "E:\\电价简化.xlsx";
​//创建Workbook对象wb = createWorkbook(filePath,wb);
​//如果文件不为空if(wb != null){mapList = new ArrayList<>();//获取第一个sheetSheet sheet = wb.getSheetAt(0);//获取最大行数int rownum = sheet.getPhysicalNumberOfRows();//获取第一行Row row = sheet.getRow(0);//获取最大列数int colnum = row.getPhysicalNumberOfCells();
​//循环行Object cellData = null;Map<Object,Object> data = null;for (int i = 0; i< rownum; i++) {//从第一行开始,获取每一行的数据row = sheet.getRow(i);if(row !=null){data = new LinkedHashMap<>();//循环列,拿到这一行中每一列的内容for (int j=0;j<colnum;j++){//获取对应行的列的内容cellData = getCellFormatValue(row.getCell(j));//将这一列的名称作为key,内容作为value,放到map中data.put((i+1)+"行"+(j+1)+"列",cellData);}mapList.add(data);}else{break;}}}return mapList;}

这样就可以完成对规范的excel表格读取数据了,但是有些时候业务中使用的excel表格比较复杂就可以直接在这个方法上做出相应的改进以完成对自己的业务应用。

修改excel单元格中的内容:

public static void updateCell() {Workbook wb =null;
​String filePath = "E:\\电价简化.xlsx";
​//创建Workbook对象wb = createWorkbook(filePath,wb);
​//如果文件不为空if(wb != null){Sheet sheetAt = wb.getSheetAt(0);//修改第8行第7列单元格中的内容Row row = sheetAt.getRow(7);Cell cell = row.getCell(6);cell.setCellValue(0.2);//修改后让表格中所有公式重新计算wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
​try {FileOutputStream fileOutputStream = new FileOutputStream(new File(filePath));wb.write(fileOutputStream);fileOutputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

附:poi中单元格中的数据类型对应关系

别走,还有彩蛋…

内存泄漏(Memory Leak):一个对象所要做的事情做完了,正常的话这个对象是要被回收掉,但是如果还有对这个对象的其他引用,那么它是不会被回收的,还会继续占用内存。这样持续累加内存很快就会被耗尽。
内存溢出(out of Memory):是指程序在申请内存时,没有足够的内存供申请者使用。

内存泄漏:就好比是租了个带钥匙的柜子,存完东西把柜子锁上之后,钥匙丢了或者找不到了,那么这个柜子就无法再继续给下个人使用。
内存溢出:就好比是柜子少使用的人多,柜子都被占用了没有多余的柜子(可能是有效占用也可能是内存泄漏那样非法占用,反正就是没有柜子了)。


公众号:沉默木头人

CSDN:沉默木头人(ID:qq_44322555)

喜欢感兴趣长按下面二维码关注吧!

原创不易,不喜勿喷,如果能够帮助到你或对你有所启发欢迎下方留言。

喜欢就开始你无情的三连击:点赞、分享、关注。这将是我写作更多有趣有益有知的好文章的动力;

这么优秀的Excel工具类,你难道不用?相关推荐

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

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

  2. java获取excle表格对象_Java使用excel工具类导出对象功能示例

    本文实例讲述了Java使用excel工具类导出对象功能.分享给大家供大家参考,具体如下: package com.gcloud.common; import org.apache.poi.ss.use ...

  3. 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 ...

  4. Java导入导出Excel工具类ExcelUtil

    前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hiberna ...

  5. Python Excel工具类封装, 实现excel表头加颜色

    封装Excel工具类 我们常用的excel工具类,读有xlrd,写有xlwt.有读有写,新一代库有pandas,openpyxl等等. 大家用法都差不多,今天博主就介绍新手最爱,我也爱的xlrd和xl ...

  6. 自定义POI的excel工具类-xls-xlsx

    自定义POI的excel工具类-xls-xlsx 使用jdk8(java8)实现Excel导出,随意切换 xls和xlsx.自己只是封装了比较常用方法,07版生成还有bug.ε=(´ο`*)))唉 j ...

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

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

  8. 导出excel工具类

    1.excel工具类代码如下 package com.spring.excel.utils; import org.apache.poi.hssf.usermodel.*; import org.ap ...

  9. 操作Excel工具类:ExcelUtils.java

    项目中,时常会需要导入导出Excel的需求,因此我专门花时间设计了工具类. 所需依赖 <!-- 处理xls或xlsx格式的Excel表格导入导出的依赖 --><dependency& ...

最新文章

  1. FDA转向AI加快药物研发和审批速度
  2. application time for the banking industry
  3. 意外的服务器响应_响应式系统reactive system初探
  4. asp.net core轻松入门之MVC中Options读取配置文件
  5. Java项目几个月能完成_c#项目转JAVA,第5个月,基本完成
  6. JSON.parse()解析单引号错误的问题
  7. v-model 维护组件内外数据双向同步
  8. MySQL information_schema 系统库介绍
  9. jq处理返回来json_JQuery ajax返回JSON时的处理方式 (三种方式)
  10. 南信大滨江学院计算机考试姜青山,【数据库原理】滨江学院姜青山 期末试卷知识点笔记整理 南京信息工程大学...
  11. MySQL按照汉字拼音首字母排序
  12. 【Hadoop】HDFS三组件:NameNode、SecondaryNameNode和DataNode
  13. 企业如何避免创新者的窘境
  14. oracle加索引 oracle,Oracle索引创建及管理
  15. python快速入门神器 知乎_Python数据可视化神器--pyecharts 快速入门
  16. mysql 计算信度_解析组合信度CR、AVE值如何计算_组合信度cr
  17. 3、T5L迪文屏资源介绍
  18. 94、基于51单片机的无线调频对讲机系统设计
  19. win10计算机用户名修改密码,win10怎么修改登录用户名 win10修改开机密码的详细教程...
  20. windows编程学习——1 关闭窗口不退出

热门文章

  1. Windows上安装mysql-8.0.29-winx64
  2. 物联网导论【刘云浩】-笔记总结
  3. Got a packet bigger than 'max_allowed_packet' bytes 问题的解决方法
  4. MySQL必知必会二十三:使用存储过程
  5. Win10添加右键打开cmd和Powershell窗口(管理员/非管理员)
  6. 项目1:Ego微商小程序
  7. 在python中使用正则表达式
  8. 想提高跨境电商转化率?采用这几个技巧!
  9. 纯CSS制作3D动态相册【流星雨3D旋转相册】HTML+CSS+JavaScriptHTML5七夕情人节表白网页制作
  10. 大学计算机word排版作业,大学作业 word 文档排版.doc