目录

如何理解导入导出Excel数据?

JavaWeb实现导入和导出Excel数据(Apache POI)的实际作用?

Java如何实现导入和导出Excel数据?


如何理解导入导出Excel数据?

导入效果:

java excel导出 XSSFWorkbook 浏览器无法下载 javaweb导出excel表格_数据

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

导出效果:

java excel导出 XSSFWorkbook 浏览器无法下载 javaweb导出excel表格_数据_02

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

JavaWeb实现导入和导出Excel数据(Apache POI)的实际作用?

Java导入和导出Excel的功能在实际开发中具有广泛的应用,以下是一些常见的应用场景:

  1. 数据分析和报告生成:将大量数据从数据库或其他数据源中导出到Excel,以便进行进一步的分析和处理。导出结果可以通过Excel的各种功能(如公式、图表)进行可视化展示,并生成报告或数据汇总。
  2. 数据迁移和整合:将不同系统或文件格式的数据导入到Excel中,进行数据清洗、整理和转换,以便将数据导入到目标系统或进行数据集成。
  3. 数据交换和共享:通过导出Excel文件,可以将数据发送给他人进行查看、编辑或分析。Excel是一种通用的办公软件,几乎每个人都可以打开和处理Excel文件。
  4. 数据备份和恢复:将数据库或其他数据源的数据导出到Excel文件中,以便进行备份和恢复。如果发生数据丢失或系统故障,可以使用导出的Excel文件来恢复数据。
  5. 数据录入和编辑:通过导入Excel文件,可以从Excel中读取数据,并将其插入到数据库或其他数据源中。这对于批量录入或编辑大量数据非常方便和高效。
  6. 数据处理和转换:通过导入和导出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);
    }
}

控制台: 

java excel导出 XSSFWorkbook 浏览器无法下载 javaweb导出excel表格_apache_03

导出: 

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());
    }
}

控制台:

java excel导出 XSSFWorkbook 浏览器无法下载 javaweb导出excel表格_数据_04

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

看完点赞~人美心善