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 8 stream表达式实现if/else逻辑

    在Java 8中,Stream API已成为编写更具可读性和功能性的代码的核心。 在Stream API中实现if/else逻辑可以使用filter()和forEach()方法配合完成。 在filter()中我们可以输入lambda表达式作为参数,作为逻辑判断的条件。而在forEach()中,我们可以输入lambda表达式来处理符合条件的流。 下面为你提供两…

    Java 2023年6月15日
    00
  • Spring超详细讲解BeanUtils改造

    Spring超详细讲解BeanUtils改造攻略 1. 背景 在Spring框架中,BeanUtils是一个非常常用的工具类。它提供了许多方法来进行JavaBean之间的属性复制。然而,在实际应用中,我们可能需要对BeanUtils进行一些自定义的扩展,以满足业务的需求。本攻略将介绍如何进行BeanUtils的改造,以便更好地使用它来满足实际业务需求。 2.…

    Java 2023年5月19日
    00
  • Java程序控制逻辑—流程控制

    关于“Java程序控制逻辑—流程控制”的完整攻略,我会从以下几个方面进行讲解: 流程控制的基本概念 条件语句 循环语句 例子说明 1. 流程控制的基本概念 在编写Java程序时,我们需要按照一定的逻辑来控制程序的执行顺序。流程控制就是指通过条件判断和循环来控制程序中语句的执行顺序,使程序按照我们设定的逻辑进行。 Java的流程控制主要有两种:条件语句和循环语…

    Java 2023年5月23日
    00
  • 4种java复制文件的方式

    当需要对文件进行复制操作时,可以采用Java的文件IO流来实现。下面介绍4种Java复制文件的方式。 1.使用FileChannel实现文件复制 通过FileChannel实现文件复制的方式,可以使用FileInputStream、FileOutputStream或RandomAccessFile打开文件通道,使用transferFrom或transferT…

    Java 2023年5月20日
    00
  • Java的MyBatis框架中Mapper映射配置的使用及原理解析

    下面是针对“Java的MyBatis框架中Mapper映射配置的使用及原理解析”的完整攻略: 1. Mapper映射配置的基本概念 在MyBatis框架中,Mapper映射配置是用来描述Java对象和SQL语句之间映射关系的XML文件。通过配置Mapper,MyBatis可以根据SQL语句自动生成相应的Java代码。 一个Mapper的配置文件通常包括以下几…

    Java 2023年5月20日
    00
  • IDEA版最新MyBatis程序配置教程详解

    下面为你详细讲解“IDEA版最新MyBatis程序配置教程详解”的完整攻略。 一、MyBatis概述 MyBatis是一款支持自定义SQL、存储过程以及高级映射的优秀持久化框架。如果你想更好地使用MyBatis,你需要了解MyBatis的运行原理及配置。 二、IDEA版最新MyBatis程序配置教程详解 2.1 创建Maven工程 首先,在IDEA中创建一个…

    Java 2023年5月19日
    00
  • asp.net服务器端指令include的使用及优势介绍

    ASP.NET服务器端指令include的使用及优势介绍 在ASP.NET中,服务器端包含指令include可以实现代码重用、模块化开发,提高代码重用性,便于代码维护,同时还能提高代码的可读性。本攻略将详细讲解ASP.NET服务器端指令include的使用及优势介绍。 一、服务器端指令include的语法格式 使用服务器端指令include,我们可以以简洁的…

    Java 2023年6月15日
    00
  • 浅析JSP的9大内置对象和4大作用域对象

    浅析JSP的9大内置对象和4大作用域对象 JSP(JavaServer Pages)是一种基于Java语言,用于创建动态web页面的技术。当客户端请求JSP页面时,Tomcat服务器会解析JSP页面,将其中的Java代码转化为标准的Servlet,并执行Servlet,最后将生成的HTML页面返回给客户端。 在JSP页面中,有9大内置对象和4大作用域对象,这…

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