工欲善其事必先利其器

前言:


今天的内容开始之前,我先申明一下,今天的知识很重要! 很重要! 很重要 ,Excel表格的导出在正式步入公司之后这个几乎是所有程序员必须会的一个知识点,说起来很简单,可是很多人居然都不会,今天我们特地拿出来说一下,一定要认真看,下去一定要自己多去练习几次。想要拿高薪,就好好学习吧,骚年们!

接下来我们就来一步步学习研究一下,如何利用java实现Excel表格的导出。

一、认识Excel表格

这个一定要认识,不然你理解下面的代码就会有点费劲,看图:

erp java框架 java做erp_mysql


上面这幅图就是一张标准的空白的Excel文档,首先一个这样的Excel文件就被称作一个工作薄(workbook),其中在一个工作薄中会有很多和工作表(sheet)就在下方我们可以看到,在一张工作表中会有很多的行(row)和列(cell)。

ok以上就是关于Excel组成的基本部分

二、创建web工程

在这里我们使用最普通的java-web项目。如果这一块有疑惑的,去看一下我的另一篇博客,web项目的创建,使用的工具是Idea2020,mysql数据库,没有数据库的可以去下载一个。我就不多阐述了。

1.创建一个新的web项目dowmload_ecxel

erp java框架 java做erp_poi_02


项目创建好之后我们去将tomcat服务器启动一下,看看项目创建是否成功

erp java框架 java做erp_mysql_03


erp java框架 java做erp_java_04

2.连接数据库

2.1 建库建表

项目成功启动之后,我们先来连接数据库,在连接数据库之前,我们要先在数据库中去创建一套测试数据,供我们今天使用,和后期你们使用的正式数据是一样的道理。在这里我们使用图形化工具SQLyog来建库建表。

erp java框架 java做erp_erp java框架_05


erp java框架 java做erp_erp java框架_06

在表中我们填充几行表记录(这个可以自行编写,只是为了测试)

erp java框架 java做erp_mysql_07

2.2 连接数据库

在库表数据都建好的情况下我们接下来就可以连接数据库,首先在项目中创建com.tf.utils的包结构,然后再utils包下创建连接数据库的工具类JDBCUtil

erp java框架 java做erp_sql_08


接下来,我们要在JDBCUtil类中编写连接数据库的业务代码,即JDBC代码,

,这里我们需要导入一个jar包,

mysql-connector-java-8.0.21.jar

package com.rf.utils;

import java.sql.*;

/**
 * 用来连接数据库的工具类
 * @author 瑞飞
 * @version 1.0
 * */
public class JDBCUtil {
    //声明传输器对象
    Statement stmt =null;
    //申明结果集对象
    ResultSet rs = null;

    /**
     * 获取数据库的连接
     * @author 瑞飞
     * @return Connection 返回值数据库连接对象
     * */
    public static Connection getConnection(){
            //1.声明数据库连接
            Connection con=null;
        try {
            //2. 注册数据库JDBC驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");
            //3.准备连接数据库需要使用的url地址,用户名与密码
            String url ="jdbc:mysql://localhost:3306/excel?serverTimezone=GMT%2B8";
            String username="root";
            String password="root";
            con= DriverManager.getConnection(url,username,password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("加载驱动失败,驱动类找不到异常");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库连接信息有误,连接失败");
        }

        return con;
    }

    /**
     * 执行数据库操作语句
     * @author 瑞飞
     * @return ResultSet 结果集对象
     * */
    public ResultSet getQuery(String sql){
        Connection conn = getConnection();
        try {
            //1.通过连接获取传输器对象
            stmt =conn .createStatement();
            //2.通过传输器执行sql语句并返回结果
            rs=stmt.executeQuery(sql);
          
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return rs;
    }

	

   /**
    * 通过main方法测试数据库连接是否成功
    * */
   public static void main(String[] args) {
       Connection connection = getConnection();

       if (connection!=null){
           System.out.println("数据库连接成功");
       }else{
           System.out.println("数据库连接失败");
       }
   }

}

测试结果数据库连接正常,我们进行下一步。

2.3 通过JDBC连接去查询数据库中的数据

在com.rf下创建dao包,dao包下创建StudentDao类

erp java框架 java做erp_sql_09


编写业务代码,查询数据库数据,并进行测试

package com.rf.dao;
import com.rf.utils.JDBCUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
 * 通过JDBC操作数据库
 * @author 瑞飞
 * @version 1.0
 * */
public class StudentDao {

    //查询数据库excel中student表的数据
    public static List<HashMap<String ,Object>> queryStudents(String sql){
            List<HashMap<String,Object>> list =null;
            //1.声明JDBCUtil工具类对象
            JDBCUtil ju = new JDBCUtil();
        try {
            //2.调用工具方法
            ResultSet rs = ju.getQuery(sql);
            //3.声明一个map集合,一个list集合
            list =new ArrayList<HashMap<String, Object>>();
            HashMap<String,Object>map=null;
            while (rs.next()){
                map=new HashMap<>();
                map.put("id", rs.getInt("id"));
                map.put("username", rs.getString("username"));
                map.put("password", rs.getString("password"));
                list.add(map);
            }
            //4.关闭数据库连接
            ju.conClose();
        } catch(SQLException e){
            e.printStackTrace();
        }
            return list;
    }
    //测试是否可以成功查询到数据库数据
    public static void main(String[] args) {
        String sql="select*from student";
        List<HashMap<String, Object>> hashMaps = queryStudents(sql);
        System.out.println(hashMaps);
    }
}
2.4 编辑前端页面

测试成功之后我们来编写一个简单的前端页面,开始写之前老规矩要导入两个jar包:taglibs-standard-impl-1.2.5.jar-------jstl.jar

<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.rf.dao.*" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>java中导出Excel测试页面</title>
    <style type="text/css">
      .tab tr td{border: 1px solid red}
    </style>
  </head>
  <body>
  <%
    String sql="select*from student";
    List<HashMap<String, Object>> students = StudentDao.queryStudents(sql);
    pageContext.setAttribute("students", students);
  %>
  <table class="tab">
    <tr>
      <td>id编号</td>
      <td>用户名</td>
      <td>密码</td>
    </tr>
    <c:forEach var="student" items="${students}">
      <tr>
        <td>${student.id}</td>
        <td>${student.username}</td>
        <td>${student.password}</td>
      </tr>
    </c:forEach>
  </table>
  <a href="hello">下载表单明细</a>
  </body>
</html>

看一下页面效果

erp java框架 java做erp_sql_10


同时这里要配置一下web.xml文件,还要创建一个Servlet类

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>com.rf.Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

erp java框架 java做erp_java_11

2.5 编写Excel下载工具类

页面设置完成之后,我们就要开始编写Excel下载的工具类了,也是今天的重头戏,
同样在com.rf.utils包下创建一个EcxcelUtil类,导入poi函数库的jar包(有点多)

commons-math3-3.6.1.jar
 poi-4.1.2.jar
 poi-examples-4.1.2.jar
 poi-excelant-4.1.2.jar
 poi-ooxml-4.1.2.jar
 poi-ooxml-schemas-4.1.2.jar
 poi-scratchpad-4.1.2.jar


,接下来我们开始在ExcelUtil类中编写下载Excel的业务代码。

package com.rf.utils;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

import java.util.HashMap;
import java.util.List;

/**
 * Excel表格下载的工具类
 *
 * 备注:在这里我们使用poi函数库完成Excel的下载,这也是目前的主流方法,poi是Apache基金会提供的开源免费的
 * 提供API给Java,实现对Microsoft office 进行操作的一系列功能
 * @author 瑞飞
 * @version 1.0
 * */
public class ExcelUtil {

    /**
     * 实现Excel表格的导出下载
     * @author 瑞飞
     * @param list 数据库查到的学生数据的集合
     * @version 1.0
     * @return HSSFWorkbook Excel工作薄对象
     * */
    public static HSSFWorkbook ecportExcel(List<HashMap<String,Object>> list){
        //1.创建一个Excel对象即一个工作薄
        HSSFWorkbook wb = new HSSFWorkbook();
        //2.创建一个工作表即sheet 这里的createSheet()方法可以传入一个参数,即sheet的名字,也可不传
        HSSFSheet sheet = wb.createSheet();
        //3.在sheet中创建表头(即第一行的行对象)
        HSSFRow row = sheet.createRow(0);
        //4.申明一个表头将要用到的标题
        String[] title={"id编号","学生姓名","密码"};
        //5.给表头设置一个居中的样式
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        //6.声明sheet中的列对象
        HSSFCell cell =null;
        //7.设置表头的内容
        for (int i=0;i<title.length;i++){
            //创建列
            cell = row.createCell(i);
            //设置列的内容
            cell.setCellValue(title[i]);
            //设置列中内容的样式
            cell.setCellStyle(style);
        }
        //8.在sheet工作表中添加数据
        for (int i=0;i<list.size();i++){
            //创建行
            row=sheet.createRow(i+1);
            //创建列
            cell = row.createCell(0);
            //样式
            cell.setCellStyle(style);
            //列中的样式
            cell.setCellValue(String.valueOf(list.get(i).get("id")));

            cell = row.createCell(1);
            cell.setCellStyle(style);
            cell.setCellValue(String.valueOf(list.get(i).get("username")));
            cell = row.createCell(2);
            cell.setCellStyle(style);
            cell.setCellValue(String.valueOf(list.get(i).get("password")));
        }
        return wb;
    }
}
2.6 下载Excel的servlet

接下来就要在刚刚创建的Servlet类中编写下载Excel的控制层代码,如下

package com.rf;

import com.rf.dao.StudentDao;
import com.rf.utils.ExcelUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

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.IOException;
import java.util.HashMap;
import java.util.List;

public class Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //先获取数据库中学生的数据信息
        String sql="select*from student";
        List<HashMap<String, Object>> list = StudentDao.queryStudents(sql);
        System.out.println("开始下载");
        long l = System.currentTimeMillis();
        HSSFWorkbook wb = ExcelUtil.ecportExcel(list);
        //设置下载的excel的名字
        String fileName="学生信息"+System.currentTimeMillis()+".xls";
        //响应到客户端
        fileName=new String(fileName.getBytes(), "ISO8859-1");
        //设置响应的类型
        response.setContentType("application/octet-stream;charset=UTF-8");
        //扩展内容
        response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
        //游览器设置不缓存
        response.addHeader("Pargam", "no-cache");
        response.addHeader("Cache-Control", "no-cache");
        //获取响应流
        ServletOutputStream os = response.getOutputStream();
        //将wb写出响应流中
        wb.write(os);
        //刷出
        os.flush();
        //关流
        os.close();
        long l1 = System.currentTimeMillis();
        System.out.println(l1-l);
        System.out.println("下载结束");
    }
}
2.7 下载测试

万事俱备,只差东风,所有的都准备好之后,我们只需要启动我们的项目,这里即tomcat,然后在我们的页面进行下载测试即可,遇到问题都可以在下面留言或是私聊我,一起讨论。

好了,同胞们,关于Excel的下载到这里就全部结束了,里面有一些要注意的点,我在结尾的地方给大家总结一下,
注:
1.连接数据库的用户名和密码。是我们在安装数据库的时候设置过的,mysql默认的端口是3306,如果我们自己修改过,一定要按修给过的撰写
2.数据库的图形化工具有很多,只要能创库创表创建数据就ok,不同的工具,不同版本,大家可以自行百度用法,有很多。
3.API并不难,熟能生巧,多练习,多学习,多进步,才能不辜负自己,加油,程序猿们!
4. 引用狂神的话:拒绝白嫖,最起码给个三连(点击,关注,转发一定要注明出处,或是带上我的链接)
5.项目用到的所有jar都可以在网上去下载,如果有找不到的,可以私聊我发给你。