POI解析Excel表格
Apache POI
是Apache
软件基金会的开放源码函式库,POI
提供API
给Java
程序对Microsoft Office
格式档案读和写的功能。
这里实现poi
解析Excel
表格的例子,导入Excel
,
准备食材
第一道菜
第二道菜
下锅炸至两面金黄
package com.ftx.poi;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
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.usermodel.XSSFWorkbook;
public class ParseExcel {
/**
* 解析文件的方法
*@param inputStream文件输入流 ,要解析的Excel文件输入流
*@param suffix 后缀名,xls或xlsx,代码决定使用什么方式解析Excel
*@param startRow 从第几行开始读取数据
*@return List<String[]> 集合中的一个元素对应一行解析的数据
* 元素为字符串数组类型,数组中的每一个元素对应一列数据
* @throws IOException
*/
public List<String[]> parseExcel(InputStream inputStream,String suffix,int startRow) throws IOException{
//定义Excel对象变量
Workbook workbook=null;
//判断后缀 决定使用的解析方式,决定如何创建具体的对象
if("xls".equals(suffix)) {
//2003版的解析方式
workbook=new HSSFWorkbook(inputStream);
}else if("xlsx".equals(suffix)) {
//2007
workbook=new XSSFWorkbook(inputStream);
}else {
//未知内容
return null;
}
//获取工作表,Excel分为若干个表,sheet
Sheet sheet = workbook.getSheetAt(0);//得到第一个表格sheet
if(sheet==null) {
return null;
}
//获取表格中最后一行的行号
int lastRowNum = sheet.getLastRowNum();
//最后一行的行号大于startRow
if(lastRowNum<=startRow) {
return null;
}
List<String[]> result=new ArrayList<String[]>();
//定义行变量和单元格变量
Row row=null;
Cell cell=null;
//循环读取
for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) {
row=sheet.getRow(rowNum);
//获取当前行的第一列和最后一列的标记
short firstCellNum = row.getFirstCellNum();
short lastCellNum = row.getLastCellNum();
if(lastCellNum!=0) {
String[] rowArray=new String[lastCellNum];
for(int cellNum=firstCellNum;cellNum<lastCellNum;cellNum++) {
//拿到单元格的值
cell=row.getCell(cellNum);
//判断单元格是否有数据
if(cell==null) {
rowArray[cellNum]=null;
}else {
rowArray[cellNum]=parseCell(cell);
}
}
result.add(rowArray);
}
}
return result;
}
/**
* 解析单元格数据(返回字符串)
*/
private String parseCell(Cell cell) {
String cellStr=null;
//判断单元格的类型
switch (cell.getCellType()) {
case STRING :
//字符串类型单元格
cellStr=cell.getRichStringCellValue().toString();
break;
case BLANK :
//空数据
cellStr="";
break;
case NUMERIC :
//数字类型 包含日期、时间、数字
//判断日期【年月日2016-12-20 | 时分10:20】类型
if(HSSFDateUtil.isCellDateFormatted(cell)) {
//判断具体类型,是日期还是时间
SimpleDateFormat sdf=null;
if(cell.getCellStyle().getDataFormat()==HSSFDataFormat.getBuiltinFormat("h:mm")) {
//时间
sdf=new SimpleDateFormat("HH:mm");
}else {
//日期
sdf=new SimpleDateFormat("yyyy-MM-dd");
}
Date temp = cell.getDateCellValue();
cellStr=sdf.format(temp);
}else {
//数字
double temp=cell.getNumericCellValue();
//数字格式化工具
DecimalFormat format=new DecimalFormat();
//查看单元格中的具体样式类型
String formatStr=cell.getCellStyle().getDataFormatString();
if(formatStr.equals("General")) {
/**
* 定义格式化正则
* 保留一位小数 #.#
* 保留两位小数#.##
*/
format.applyPattern("#");
}
cellStr=format.format(temp);
}
break;
default:
cellStr="";
}
return cellStr;
}
}
吃一口嘎嘣脆
public class Test {
public static void main(String[] args) throws IOException {
ParseExcel parser=new ParseExcel();
InputStream inputStream=new FileInputStream("D:\\工作内容\\poiTestTwo.xls");
String suffix="xls";
int startRow=1;
List<String[]> result = parser.parseExcel(inputStream, suffix, startRow);
for(String[] i:result) {
//Arrays.toString("字符串数组") 打印字符串数组,直接打印字符串数组会打印出数组的地址
System.out.println(Arrays.toString(i));
}
}
}
运行测试类,解析出了Excel
表格的内容。
说明:上面的poi
只能是解析03和07版本的Excel
,如果不是这个版本的Excel
的话需要另存为03或07版本然后再进行解析,否则会报错找不到对应的jar包。
现在只是把Excel
表格的内容解析成了字符串数组的形式,如果导入到数据库的话还需要再对其字符串数组进行处理。
思路提示:实现在页面点击按钮导入Excel表格
进行导入的功能,使用<input type="file" />
表单提交,在controller
中接收到的就是File
对象,就不用像上面的测试类中写死的样子了。
根据suffix
判断表格文件的版本(获取后缀参考图片上传)
public String upload(@RequestParam(value = "pic") MultipartFile pic,@RequestParam Map param,Model model) throws ParseException {
String fileName=pic.getOriginalFilename();//得到文件名
String suffixName=fileName.substring(fileName.lastIndexOf("."));//得到后缀名
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~