Java使用POI导入excel教程
文章目录
- 前言
- 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教程相关推荐
- Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)
ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...
- java使用poi导入excel小数被四舍五入问题解决
出现问题:使用java poi导入带有小数的数据老是被自动的四舍五入掉,导致数据出错 解决办法:使用DecimalFormat处理被导入的数据 DecimalFormat df = new Decim ...
- java的poi导入Excel文件
首先看看前台写法: <form action="poi/upload.do" method="post" enctype="multipart/ ...
- Java使用poi导入Excel
首先导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base&l ...
- poi导出excel写入公式_【java poi 写入Excel后读取公式值问题】poi导入excel
java poi 写入Excel后读取公式值问题 不用改公式,只需要用cell.getNumericCellValue()获取,读出来就是正确的值了,如果你读出来的还有问题,说明你其他的地方写的还有问 ...
- Java结合POI清洗Excel
Java结合POI清洗Excel 下文是Java结合POI清洗Excel的示例代码,详细内容如下: ShipEntry.java package com.liang.bi.excelmodel;pub ...
- java利用poi导出excel功能-附带图片导出
java利用poi导出excel功能-附带图片导出 写在前面 最近刚离职,闲来无事,于是把上两家公司都有碰到过的需求但都没有去研究实现:即导出带图片的excel报表.于是就折腾了一下这个功能,研究出来 ...
- poi导入excel日期处理_POI处理Excel中各种日期格式问题
前不久写过一篇随笔<EXCEL解析之终极方法WorkbookFactory>,提到使用WorkbookFactory来处理Excel文件数据,最近发现一个问题就是这个办法不能很好的处理各种 ...
- java通过poi生成excel表格(自适应列宽、合并单元格后的边框添加)
具体java通过POI读写Excel的基本使用方法可参考: POI读写Excel的基本使用 1.项目导入依赖: <!--xls--> <dependency><group ...
- 如何优雅的用POI导入Excel文件
在企业级项目开发中,要经常涉及excel文件和程序之间导入导出的业务要求,那么今天来讲一讲excel文件导入的实现.java实现对excel的操作有很多种方式,例如EasyExcel等,今天我们使用的 ...
最新文章
- mybatis的实际应用
- hook 驱动 截屏
- BZOJ 4247 挂饰 背包DP
- Python Importlib模块与__import__详解
- 【工业控制】UV打印机喷头波形和墨水关系
- 会python学php难吗_会python再学php难吗
- ubuntu linux本地源,如何制作UbuntuLinux操作系统的本地源?
- excel进度条与百分比不符_Excel项目管理模板V2.0
- Python进阶(四)Python中的异常
- 系统故障模拟及修复实验
- 关于学习BEX5的问题
- 最全的ios系统导出微信聊天记录生成词云教程
- MPP文件怎么打开 五种方法最合适
- 防火墙相关知识,有备无患
- 【转】ARM GIC中断系列(二):gicv2架构基础
- 菜鸡小南橙的成长之路————bugkuCTF解题记录(一)
- 计算机毕业论文设计动画,毕业设计 公益广告动画设计
- 互联网的金门大桥:Cisco
- 如何创建 Python 库
- 教你个人邮箱怎么注册?126邮箱安全中心在哪里?