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

yizhihongxing

一、前言

本文将介绍在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语言实现权重随机算法完整实例 什么是权重随机算法? 权重随机算法是指按照一定的权重来随机选择一项的算法。举个例子,假设我们有一些商品,每个商品都有一个权重,我们可以按照权重来随机选取一个商品。 实现思路 权重随机算法需要结合随机数和权重来实现。具体而言,我们通过生成一个随机数来决定选取哪个元素,选取的元素对应的权重越高,生成的随机数落在该权重所在的区…

    Java 2023年5月19日
    00
  • Java中的异常处理如何提高程序安全性?

    Java中的异常处理机制是提高程序安全性和稳定性的重要手段之一。它可以让我们在程序运行时捕获和处理可能发生的异常情况,以避免程序的崩溃或者无效输出。 以下是使用Java中的异常处理机制来提高程序安全性的一些攻略: 异常分类 在Java中异常是分为可检查异常和非可检查异常两种: 可检查异常(checked exception):指在编译阶段就可以预测并处理的异…

    Java 2023年4月27日
    00
  • Mybatis如何使用动态语句实现批量删除(delete结合foreach)

    下面是Mybatis如何使用动态语句实现批量删除(delete结合foreach)的完整攻略。 前置知识 在了解如何使用动态语句实现批量删除之前,需要先掌握以下知识: Mybatis的基本操作 SqlSession对象 Mapper.xml配置文件 foreach标签的用法 1. 参数准备 我们假设有一个表user,里面存储了许多用户信息。我们需要批量删除其…

    Java 2023年5月20日
    00
  • springboot2.3之后hibernate-validator依赖缺失【踩坑】

    当使用Spring Boot 2.3及以上版本时,可能会遇到hibernate-validator依赖缺失的问题。这是因为Spring Boot 2.3移除了hibernate-validator依赖,而将其替换为了jakarta.validation依赖。因此,在使用hibernate-validator时,需要手动添加jakarta.validation…

    Java 2023年5月20日
    00
  • Springboot开发OAuth2认证授权与资源服务器操作

    Spring Boot开发OAuth2认证授权与资源服务器操作 OAuth2认证授权是Web开发中非常实用的技术,解决了多种应用程序认证和权限的问题。在Spring Boot中集成OAuth2是一个非常流行的做法,本文将讲解如何使用Spring Boot来实现OAuth2认证和授权。 步骤 步骤1:创建Spring Boot项目 首先我们要创建一个Sprin…

    Java 2023年5月20日
    00
  • Java实例化类详解

    Java实例化类详解 在Java中,实例化类是创建类对象的过程。当我们创建一个类对象的时候,就可以使用该类所定义的方法和属性。 实例化类的基础知识 我们可以使用 new 关键字来创建一个类的实例,其基本语法如下: ClassName obj = new ClassName(); 其中,ClassName 是需要创建实例的类名,obj 是创建的对象名。在创建对…

    Java 2023年5月26日
    00
  • centOS7安装jdk1.8的方法

    当我们需要在CentOS 7服务器上安装Java开发工具包(JDK)1.8时,我们可以按照以下步骤进行操作: 步骤一:检查并更新系统包管理器 在开始安装过程前,建议先通过以下命令检查系统中是否已安装其他版本的JDK: java -version 如果输出结果显示当前系统中没有安装任何版本的JDK,则允许继续操作;如果已安装其它版本的JDK,则需要卸载旧版本,…

    Java 2023年5月19日
    00
  • 在vue中完美使用ueditor组件(cdn)解读

    在Vue中完美使用Ueditor组件(CDN)解读 UEditor是一款开源的富文本编辑器,我们可以在Vue项目中通过CDN引入UEditor组件来使用它。 步骤一:引入UEditor组件 我们可以在Vue组件的template部分直接嵌入UEditor组件,需要用到Ueditor的CDN地址。 <template> <div> &l…

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