Hi i,m JinXiang
⭐ 前言 ⭐
本篇文章主要介绍Java实现读写Excel表格数据的详细使用以及部分理论知识
🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁
🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言
一、使用两种方法添加Maven依赖
1、在java项目内部中导入Maven依赖(图片详细操作解释)
①、创建一个java项目,找到目录下“pom.xml”配置文件
②、把以下代码 放入pom.xml配置文件中
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
③、点击按钮导入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包,自行下载)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
2、JSP代码
<input type="file" name="file" id="file">
<input type="button" value="上传数据"><br>
<input type="button" value="导出数据">
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<Map<String, String>> 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<String, String> 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! 如有问题,欢迎评论区批评指正😁