JSP实现从数据库导出数据到Excel下载的方法

一、前言

本文将介绍在JSP中如何通过JDBC连接数据库,并将从数据库中查询到的数据导出为Excel文件进行下载。下面是本文所需要用到的前置条件:

1.已安装JDK环境并配置好环境变量
2.已安装Tomcat服务器并成功启动
3.已安装MySQL数据库

二、数据库连接以及查询操作

首先我们需要用到JDBC连接数据库,实现之前需要导入MySQL对应的JDBC驱动包,这里以mysql-connector-java-8.0.21.jar为例:

<%@ page language="java" import="java.sql.*" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%
    //连接数据库
    String driver = "com.mysql.cj.jdbc.Driver"; // MySQL驱动程序
    String url = "jdbc:mysql://localhost:3306/db_name?useSSL=true&serverTimezone=UTC"; // 数据库
    String user = "username"; // 数据库用户名
    String password = "passwd"; // 数据库密码
    Connection conn = null;
    Statement pstmt = null;
    try {
        Class.forName(driver); // 加载驱动程序
        conn = DriverManager.getConnection(url, user, password); // 连接数据库
        if (conn != null) {
            System.out.println("连接成功!");
            String sql = "SELECT * FROM user";
            pstmt = conn.createStatement();
            ResultSet rs = pstmt.executeQuery(sql);
            while (rs.next()) {
                String name = rs.getString("name");
                int age = rs.getInt("age");
                out.println("name:" + name + "&nbsp;age:" + age + "<br>");
            }
            rs.close();
            pstmt.close();
            conn.close();
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (pstmt != null) {
                pstmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
%>

代码中数据库连接信息如下:

1、驱动:com.mysql.cj.jdbc.Driver

2、数据库地址:jdbc:mysql://localhost:3306/db_name?useSSL=true&serverTimezone=UTC

3、用户名:username

4、密码:passwd

这里我们通过JDBC连接数据库,并查询了名为user的表中的所有数据。注意:连接成功后一定要关闭连接。

三、用POI将数据写入EXCEL文件

接下来,我们将查询出来的数据写入Excel文件中。这里我们需要用到POI库,Poi是一款apache组织开发的用于操作excel的Java类库,其核心是由POI API库构成,api包以及依赖有以下几个:

1.poi-3.17.jar

2.poi-ooxml-3.17.jar

3.poi-ooxml-schemas-3.17.jar

4.xmlbeans-2.3.0.jar

<%@ page import="java.io.File" %>
<%@ page import="java.io.FileOutputStream" %>
<%@ page import="java.io.IOException" %>
<%@ page import=" org.apache.poi.hssf.usermodel.HSSFWorkbook" %>
<%@ page import=" org.apache.poi.ss.usermodel.*" %>
<%
    //连接数据库
    String driver = "com.mysql.cj.jdbc.Driver"; // MySQL驱动程序
    String url = "jdbc:mysql://localhost:3306/db_name?useSSL=true&serverTimezone=UTC"; // 数据库地址
    String user = "username"; // 数据库用户名
    String password = "passwd"; // 数据库密码
    Connection conn = null;
    Statement pstmt = null;
    try {
        Class.forName(driver); // 加载驱动程序
        conn = DriverManager.getConnection(url, user, password); // 连接数据库
        if (conn != null) {
            System.out.println("连接成功!");
            String sql = "SELECT * FROM user";
            pstmt = conn.createStatement();
            ResultSet rs = pstmt.executeQuery(sql);
            //创建Excel对象
            Workbook wb = new HSSFWorkbook();
            Sheet sheet = wb.createSheet("user");
            Row row0 = sheet.createRow(0);
            Cell cell_0_0 = row0.createCell(0);
            Cell cell_0_1 = row0.createCell(1);
            cell_0_0.setCellValue("姓名"); 
            cell_0_1.setCellValue("年龄");
            int index=1;
            while (rs.next()) {
                Row row = sheet.createRow(index++);
                Cell cell1 = row.createCell(0);
                Cell cell2 = row.createCell(1);
                cell1.setCellValue(rs.getString("name"));
                cell2.setCellValue(rs.getInt("age"));
            }
            //写入文件
            String fileName = "user.xls";
            File file = new File(fileName);
            FileOutputStream fos = new FileOutputStream(file);
            wb.write(fos);
            fos.close();
            out.println("导出成功!");
            rs.close();
            pstmt.close();
            conn.close();
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (pstmt != null) {
                pstmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
%>

以上代码借助POI来创建Excel对象,并将数据遍历写入Excel文件中,最终导出的Excel文件名为:user.xls。

四、下载功能的实现

将Excel文件成功生成后,这里我们介绍如何通过浏览器直接对生成的Excel文件下载。这里我们引入一个Java下载的servlet:ServletFiledownload。

在实际应用中,当用户请求下载时,先调用Servlet,在Servlet中设置Response对象的内容类型和Header,然后将Excel文件通过IO流下载到用户的计算机上。

步骤如下:

1.将下载用的文件放入WebContent下的download目录下;
2.配置web.xml;
3.编写Servlet。

示例代码:

web.xml:

  <servlet>
        <servlet-name>DownloadServlet</servlet-name>
        <servlet-class>com.learn.DownloadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DownloadServlet</servlet-name>
        <url-pattern>/download</url-pattern>
    </servlet-mapping>

DownloadServlet.java:

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class DownloadServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        String filename="user.xls";
        String filePath = request.getServletContext().getRealPath("/download/"+filename);
        File file=new File(filePath);
        if(!file.exists()){
            out.println("亲,你要下载的文件不存在哦!");
            return ;
        }
        response.setHeader("Content-Disposition", "attachment;filename="
                +new String(filename.getBytes("utf-8"),"ISO-8859-1"));
        byte[] buffer=new byte[1024];//缓冲区大小
        FileInputStream fis=null;//文件输入流
        BufferedInputStream bis=null;//缓冲输入流
        try {
            fis=new FileInputStream(file);//文件流
            bis=new BufferedInputStream(fis);
            OutputStream os=response.getOutputStream();//输出流
            int i=bis.read(buffer);//读
            while(i!=-1){
                os.write(buffer,0,i);//写
                i=bis.read(buffer);
            }
            out.println("下载成功!");
            bis.close();
            fis.close();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            bis.close();
            fis.close();
        }
    }
}

以上代码实现了当用户请求/download/user.xls时,自动下载WebContent/download/下的user.xls文件。

至此,JSP实现从数据库导出数据到Excel下载的方法已经完成。

参考链接:

  1. http://poi.apache.org/
  2. https://www.jianshu.com/p/4f4c3f23a9ea
  3. https://www.cnblogs.com/hdd-le/p/10301159.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP实现从数据库导出数据到Excel下载的方法 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java截取字符串的方法

    当处理字符串时,Java提供了多种截取字符串的方式,本文针对这些方法进行详细的讲解,方便读者学习并掌握该技能。 序号方式截取字符串 通过char数组序号的方式截取字符串是Java中最常见的一种方法。该方式是基于Java中String类中的toCharArray()方法,可以将字符串按指定长度分解为多个字符的序列,然后通过循环遍历序列获取需要的部分。 Stri…

    Java 2023年5月26日
    00
  • 微信小程序开发实现首页弹框活动引导功能

    下面是“微信小程序开发实现首页弹框活动引导功能”的详细攻略: 步骤一:创建活动弹框组件 在项目中创建一个名为activity-modal的活动弹框组件。 在activity-modal组件的WXML文件中定义一个自定义弹框,并设置其显示和隐藏的属性: <view class="activity-modal" hidden=&quot…

    Java 2023年5月23日
    00
  • Docker 容器虚拟化的实用技巧总结

    Docker 容器虚拟化的实用技巧总结 1. Docker 简介 Docker 是一个开源的应用容器引擎,可以方便地将应用程序打包成一个独立的容器,运行于任意的平台上。 2. Docker 容器的基本操作 2.1 容器的创建和启动 容器的创建和启动可以通过以下命令实现: $ docker run <image_name> <command&…

    Java 2023年6月15日
    00
  • Java RSA加密解密实现方法分析【附BASE64 jar包下载】

    Java RSA加密解密实现方法分析 本文介绍了Java中RSA加密解密的实现方法。主要讲解了如何生成密钥对、如何进行加密解密、如何将密钥序列化和反序列化等操作。同时为了方便实际开发,我们也提供了BASE64 jar包下载链接。 生成密钥对 首先我们需要使用Java中的KeyPairGenerator类来生成RSA密钥对。代码如下: KeyPairGener…

    Java 2023年5月20日
    00
  • Java 日志打印的15个好建议

    Java 日志打印的15个好建议 在Java开发中,日志是一个非常重要的工具。它可以帮助开发人员定位和解决问题。在使用日志时,遵循以下的15个好建议将会让日志发挥最大的作用。 1. 使用不同的日志级别 在Java中,常用的日志级别从低到高分别是DEBUG、INFO、WARN、ERROR、FATAL。在使用日志时,应该根据需要选择不同的日志级别。例如,在调试时…

    Java 2023年5月26日
    00
  • jsp的九大内置对象深入讲解

    一、JSP九大内置对象 JSP的九大内置对象是指:1. request:封装客户端的请求,其中包含了与HTTP请求相关的信息,例如:请求参数、头信息等;2. response:封装服务器对客户端的响应,其中包含了HTTP响应本身以及向客户端发送的数据;3. pageContext:JSP页面上下文,包含了对该JSP页面的Servlet上下文、请求、响应等对象…

    Java 2023年6月15日
    00
  • Spark SQL配置及使用教程

    Spark SQL 配置及使用教程 简介 Apache Spark 是一个快速、通用的大数据处理引擎,Spark SQL 是 Spark 的一个组件,支持使用 SQL、HiveQL 和 Scala 进行结构化数据处理。 本文将介绍 Spark SQL 的配置及使用教程,包括 Spark SQL 的配置、数据源加载、表操作、SQL 查询等内容,以及两个具体的示…

    Java 2023年5月19日
    00
  • 这可能是最全面的MySQL面试八股文了

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。 数据库的三大范式 第一范式1NF 确保数据库表字段的原子性。最全面的Java面试网站 比如字段 userInfo:…

    Java 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部