目录
如何理解导入导出Excel数据?
JavaWeb实现导入和导出Excel数据(Apache POI)的实际作用?
Java如何实现导入和导出Excel数据?
如何理解导入导出Excel数据?
导入效果:
导入Excel数据理解:将要批量新增的数据事先存入Excel表格中,再将表格上传至服务器通过后端处理进行批量新增至数据库中
导出效果:
导出Excel数据理解:将要查询的目标数据通过后端处理成Excel表格文件,再导出至浏览器
JavaWeb实现导入和导出Excel数据(Apache POI)的实际作用?
Java导入和导出Excel的功能在实际开发中具有广泛的应用,以下是一些常见的应用场景:
- 数据分析和报告生成:将大量数据从数据库或其他数据源中导出到Excel,以便进行进一步的分析和处理。导出结果可以通过Excel的各种功能(如公式、图表)进行可视化展示,并生成报告或数据汇总。
- 数据迁移和整合:将不同系统或文件格式的数据导入到Excel中,进行数据清洗、整理和转换,以便将数据导入到目标系统或进行数据集成。
- 数据交换和共享:通过导出Excel文件,可以将数据发送给他人进行查看、编辑或分析。Excel是一种通用的办公软件,几乎每个人都可以打开和处理Excel文件。
- 数据备份和恢复:将数据库或其他数据源的数据导出到Excel文件中,以便进行备份和恢复。如果发生数据丢失或系统故障,可以使用导出的Excel文件来恢复数据。
- 数据录入和编辑:通过导入Excel文件,可以从Excel中读取数据,并将其插入到数据库或其他数据源中。这对于批量录入或编辑大量数据非常方便和高效。
- 数据处理和转换:通过导入和导出Excel,可以进行各种数据处理和转换操作,如排序、筛选、计算、数据格式化等。这对于数据清洗、数据分析和数据转换非常有用。
总之,Java导入和导出Excel数据的功能可以帮助我们更方便地处理和分析数据,提高工作效率,并在不同系统和人员之间进行数据交换和共享。
Java如何实现导入和导出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++) { //i从1(第二行)开始是因为第一行是表头(ID,Name···)
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());
}
}
控制台:
注:代码中的多数路径(项目路径、本地磁盘路径)需自己手动更改
看完点赞~人美心善