使用Java通过POI读取EXCEL中的数据

article/2025/10/21 3:52:51

 这里有个Excel,怎么使用java读取excel中的数据呢?

文件存放位置:

首先引入poi的jar包

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

我这里写了一个People类,目的是想把Excel中的数据读取出来后转成这个类,方便后续进行操作。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class People {private String name;private String age;private String sex;private String area;
}

 

然后看代码:

/*** FileName: MyExcelTest* Author:  zp* Date:    2020/2020/10/11/10:16* Description:*/
package excel;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** Description: * @author zpzp6* @create 2020/2020/10/11/10:16* @since 1.0.0*/
public class MyExcelTest {public static void main(String[] args) throws IOException {//获取工作簿XSSFWorkbook book = new XSSFWorkbook("E:\\我的文件\\测试\\测试.xlsx");//获取工作表XSSFSheet sheet = book.getSheetAt(0);
//        //第一种读取读取所有数据,实际中不需要
//        //获取行
//        for (Row cells : sheet) {
//            //获取单元格
//            for (Cell cell : cells) {
//                //获取单元格中的内容
//                cell.setCellType(CellType.STRING);
//                System.out.println(cell.getStringCellValue());
//            }
//        }List<People> peopleList=new ArrayList<>();//普通for循环//开始索引0  结束索引int lastRowNum = sheet.getLastRowNum();System.out.println("最后一行:"+lastRowNum);for (int i = 1; i <= lastRowNum; i++) {//获取单元格XSSFRow row = sheet.getRow(i);if(row!=null){List<String> list =new ArrayList<>();for (Cell cell : row) {if(cell!=null && !"".equals(cell)){//此处是把单元格都转换成String类型cell.setCellType(CellType.STRING);String cellValue = cell.getStringCellValue();System.out.println("单元格数据:"+cellValue);list.add(cellValue);}}if(list.size()>0){People people = new People(list.get(0), list.get(1), list.get(2), list.get(3));peopleList.add(people);}}}for (People people : peopleList) {System.out.println(people);}//释放资源book.close();}}

结果:

如果有这样的报错是因为打开了Excel文件,关闭就好。

 

 

测试的写得差不多了。那么就来点正式的。

控制层:

    @ApiOperation("读取资源文件")@PostMapping("/read-file")public List<PartyMember> readFile(@RequestParam(required = false) String path, @RequestParam(required = false) MultipartFile file) throws Exception{return new PartyMember().getExcelData(file);}
MultipartFile: 前端可以把excel上传,后端通过此MultipartFile来接收。path可以不写
   /*** @return * @param null* @Author* @Description //TODO* @Date 2019/8/15 12:14* @Param file :上传的excel文件*/@Transactionalpublic List<PartyMember> getExcelData(MultipartFile file) throws IOException {List<PartyMember> partyMembers = new ArrayList<>();PartyMember member = new PartyMember();SnapMember snapMember = new SnapMember();String fileName = checkFile(file);//获得Workbook工作薄对象Workbook workbook = getWorkBook(file);//创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回List<List<String>> list = new ArrayList<>();if (workbook != null) {for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {//获得当前sheet工作表Sheet sheet = workbook.getSheetAt(sheetNum);if (sheet == null) {continue;}//获得当前sheet的开始行int firstRowNum = sheet.getFirstRowNum();//获得当前sheet的结束行int lastRowNum = sheet.getLastRowNum();//循环除了所有行,如果要循环除第一行以外的就firstRowNum+1for (int rowNum = firstRowNum + 2; rowNum <= lastRowNum; rowNum++) {//业务逻辑}}workbook.close();}return partyMembers;}
/*** 检查文件** @param file* @throws IOException*/public static String checkFile(MultipartFile file) throws IOException {//判断文件是否存在if (null == file) {throw new CustomException("文件不存在!",HttpStatus.BAD_REQUEST);}//获得文件名String fileName = file.getOriginalFilename();//判断文件是否是excel文件if (!StringUtils.lowerCase(fileName).endsWith("xls") && !StringUtils.lowerCase(fileName).endsWith("xlsx")) {throw new CustomException("不是excel文件",HttpStatus.BAD_REQUEST);}return fileName;}public static Workbook getWorkBook(MultipartFile file) {//获得文件名String fileName = file.getOriginalFilename();//创建Workbook工作薄对象,表示整个excelWorkbook workbook = null;try {//获取excel文件的io流InputStream is = file.getInputStream();//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象if (StringUtils.lowerCase(fileName).endsWith("xls")) {//2003workbook = new HSSFWorkbook(is);} else if (StringUtils.lowerCase(fileName).endsWith("xlsx")) {//2007 及2007以上workbook = new XSSFWorkbook(is);}} catch (IOException e) {e.getMessage();}return workbook;}public static String getCellValue(Cell cell) {String cellValue = "";if (cell == null) {return cellValue;}//判断数据的类型//判断数据的类型switch (cell.getCellTypeEnum()) {case NUMERIC: //数字cellValue = stringDateProcess(cell);break;case STRING: //字符串cellValue = String.valueOf(cell.getStringCellValue());break;case BOOLEAN: //BooleancellValue = String.valueOf(cell.getBooleanCellValue());break;case FORMULA: //公式cellValue = String.valueOf(cell.getCellFormula());break;case BLANK: //空值cellValue = "";break;case ERROR: //故障cellValue = "非法字符";break;default:cellValue = "未知类型";break;}return cellValue;}public static String stringDateProcess(Cell cell) {String result = new String();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 hh:mm:ss");}Date date = cell.getDateCellValue();result = sdf.format(date);} else if (cell.getCellStyle().getDataFormat() == 58) {// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");double value = cell.getNumericCellValue();Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);result = sdf.format(date);} else {double value = cell.getNumericCellValue();CellStyle style = cell.getCellStyle();DecimalFormat format = new DecimalFormat();String temp = style.getDataFormatString();// 单元格设置成常规if (temp.equals("General")) {format.applyPattern("#");}result = format.format(value);}return result;}

 


http://chatgpt.dhexx.cn/article/mKQTgSj3.shtml

相关文章

使用POI读取excel文件内容

1.前言 项目中要求读取excel文件内容&#xff0c;并将其转化为xml格式。常见读取excel文档一般使用POI和JExcelAPI这两个工具。这里我们介绍使用POI实现读取excel文档。 2.代码实例&#xff1a; package edu.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.Fi…

使用POI读取Excel文件

使用POI读取Excel文件 一、前言 用户可以通过上传excel文件&#xff0c;后端通过读取excel文件的内容并将内容写入数据库中以便更好的使用。 本文档使用的excel的工具类既可以读取有合并单元格的文件也可以读取没有合并单元格的文件&#xff0c;并且读取到单元格的数据进行了…

POI读写Excel的基本使用

一、Excel导入导出的应用场景 1、数据导入&#xff1a;减轻录入工作量 2、数据导出&#xff1a;统计信息归档 3、数据传输&#xff1a;异构系统之间数据传输 二、POI简介&#xff08;Apache POI&#xff09; 1、什么是POI Apache POI是Apache软件基金会的开放源码函式库&…

C# 加载DotNetBar组件

C#作为前端的开发软件&#xff0c;使用的人很多&#xff0c;但是原生的C#界面较为简陋&#xff0c;已经不能满足公司级的开发工作了&#xff0c;今天这篇博客的主要内容是讲一下怎么在C#端使用一个可以提升界面美感的第三方控件&#xff0c;DotNetBar 首先去官网下载最新的DotN…

DevComponents.DotNetBar2 美化包使用以及验证教程

使用这个美化包是在别人项目上看到的&#xff0c;遇到一些懵逼问题&#xff0c;不断总结&#xff0c;所以写一下教程 DotNetBar 美化包控件不可编辑问题&#xff1a; 如图&#xff1a; 解决办法&#xff1a; 安装DotNetBar 这个软件&#xff08;有试用版&#xff09;&#xff…

winform DevComponents.DotNetBar2 添加到工具栏方法

当C#项目引入皮肤组件&#xff0c;或其他组件是&#xff0c;发现工具框里面没有引用的组件怎么办&#xff1f; 1.组件的引用 我是把下载好的*.dll组件&#xff0c;复制到项目的\bin\Debug\路径下&#xff0c;然后在项目处右键-->添加引用&#xff0c;这样组件就引入项目了…

DotNetBar控件的多文档界面的实现

DotNetBar是一个不错的DotNET控件套装&#xff0c;原来是一个DLL文件&#xff0c;能够做出很漂亮的界面效果&#xff0c;记得在8.0以前的版本&#xff0c;好像实现多文档界面稍显得麻烦一些&#xff0c;我的Winform框架、WCF框架虽然也提供了这样多文档的界面&#xff0c;不过都…

C#之DotNetBar2使用方法 - itemPanel1

用itemPanel做个按钮菜单&#xff0c;模拟用来操控开关按钮 对象buttonItem1的属性&#xff08;itempanel可以添加的子控件列表对象&#xff0c;根据需要选择&#xff0c;这里用到的Button&#xff09; 可以用控件自带的样式&#xff0c;也可以用代码控制&#xff0c;也可以预先…

winfrom DotNetBar sideNav控件使用问题

sideNav初始UI 在最开始的界面&#xff0c;不知道设置了什么东西&#xff0c;然后没有那个东西 最后又新建了个项目&#xff0c;一个一个对比参数。还是没找到&#xff01;倒是发现几个其他的参数属性 在这里记录下 这是分别对应的是对sideNav的sideNavPanel的折叠 最大化 隐藏…

界面控件DotNetBar for WinForms使用教程:highlight组件使用教程

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。DotNetBar是全世界第一个引入全功能Office 2…

C#之DotNetBar2使用方法 - superTabControl1

C#版本&#xff1a;DevComponents.DotNetBar2 14.1.0 &#xff08;可以搜下各种版本&#xff09; 常用的控件使用属性&#xff0c;方法&#xff1b; 1&#xff09;superTabControl1 关闭和菜单设置方法 visibletrue/false closebox :关闭当前选中的TAB menubox:切换tab的菜…

DevComponents.DotNetBar2之SuperTabControl使用技巧

关于类似SuperTabControl的使用如何动态调整其TAB标签的顺序问题&#xff0c;搜了全网也没有找到类似答案&#xff0c;都提到tab键的顺序或者是通过控件界面进行调整其顺序&#xff0c;都不是想要的结果&#xff0c;有个网友问的类似问题但是没有一个答案可用。经过反复测试总结…

界面控件DotNetBar for WinForms使用教程:LayoutControl详解(二)

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。 点击下载DotNetBar for WinForms最新试用版…

DotNetBar布局(一)

相信大家搞.NET桌面程序开发都会用到一些界面布局的组件&#xff0c;常用的由DotNetBar和devexpress。今天主要将DotNetBar在项目中布局简单介绍一下&#xff0c;个人感觉这个控件还是有很多bug的&#xff0c;不知道什么时候就出现莫名奇妙的排版问题错误。比如突然在设计视图D…

dotnetbar-SuperTabControl禁止调整顺序

superTabCtl.ReorderTabsEnabled false; 禁止调整TAB顺序 superTabCtl.CloseButtonOnTabsAlwaysDisplayedfalse; 禁止x关闭按钮一直在TAB上显示 superTabCtl.CloseButtonOnTabsVisibletrue/false;关闭按钮是否可见 注意&#xff1a; superTabitem.CloseButtonVisibletru…

Visual Studio 2019 中使用 DotNetBar

1、下载并安装DotNetBarSetupTrial 2、在新建项目或者现有项目中进行引用&#xff0c;找到DotNetBar安装路径中需要用到的dll引用&#xff0c;引用路径正确是关键 3、在工具箱中添加选项卡&#xff0c;加载需要用到的控件 先在工具箱空白处添加选项卡&#xff0c;方便管理&am…

DotNetBar for WinForms使用教程:图表控件用户指南(一)

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。DotNetBar是全世界第一个引入全功能Office 2…

c# 使用dotnetbar 控件绘制曲线图形

废话不说,直接上过程 加载dotnetbar库后,将chartcontrol控件拖动到界面上,选择line polt 增加一个按钮,绘制曲线功能 private void buttonX26_Click(object sender, EventArgs e) { CreateChartSeries1(); } public void CreateChart…

经典:DotNetBar Suite UI 7.9 for WPF Crack

创建专业的 WPF 应用程序 DotNetBar Suite for WPF 是超过 38 个本机 Windows Presentation Foundation 控件的工具箱&#xff0c;用于创建专业的 WPF 应用程序。 Office 2016 类样式添加到功能区、日程安排和其他控件... 我们痴迷于控制性能和像素级细节。我们很自豪地说&…

DotNetBar SuperGridControl控件

1.添加表头 sgc.PrimaryGrid.SelectionGranularity SelectionGranularity.Row;//点击选中一行DevComponents.DotNetBar.SuperGrid.GridColumn gc null;gc new DevComponents.DotNetBar.SuperGrid.GridColumn("ID");sgc.PrimaryGrid.Columns.Add(gc);gc new DevCo…