Java教程:使用POI读取excel文档(根据BV1bJ411G7Aw整理)

article/2025/10/21 3:48:47

Java教程:使用POI读取excel文档(根据BV1bJ411G7Aw整理)

最近公司需要我做一个导出Excel表格的功能,为此来学习一下POI,在这里记录一下学习笔记。B站直接搜BV1bJ411G7Aw就能找到视频。

一、简介
在这里插入图片描述
poi如何操作表格
在这里插入图片描述

二、入门案例

2.1 从Excel文件读取数据
2.1.1 步骤文字描述

1.创建工作簿
2.获取工作表
3.遍历工作表获得行对象
4.遍历行对象获取单元格对象
5.获得单元格中的值

2.2.2 代码
先在pom中导入依赖在这里插入图片描述

<!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>

在桌面(你喜欢的地方)创建一个xlsx,输入一些简单数据
在这里插入图片描述
在这里插入图片描述
按照步骤书写代码
在这里插入图片描述

// 1.获取工作簿XSSFWorkbook workbook = new XSSFWorkbook("C:\\Users\\ghost\\Desktop\\hello.xlsx");// 2.获取工作表// xlsx第一个工作簿(Sheet1),下标从0开始,0就是第一个XSSFSheet sheet = workbook.getSheetAt(0);/*使用加强for循环的方式*/// 3.获取行for (Row row : sheet) {// 4.获取单元格for (Cell cell: row) {// 获取单元格中的内容String value = cell.getStringCellValue();System.out.println(value);}}// 释放资源workbook.close();

运行代码
我们会发现能够正常读到,但是因为我们也打开着这个文档,所以显示被占用
在这里插入图片描述
关掉再运行就一切正常了
在这里插入图片描述
我们再试试不使用加强for循环的方式
在这里插入图片描述

// 1.获取工作簿XSSFWorkbook workbook = new XSSFWorkbook("C:\\Users\\ghost\\Desktop\\hello.xlsx");// 2.获取工作表// xlsx第一个工作簿(Sheet1),下标从0开始,0就是第一个XSSFSheet sheet = workbook.getSheetAt(0);/*使用普通循环的方式*/// 开始索引(0) 结束索引int lastRowNum = sheet.getLastRowNum(); //行的结束索引for (int i = 0; i <= lastRowNum; i++) {// 拿到行XSSFRow row = sheet.getRow(i);if (row != null){short cellNum = row.getLastCellNum(); //单元格的结束索引for (int j = 0; j <= cellNum; j ++){XSSFCell cell = row.getCell(j);// 单元格不为空就去拿他的值if (cell != null){String stringCellValue = cell.getStringCellValue();System.out.println(stringCellValue);}}}}// 释放资源workbook.close();

能够正常运行
在这里插入图片描述

2.2 向Excel文件写入数据
2.2.1 步骤文字描述

1.创建一个Excel文件
2.创建工作表
3.创建行
4.创建单元格赋值
5.通过输出流将对象下载到磁盘

2.2.2 代码
在这里插入图片描述

// 1.创建工作簿XSSFWorkbook workbook = new XSSFWorkbook();// 2.创建工作表XSSFSheet sheet = workbook.createSheet("工作表一");// 3.创建行XSSFRow row1 = sheet.createRow(0); //第一行// 创建单元格row1.createCell(0).setCellValue("众"); //第一行第一格row1.createCell(1).setCellValue("子"); //第一行第二格row1.createCell(2).setCellValue("之"); //第一行第三格row1.createCell(3).setCellValue("爹"); //第一行第四格XSSFRow row2 = sheet.createRow(1); //第二行// 创建单元格row2.createCell(0).setCellValue("众"); //第二行第一格row2.createCell(1).setCellValue("子"); //第二行第二格row2.createCell(2).setCellValue("之"); //第二行第三格row2.createCell(3).setCellValue("爹"); //第二行第四格// 输出流FileOutputStream out = new FileOutputStream("C:\\Users\\ghost\\Desktop\\hello1.xlsx");// 写入workbook.write(out);// 刷新流out.flush();// 释放资源out.close();workbook.close();// 给个成功提示System.out.println("写入成功!");

运行代码
在这里插入图片描述
回到桌面查看可以看到多出来一个hello1
在这里插入图片描述
在这里插入图片描述

三、配合数据库使用

3.1 读取Excel文件数据
首先在随便一个地方(我这里在桌面)创建一个product.xlsx
在这里插入图片描述
然后写入一些数据
在这里插入图片描述
创建数据库
在这里插入图片描述
创建实体类(getset方法、有参无参构造、toString)
在这里插入图片描述
这里使用控制台来代替前端页面,主要是展示功能代码
在这里插入图片描述
在这里插入图片描述

public class PioShow {public static void main(String[] args) throws IOException {// 通过键盘录入ScannerScanner scanner = new Scanner(System.in);System.out.println("请输入你要选择的功能:1、导入;2、导出");int num = scanner.nextInt();if (num == 1){// 1.导入// 1.1读取excel表中的数据System.out.println("请输入您要读取的文件位置(不包含空格):");String path = scanner.next();List<Pio> pioList = read(path);System.out.println(pioList);// 1.2将数据接入到数据库中}else if (num == 2){// 2.导出// 2.1读取数据库中的数据// 2.2将数据写入到excel表格中}else {System.out.println("输入有误,请重新启动!");}}public static List<Pio> read(String path) throws IOException {// 用来存储下面的存储单元格的listList<Pio> pioList = new ArrayList<>();// 1.获取工作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook(path);// 2.获取工作表XSSFSheet sheet = xssfWorkbook.getSheetAt(0); //0代表第一个工作表int lastRowNum = sheet.getLastRowNum();// i=1,第一行的商品编号、商品名称、商品价格(单位:元/斤)、商品库存(单位:吨)不拿,不然报错java.lang.NumberFormatException: For input string: "商品编号"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){// 手动设置为字符串类型,避免乱码cell.setCellType(Cell.CELL_TYPE_STRING);// 获取单元格中的内容String value = cell.getStringCellValue();// 防止某些单元格为空if (value != null && !"".equals(value)){// 获取到的单元格内容放到list里面list.add(value);}}}if (list.size() > 0){// 0-3对应:主键,商品名称,商品价格,商品库存。除了商品名称本身就是String类型,其他全部要转换为对应类型Pio pio = new Pio(Integer.parseInt(list.get(0)), list.get(1), Double.parseDouble(list.get(2)), Integer.parseInt(list.get(3)));// 封装到List里pioList.add(pio);}}}return pioList;}
}

启动,然后输入文件路径,可以看到能够读取到里面的数据
在这里插入图片描述
最后添加保存到数据库的代码(具体见视频)

3.2 写出到Excel文件
这里以springBoot为例(之前自己写的一个小说网站),需要jdbc的例子的到视频看

注释掉的部分是固定写到桌面;这里用的是jsp,等待jsp返回地址,不为空就执行导出到excel
在这里插入图片描述

// 从数据库读取数据写到Excel中@RequestMapping("/writePio")public String writePio(String path) throws IOException {//FileSystemView fsv = FileSystemView.getFileSystemView();  //注意了,这里重要的一句//System.out.println(fsv.getHomeDirectory());               //得到桌面路径//path = fsv.getHomeDirectory() + "\\aaa.xlsx";// 2.导出// 2.1读取数据库中的数据List<Pio> pioList = novelService.selectPioAll();// 2.2将数据写入到excel表格中if(path != null) {write(pioList, path);System.out.println("写入成功!");}return "writePio";}

novelService.selectPioAll()的内容,就是简单的查询表里全部字段

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

write方法,正常需要封装到util里,这里就随便放了
在这里插入图片描述
百分比可以做通过率或者什么比例的数据展示

public void write(List<Pio> pioList, String path) throws IOException {// 1.创建一个工作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook();// 2.创建工作表XSSFSheet sheet = xssfWorkbook.createSheet("商品");// 3.创建行XSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue("商品编号");row.createCell(1).setCellValue("商品名称");row.createCell(2).setCellValue("商品价格(单位:元/斤)");row.createCell(3).setCellValue("商品库存(单位:吨)");DecimalFormat df = new DecimalFormat("0.0");//设置保留位数,下面除法的百分比用到。直接用"/"是保留整数的除,"%"是取余,都不适用for (int i = 0; i < pioList.size(); i++) {XSSFRow row1 = sheet.createRow(i + 1);row1.createCell(0).setCellValue(pioList.get(i).getPid());row1.createCell(1).setCellValue(pioList.get(i).getPname());row1.createCell(2).setCellValue(pioList.get(i).getPrice() + "/" + pioList.get(i).getPrice() + "(" + df.format((float)pioList.get(i).getPrice()/pioList.get(i).getPrice()*100) + "%" + ")");row1.createCell(3).setCellValue(pioList.get(i).getPstock());}FileOutputStream fileOutputStream = new FileOutputStream(path);xssfWorkbook.write(fileOutputStream);fileOutputStream.flush();fileOutputStream.close();xssfWorkbook.close();}

jsp里的内容
在这里插入图片描述

数据库的内容
在这里插入图片描述
在主界面随便找个地方作为入口
在这里插入图片描述
到主界面点进去
在这里插入图片描述
输入地址,这里输入在桌面创建一个product.xlsx
在这里插入图片描述
在这里插入图片描述
回到桌面查看
在这里插入图片描述
在这里插入图片描述
3.3 展示数据和一键导出为Excel表格
controller层
在这里插入图片描述

// 从数据库读取数据写到Excel中@RequestMapping("/writePio")public String writePio(String path, HttpServletResponse servletResponse, Model model) throws IOException {/*FileSystemView fsv = FileSystemView.getFileSystemView();  //注意了,这里重要的一句System.out.println(fsv.getHomeDirectory());               //得到桌面路径path = fsv.getHomeDirectory() + "\\aaa.xlsx";*/// 2.导出// 2.1读取数据库中的数据List<Pio> pioList = novelService.selectPioAll();model.addAttribute("pioList", pioList);// 2.2将数据写入到excel表格中if(path != null) {write(pioList, path);download(path, servletResponse);System.out.println("写入成功!");}return "writePio";}

调用Uitl里的两个方法:write,download
write方法
在这里插入图片描述

public void write(List<Pio> pioList, String path) throws IOException {// 1.创建一个工作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook();// 2.创建工作表XSSFSheet sheet = xssfWorkbook.createSheet("商品");// 3.创建行XSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue("商品编号");row.createCell(1).setCellValue("商品名称");row.createCell(2).setCellValue("商品价格(单位:元/斤)");row.createCell(3).setCellValue("商品库存(单位:吨)");DecimalFormat df = new DecimalFormat("0.0");//设置保留位数,下面除法的百分比用到。直接用"/"是保留整数的除,"%"是取余,都不适用for (int i = 0; i < pioList.size(); i++) {XSSFRow row1 = sheet.createRow(i + 1);row1.createCell(0).setCellValue(pioList.get(i).getPid());row1.createCell(1).setCellValue(pioList.get(i).getPname());row1.createCell(2).setCellValue(pioList.get(i).getPrice() + "/" + pioList.get(i).getPrice() + "(" + df.format((float)pioList.get(i).getPrice()/pioList.get(i).getPrice()*100) + "%" + ")");row1.createCell(3).setCellValue(pioList.get(i).getPstock());}FileOutputStream fileOutputStream = new FileOutputStream(path);xssfWorkbook.write(fileOutputStream);fileOutputStream.flush();fileOutputStream.close();xssfWorkbook.close();}

download方法
在这里插入图片描述

 /*** @param path     想要下载的文件的路径* @param response* @功能描述 下载文件: 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端*/@RequestMapping("/download")public void download(String path, HttpServletResponse response) {try {// path是指想要下载的文件的路径File file = new File(path);System.out.println(file.getPath());// 获取文件名String filename = file.getName();// 获取文件后缀名String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();System.out.println(("文件后缀名:" + ext));// 将文件写入输入流FileInputStream fileInputStream = new FileInputStream(file);InputStream fis = new BufferedInputStream(fileInputStream);byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();// 清空responseresponse.reset();// 设置response的Headerresponse.setCharacterEncoding("UTF-8");// Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存// attachment表示以附件方式下载   inline表示在线打开   "Content-Disposition: inline; filename=文件名.mp3"// filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));// 告知浏览器文件的大小response.addHeader("Content-Length", "" + file.length());OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");outputStream.write(buffer);outputStream.flush();} catch (IOException ex) {ex.printStackTrace();}}

数据库
在这里插入图片描述
jsp页面
在这里插入图片描述

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--Created by IntelliJ IDEA.User: ghostDate: 2022/1/5Time: 11:37To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>导出文档</title>
</head>
<body>
<%--展示查出的数据--%><table><tr><%--<c:forEach var="pioList" items="${pioList}" varStatus="s">--%><td style="padding-left: 40px">商品名称</td><td style="padding-left: 50px">商品价格(单位:元/斤)</td><td style="padding-left: 50px">商品库存(单位:吨)</td><%--</c:forEach>--%></tr></table><ul style="list-style:none;"><c:forEach var="pioList" items="${pioList}" varStatus="s"><li style="display: inline; padding-left: 10px; color: fuchsia">${pioList.pname}</li><li style="display: inline; padding-left: 120px; color: #ff9fa5">${pioList.price}</li><li style="display: inline; padding-left: 200px; color: #d4af7a">${pioList.pstock}</li><li> </li></c:forEach></ul>
<%--导出为Excel表格--%>
<form action="/novel/writePio">
<%--<label for="path" style="height: 30px; color: #03bbe8">文件名 :&nbsp;</label>
<input type="text" name="path" id="path"  size="50px" style="height: 30px" placeholder="请输入文件名(以.xlsx结尾,否则导出的不是Excel格式):">--%><%--导出的默认文件名为商品信息.xlsx--%><select  name="path" id="path" style="display:none"><option>商品信息.xlsx</option></select>
<input type="submit" value="导出为Excel表格" style="width: 150px; height: 60px; margin-top: 10px; margin-left: 100px"/>
</form>
</body>
</html>

最终效果
在这里插入图片描述
点击“导出为Excel表格就可以导出”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


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

相关文章

poi读取excel模板,并填充数据

一、POI介绍 Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 基本功能&#xff1a; HSSF &#xff0d; 提供读写Microsoft Excel格式档案的功能。 XSSF &#xff0d; 提供读写Microsoft Excel OOXM…

java使用poi操作读取Excel文件

在上代码之前首先说说Excel文件的一些名词 工作区workbook&#xff1a;可以理解为一个Excel文件&#xff0c;比如LinkL.xlsx文件 表sheet&#xff1a;一个.xlsx文件中的不同表 行row&#xff1a;表中的一行数据 单元格cell&#xff1a;每一行中的每一个数据就是单元格 附&…

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

这里有个Excel&#xff0c;怎么使用java读取excel中的数据呢&#xff1f; 文件存放位置&#xff1a; 首先引入poi的jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></…

使用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…