Java实现读写Excel表格数据(满满干货)

2025-08-06 02:07:14

Hi i,m JinXiang

⭐ 前言 ⭐

本篇文章主要介绍Java实现读写Excel表格数据的详细使用以及部分理论知识

🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁

🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言

一、使用两种方法添加Maven依赖

1、在java项目内部中导入Maven依赖(图片详细操作解释)

①、创建一个java项目,找到目录下“pom.xml”配置文件

②、把以下代码 放入pom.xml配置文件中

org.apache.poi

poi

3.16

org.apache.poi

poi-ooxml

3.16

③、点击按钮导入Maven依赖

④、等待导入Maven进程结束,就可以使用相关方法啦

2、在java项目中导入外部jar包使用Maven依赖(附上免费jar包分享)

①、提前把poi 下载好

②、放在WEB-INF目录下(图片详细操作解释)

③、把导入的lib包选中,右击添加为库,点击确定 导入成功!

④、需要jar包以及老师详细讲解如何在Java中实现读写Excel表格数据录屏的可以点击下方链接跳转博客 获取资源!点击跳转获取学习资源

二、理解导入导出Excel数据

1、导入效果

导入Excel数据理解:将要批量新增的数据事先存入Excel表格中,再将表格上传至服务器通过后端处理进行批量新增至数据库中

2、导出效果

导出Excel数据理解:将要查询的目标数据通过后端处理成Excel表格文件,再导出至浏览器

三、如何实现导入导出Excel数据(完整四部)

1、添加POI依赖:在Maven项目中,需要在pom.xml中添加以下依赖(也可使用Jar包,自行下载)

org.apache.poi

poi

4.1.2

org.apache.poi

poi-ooxml

4.1.2

2、JSP代码


3、Jquery代码

$("input[value='上传数据']").click(function () {

if (document.getElementById("file").files.length === 0) { //判断是否选择了文件

alert("请选择文件!")

}else {

if (confirm("是否确认上传已选择文件中的数据?")) {

let formData = new FormData() //创建FormData对象

formData.append("file", document.getElementById("file").files[0]) //将文件添加到FormData对象中

$.ajax({

url: "/ProjectName/Upload",

type: "POST",

data: formData,

/**

*必须false才会自动加上正确的Content-Type

*/

contentType: false,

/**

* 必须false才会避开Jquery对FormData的默认处理

* XMLHttpRequest会对FormData进行正确的处理

*/

processData: false,

success: function (data) {

if (data > 0) {

alert("上传成功!");

location.reload() //刷新页面

}

}

})

}

}

})

$("input[value='导出数据']").click(function () {

if (confirm("是否确认导出数据?")) {

window.location.href = "/ProjectName/ExportData";

}

})

4、Java代码

①、导入

package com.example.delete0513.Control;

import com.example.delete0513.BaseDao.BaseDao;

import org.apache.poi.ss.usermodel.CellType;

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 javax.servlet.ServletException;

import javax.servlet.annotation.MultipartConfig;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.Part;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.time.LocalDateTime;

import java.util.UUID;

@WebServlet("/Upload")

@MultipartConfig

public class Upload extends HttpServlet {

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

/*

* JavaWeb上传Excel文件且将数据存至MySQL数据库中

* 1、接收Excel文件且写入到本地磁盘中

* 2、读取Excel表格的同时将数据存入到MySQL数据库中

* 3、关闭资源

* 4、从本地磁盘中删除写入的Excel文件

* */

/*

* 1、接收Excel文件且写入到本地磁盘中

* */

//接收Excel文件

Part part = req.getPart("file"); //获取请求体中的数据(获取Part对象,Servlet将multipart/from-data的POST请求封装成了Part对象)

req.setCharacterEncoding("utf-8"); //设置请求体的编码

String fileName = part.getSubmittedFileName(); //通过Part对象得到上传的文件名

//写入到磁盘

int index = fileName.lastIndexOf("."); //得到文件名中最后一个点的下标

String suffix = fileName.substring(index); //通过文件名中最后一个点的下标得到文件的后缀

fileName = UUID.randomUUID() + suffix; //新生成一个随机文件名(随机生成一个UUID + 文件后缀)

System.out.println("新生成的随机文件名:" + fileName);

String path = "D:\\JavaProject\\Delete0513\\src\\main\\webapp\\Excel\\" + fileName; //定义要输出到的指定路径

part.write(path); //将上传的文件写入到指定路径(存入本地磁盘)

/*

* 2、读取Excel表格的同时将数据存入到MySQL数据库中

* */

File file = new File(path); //创建要读取的文件对象

FileInputStream in = new FileInputStream(file); //创建文件输入流

XSSFWorkbook excel = new XSSFWorkbook(in); //创建Excel工作簿对象(读取Excel文件)

XSSFSheet sheet = excel.getSheetAt(0); //获取第一个sheet页(下标从0开始)

int lastRowNum = sheet.getLastRowNum(); //获取到sheet页中后一行的下标,用于遍历数据做新增(注:获取的是最后一行的下标)

int affectedRow = 0; //初始受影响行数(用于响应给前端判断数据是否上传成功)

//遍历每一行数据

for (int i = 1; i <= lastRowNum; i++) {

XSSFRow row = sheet.getRow(i); //获取到每一行

if (row.getCell(0) == null) { //如果第一列为空则说明本行是空行,就跳过该行

continue;

}

int cellNum = row.getLastCellNum(); //获取到当前行的总列数,用于遍历数据做新增

//创建临时数组用于存放每一行数据便于后续做新增(作用:新增时作为注入参数传递给BaseDao控制层)

Object[] data = new Object[cellNum]; //长度为当前行的总列数

//遍历当前行的每一列数据

for (int j = 0; j < cellNum; j++) {

/*

* 因为本次测试的最后一列是时间类型数据,所以需要特殊处理

* */

if (j == cellNum - 1) { //判断是否为最后一列(实质是判断当前列是否为时间类型数据)

LocalDateTime time = row.getCell(j).getLocalDateTimeCellValue(); //获取单元格(时间类型数据)

data[j] = time.toString();

}else { //若不是时间类型数据则按常规操作进行读取

XSSFCell cell = row.getCell(j); //获取单元格

cell.setCellType(CellType.STRING); //设置单元格类型为字符串类型(因为Excel中的数据类型有多种,需要统一设置为字符串类型)

data[j] = cell.getStringCellValue(); //获取单元格数据并存入至临时数组作为注入参数用于后续新增

}

}

/*

* 将数据通过BaseDao控制层新增至MySQL数据库中

* */

try {

//每次新增数据的同时将受影响行数迭代给变量(受影响行数用于响应给前端判断数据是否上传成功)

affectedRow += new BaseDao().updateRow("insert into book(id,name,type,publisher,price,publicationTime) value(?,?,?,?,?,?)", data);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

//3、关闭资源

excel.close();

System.out.println("\n读取成功!" + path);

System.out.println("受影响行数:" + affectedRow);

//4、从本地磁盘中删除写入的Excel文件

System.out.println("是否从本地磁盘删除Excel文件成功:" + file.delete());

//将受影响行数响应给前端

resp.getWriter().println(affectedRow);

}

}

控制台:

②、导出

package com.example.delete0513.Control;

import com.example.delete0513.BaseDao.BaseDao;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.net.URLEncoder;

import java.util.List;

import java.util.Map;

@WebServlet("/ExportData")

public class ExportData extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

/*

* 将MySQL数据以Excel文件的形式导出

* 1、从数据库获取数据

* 2、创建Excel表的同时将数据写入至Excel文件内

* 3、将Excel文件以流的形式输出

* 4、关闭资源

* 5、删除Excel文件(不确定能否删除,因为刚生成的文件,可能无法删除)

* */

/*

* 1、从数据库获取数据

* */

List> data;

try {

//通过BaseDao层获取数据

data = new BaseDao().returnArbitraryDataStringType("select id,name,t.t_name,p.p_name,b.price,b.publicationTime from book b, type t,publisher p where b.type = t.t_id and b.publisher = p.p_id");

} catch (Exception e) {

throw new RuntimeException(e);

}

/*

* 2、创建Excel表的同时将数据写入至Excel文件内

* */

XSSFWorkbook excel = new XSSFWorkbook(); //创建工作簿对象

XSSFSheet sheet = excel.createSheet("第一页"); //创建工作表对象(创建一个sheet页并命名为"第一页")

XSSFRow firstRow = sheet.createRow(0); //在"第一页"中创建表头行(表头指ID,Name···),行数从0开始(此行为第一行)

System.out.println("表头行创建完成!");

//在表头行中创建列并设置值(列数从0开始)

firstRow.createCell(0).setCellValue("ID"); //在一行一列处创建单元格并设置值(序号)

firstRow.createCell(1).setCellValue("Name"); //在一行二列处创建单元格并设置值(名称)

firstRow.createCell(2).setCellValue("TypeName"); //在一行三列处创建单元格并设置值(类型名称)

firstRow.createCell(3).setCellValue("PublisherName"); //在一行四列处创建单元格并设置值(出版社名称)

firstRow.createCell(4).setCellValue("Price"); //在一行五列处创建单元格并设置值(价格)

firstRow.createCell(5).setCellValue("PublicationTime"); //在一行六列处创建单元格并设置值(出版时间)

System.out.println("表头行更新完成!");

//循环往Excel文件中写入数据

for (int i = 0; i < data.size(); i++) {

//得到要写入的数据

Map bookData = data.get(i);

//从Excel文件中的第二行开始创建行(因为第一行是表头(ID,Name···),所以从第二行开始创建和写入,即i+1)

XSSFRow row = sheet.createRow(i + 1); //在"第一页"中创建第i+1行(行数从0开始)

//在当前行中创建列并设置值

row.createCell(0).setCellValue(bookData.get("id")); //在当前行一列处创建单元格并设置值(序号)

row.createCell(1).setCellValue(bookData.get("name")); //在当前行二列处创建单元格并设置值(名称)

row.createCell(2).setCellValue(bookData.get("t_name")); //在当前行三列处创建单元格并设置值(类型名称)

row.createCell(3).setCellValue(bookData.get("p_name")); //在当前行四列处创建单元格并设置值(出版社名称)

row.createCell(4).setCellValue(bookData.get("price")); //在当前行五列处创建单元格并设置值(价格)

row.createCell(5).setCellValue(bookData.get("publicationTime")); //在当前行六列处创建单元格并设置值(出版时间)

}

//创建Excel文件对象

String fileName = "书籍信息数据登记.xlsx"; //设置导出Excel时的文件名

File file = new File("D:\\JavaProject\\Delete0513\\src\\main\\webapp\\Excel\\" + fileName); //创建Excel文件对象

//创建一个文件输出流

FileOutputStream fileOutputStream = new FileOutputStream(file);

//将Excel表格对象写入到Excel文件中

excel.write(fileOutputStream);

// 3、将Excel文件以流的形式输出

fileName = URLEncoder.encode(fileName,"UTF-8"); //设置导出Excel时的文件名(防止中文乱码)

resp.setContentType("application/vnd.ms-excel;chartset=utf-8"); //设置响应头,告诉浏览器返回的是一个Excel文件

resp.setHeader("Content-Disposition", "attachment;filename=" + fileName); //设置响应头,告诉浏览器返回的文件名

ServletOutputStream out = resp.getOutputStream(); //创建一个文件输出流

excel.write(out); //将Excel表格对象写入到Excel文件中

//4、关闭资源

out.flush(); //刷新输出流

out.close(); //关闭输出流

excel.close(); //关闭Excel表格对象

System.out.println("导出成功!");

System.out.println("文件是否删除成功:" + file.delete());

}

}

控制台

注:代码中的多数路径(项目路径、本地磁盘路径)需自己手动更改

看完点赞~人美心善

总结不易,希望宝宝们不要吝啬亲爱的👍哟(^U^)ノ~YO! 如有问题,欢迎评论区批评指正😁

加油站如何做卡塔尔世界杯主题营销活动?
中央确定全国十大城市:上海第1,成都第6,杭州入围