文章目录

  • 前言
  • 1、工作准备
  • 2、小试牛刀
  • 3、小结
  • 写在最后

前言

实习期间遇到一个业务需求,要求具有excel导入和导出功能。由于公司框架的数据表格自带了excel导出功能,所以只需excel导入即可,流程是这样的:选择excel →文件上传→处理数据。

项目使用的Jar包是Apache POI,关于Apache POI,简单介绍一下:

Apache POI是基于Office Open XML标准(OOXML)和Microsoft的OLE2复合文档格式(OLE2)处理各种文件格式的开源项目。简言之,就是用来操作office的工具箱。

其中操作Excel的模块有两个:

  • HSSF - 操作xls格式excel(低版本),有数据量限制
  • XSSF - 操作xlsx格式excel(高版本),支持百万级数据量

1、工作准备

打开maven仓库:https://mvnrepository.com/,输入POI,如下图:

点进去,推荐选择的版本特点——时间不早不晚,多人使用的(遇到问题降低了解决难度),如下图:

这里选择3.17版本(beta可以理解为测试、抢先,通常是有新功能或大的调整),点击,复制maven坐标,如下图:

poi-ooxml如是,然后把它们贴入pom.xml,如下图:

然后在idea中右键选中:Maven→Reimport,或者点击enable auto import,让maven把jar包接入项目即可。

2、小试牛刀

由于excel存在版本区别,需要分别处理xls和xlsx格式,分别对应HSSF、XSSF开头的API,按住CTRL + SHIFT + ALT + U,查看继承关系图,可以发现它们有相同的接口:

其它类,如:HSSFSheet、XSSFSheet也可以通过Sheet接口引用(里式替换法则),测试代码如下(xlxs):

    private static void parseXlsxDemo() throws Exception {// File类:以抽象的方式代表文件名和目录路径名File file = new File("d:\\good.xls");// 建立文件输入流FileInputStream fis = new FileInputStream(file);// 声明并创建一个工作簿HSSFWorkbook workbook = new HSSFWorkbook(fis);// sheet表示文件页,下标从0开始,表示第一页HSSFSheet sheet = workbook.getSheetAt(0);// 获取总行数(第一页)int rows = sheet.getPhysicalNumberOfRows();for (int i = 0; i < rows; i++) {// 先获取行对象,再操作列Row row = sheet.getRow(i);// 获取每一行的格子数(列数)int cols = row.getPhysicalNumberOfCells();for (int j = 0; j < cols; j++) {// 获取格子对象Cell cell = row.getCell(j);// 输出格子对象System.out.printf("%s\t", cell.toString());}// 换行输出System.out.println();}}

文件截图+运行效果:

细心的朋友会发现,0变成了0.0,1变成了1.0,这是因为POI默认数字为浮点数。数据类型稍微有点复杂,此处不深究,下面是修改后的完整代码:

package ltd.newson.poi;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileInputStream;/*** @Title: ReadExcel* @Author: newson.ltd* @Date: 2021-01-26 下午 12:01* @Version: 1.0* @Description: excel demo*/
public class ReadExcel {public static void main(String[] args) throws Exception {String fileName1 = "d:\\good.xls";String fileName2 = "d:\\good.xlsx";parseXls(fileName1);parseXlsx(fileName2);}/*** 读取xls格式excel* @param fileName* @throws Exception*/private static void parseXls(String fileName) throws Exception {// 1、读取文件(逐层包装,装饰器模式)FileInputStream fis = new FileInputStream(new File(fileName));Workbook workbook = new HSSFWorkbook(fis);// 2、获取要处理的页面Sheet sheet = workbook.getSheetAt(0);// 3、处理单元格printCell(sheet);}/*** 读取xlsx格式excel* @param fileName* @throws Exception*/private static void parseXlsx(String fileName) throws Exception {FileInputStream fis = new FileInputStream(new File(fileName));Workbook workbook = new XSSFWorkbook(fis);Sheet sheet = workbook.getSheetAt(0);printCell(sheet);}/*** 打印单元格* @param sheet*/private static void printCell(Sheet sheet) {// 获取当前页的总行数int totalRowNums = sheet.getPhysicalNumberOfRows();for (int i = 0; i < totalRowNums; i++) {// 获取行Row row = sheet.getRow(i);// 获取列数(格子数)int cells = row.getPhysicalNumberOfCells();StringBuilder builder = new StringBuilder();for (int j = 0; j < cells; j++) {Cell cell = row.getCell(j);builder.append(getCellValue(cell)).append("\t");}System.out.print(builder.append("\n").toString());}}/*** 获取单元格的值,此处做简单处理* @param cell* @return*/private static String getCellValue(Cell cell) {// 部分API已过时,此处是更新后的CellType cellType = cell.getCellTypeEnum();if (cellType == CellType.BOOLEAN) {return String.valueOf(cell.getBooleanCellValue());}if (cellType == CellType.NUMERIC) {return cell.getNumericCellValue() + "";}return cell.getStringCellValue();}}

运行截图:

补充:注意getCellValue()中的API,有些教程可能会使用cell.getCellType()和Cell.CELL_TYPE_XXX(XXX表示数据类型),这些方法在新的POI中被标记为@deprecated(过时的),建议换成上述方法内的API。

3、小结

通过代码+注释的解读,会发现excel的读取是这么的简单,归纳一下操作步骤:

  • 输入目标文件,获取wordbook对象(工作簿)
  • 通过workbook对象获取sheet对象(要操作的页面)
  • 通过sheet对象获取当前页的总行数
  • 开循环,获取行对象,并通过行获取每一行的列数(格子数)
  • 再开个循环,通过行对象获取每一个格子对象
  • 操作格子对象(注意数据类型)

最后一步也是比较复杂的一步,需要具体情况具体分析。本示例操作单页,多页同理。最后扩展一下excel单元格的数据类型:

CellType 含义
_NONE 未知类型
NUMERIC 数值类型(整数、小数、日期)
STRING 字符串
FORMULA 公式
BLANK 空白格(有样式)
BOOLEAN 布尔值
ERROR 错误单元格

写在最后

本次Java读取excel就介绍到这里啦,我是严光君,咱们下文再见~


创造不易,少侠请留步…… 动起可爱的双手,点个赞再走呗~ ٩(๑>◡<๑)۶

Java使用POI导入excel教程相关推荐

  1. Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

    ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...

  2. java使用poi导入excel小数被四舍五入问题解决

    出现问题:使用java poi导入带有小数的数据老是被自动的四舍五入掉,导致数据出错 解决办法:使用DecimalFormat处理被导入的数据 DecimalFormat df = new Decim ...

  3. java的poi导入Excel文件

    首先看看前台写法: <form action="poi/upload.do" method="post" enctype="multipart/ ...

  4. Java使用poi导入Excel

    首先导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base&l ...

  5. poi导出excel写入公式_【java poi 写入Excel后读取公式值问题】poi导入excel

    java poi 写入Excel后读取公式值问题 不用改公式,只需要用cell.getNumericCellValue()获取,读出来就是正确的值了,如果你读出来的还有问题,说明你其他的地方写的还有问 ...

  6. Java结合POI清洗Excel

    Java结合POI清洗Excel 下文是Java结合POI清洗Excel的示例代码,详细内容如下: ShipEntry.java package com.liang.bi.excelmodel;pub ...

  7. java利用poi导出excel功能-附带图片导出

    java利用poi导出excel功能-附带图片导出 写在前面 最近刚离职,闲来无事,于是把上两家公司都有碰到过的需求但都没有去研究实现:即导出带图片的excel报表.于是就折腾了一下这个功能,研究出来 ...

  8. poi导入excel日期处理_POI处理Excel中各种日期格式问题

    前不久写过一篇随笔<EXCEL解析之终极方法WorkbookFactory>,提到使用WorkbookFactory来处理Excel文件数据,最近发现一个问题就是这个办法不能很好的处理各种 ...

  9. java通过poi生成excel表格(自适应列宽、合并单元格后的边框添加)

    具体java通过POI读写Excel的基本使用方法可参考: POI读写Excel的基本使用 1.项目导入依赖: <!--xls--> <dependency><group ...

  10. 如何优雅的用POI导入Excel文件

    在企业级项目开发中,要经常涉及excel文件和程序之间导入导出的业务要求,那么今天来讲一讲excel文件导入的实现.java实现对excel的操作有很多种方式,例如EasyExcel等,今天我们使用的 ...

最新文章

  1. mybatis的实际应用
  2. hook 驱动 截屏
  3. BZOJ 4247 挂饰 背包DP
  4. Python Importlib模块与__import__详解
  5. 【工业控制】UV打印机喷头波形和墨水关系
  6. 会python学php难吗_会python再学php难吗
  7. ubuntu linux本地源,如何制作UbuntuLinux操作系统的本地源?
  8. excel进度条与百分比不符_Excel项目管理模板V2.0
  9. Python进阶(四)Python中的异常
  10. 系统故障模拟及修复实验
  11. 关于学习BEX5的问题
  12. 最全的ios系统导出微信聊天记录生成词云教程
  13. MPP文件怎么打开 五种方法最合适
  14. 防火墙相关知识,有备无患
  15. 【转】ARM GIC中断系列(二):gicv2架构基础
  16. 菜鸡小南橙的成长之路————bugkuCTF解题记录(一)
  17. 计算机毕业论文设计动画,毕业设计 公益广告动画设计
  18. 互联网的金门大桥:Cisco
  19. 如何创建 Python 库
  20. 教你个人邮箱怎么注册?126邮箱安全中心在哪里?

热门文章

  1. 无线蓝牙耳机选购小知识,2020新款上市五大高人气蓝牙耳机推荐
  2. SPSS数据分析之分类变量频率分析
  3. Flask 与 Django 框架对比
  4. 计数器—verilog
  5. 《人生效率手册》学习总结
  6. 网络操作系统发展历程
  7. 计量广义差分操作过程_时间序列计量经济学模型——思维导图
  8. Postman测试导出导入Excel教程
  9. date2String
  10. 新手如何做好网络营销