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

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! 如有问题,欢迎评论区批评指正😁

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用的代码展示了使用pandas库来读取Excel表格数据的方法。首先需要导入pandas库,然后使用`pd.read_excel`函数来读取Excel文件的数据。通过该函数的`values`属性可以获取表格中所有的数据,`columns.values`属性可以获取第一行的数据,`iloc[:, 0].values`可以获取第一列的数据,`iloc`可以获取第一行第一列的数据。代码则展示了使用xlwt和xlrd库来进行Excel表格文件的增删读写操作。这种操作方法相对繁琐,但是通俗易懂。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python:使用pandas读取Excel表格数据的完整源代码](https://blog.csdn.net/uote_e/article/details/130834183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python Pandas操做Excel表格文件:建立新表格,追加数据](https://blog.csdn.net/weixin_35377028/article/details/116164900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python Pandas实现简单Excel数据表合并](https://blog.csdn.net/dfljt/article/details/124187854)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值