工欲善其事必先利其器

前言:

最好的学习方式就是分享,喜欢就三连一下吧(关注,转发,点赞)。

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

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

一、认识Excel表格

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

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

二、创建web工程

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

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


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

2.连接数据库

2.1 建库建表

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

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

2.2 连接数据库

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

接下来,我们要在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类

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

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>

看一下页面效果

同时这里要配置一下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>

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都可以在网上去下载,如果有找不到的,可以私聊我发给你。

工作系列Java开发之利用Java实现ERP系统中Excel表格的导出相关推荐

  1. Java开发知识之Java面相对象

    Java开发知识之Java面相对象上 一丶什么是面相对象 了解什么什么是面相对象.那么首先要了解什么是面相过程. 面相过程的意思就是. 什么事情都亲力亲为. 比如上一讲的排序算法. 我们自己写的. 这 ...

  2. Java开发知识之Java中的集合上List接口以及子类讲解.

    Java开发知识之Java中的集合类 一丶什么是集合类 如果你学习说数据结构,那么学习集合就很简单. 因为集合就是存储数据的结构. 例如 有链表结构 (list ) 还有 map结构.等等. 集合类就 ...

  3. Java开发知识之Java的异常处理

    Java开发知识之Java的异常处理 一丶异常概述 在讲解异常之前,我们要搞清楚.什么是异常. 通俗理解就是我们编写的程序出问题了.进行处理的一种手段. 比如我们的QQ.有的时候就崩溃了.比如出现xx ...

  4. Java开发知识之Java的包装类

    Java开发知识之Java的包装类 一丶什么是包装类 包装类的意思就是对基本数据类型封装成一个类.这些类都是Number的子类.区别就是封装数据类型不同.包含的方法基本相同. 具体可以查询JAVA A ...

  5. JAVA练习:利用JAVA基本语句实现打印日历

    已知1900年1月1日是星期一,要求打印输入年月的日历. 输出结果格式: 日    一    二    三    四    五    六                                 ...

  6. JAVA基础再回首(一)——基本概念、JAVA开发工具、JAVA基本语法

    JAVA基础再回首(一)--基本概念.JAVA开发工具.JAVA基本语法 学了java,做了android应用开发,现在回想起来,真的是一路坎坷..我在上章博客中提到了我以后的几个学习计划和目标就是把 ...

  7. 新课重磅发布-Java开发微信朋友圈PC版系统(架构2.0+分布式中间件)

    继"Java开发微信朋友圈PC版系统-架构1.0" 课程之后,debug这段时间日撸夜撸,终于赶在春节放假前给诸位带来了这一系统的架构2.0版本,特此分享给诸位进行学习,以掌握.巩 ...

  8. Java EXCEL 表格导入导出(带下拉选-带VLOOKUP函数封装)

    Java EXCEL 表格导入导出(带下拉选-带VLOOKUP函数封装) 对于excel Java POI 使用 目前简单导出导入功能网上很多,但是对于有下拉选,样式等缺点却是最大硬伤,故此封装一个通 ...

  9. python在什么系统中开发_Python虚拟开发环境,怎样才能在系统中创建

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于python 青少年编程 ,作者python expert 今天小 ...

最新文章

  1. 吴恩达机器学习笔记 —— 18 大规模机器学习
  2. 将 Shiro 作为应用的权限基础
  3. php和python交互-Python如何实现简单的用户交互程序(示例)
  4. Chrome 插件开发-桌面通知设置实战演示,设置通知显示、存在时间
  5. 广度优先搜索_广度优先搜索(BFS)
  6. ML:推荐给小白入门机器学习一系列书籍
  7. 企业生产经营相关英文及缩写之(9)--称号/部门/公司
  8. easyconnect无法在mac上使用_Mac上Python无法输入中文- 2017年
  9. mysql一次更新内容大于4M时报错修改max_allowed_packet变量
  10. linux下kafka安装与配置
  11. RabbitMQ的基础知识与使用
  12. ue4下载安装(学习笔记)
  13. matlab中怎么设置母线,Matlab绘图教程
  14. 对待员工的4个阶段:我如何让员工过好自己的一生?
  15. sql 修改时间正价 2天_“熬夜3天,修改17遍,我终于写出了1篇稿费2万的稿子”...
  16. 督查督办管理系统适合什么企业
  17. 啥是“quoting reference XXX” 递交申请材料时
  18. 第六章 网络学习相关技巧1(最优路径梯度)
  19. 5G中传和回传的承载解决方案
  20. smart夏季的笑话

热门文章

  1. 快速建站(织梦CMS)
  2. 真假蜘蛛识别php,两招教你轻松识别百度真假蜘蛛(实操教程)
  3. CVX 工具箱(安装及用户指南)
  4. 透明颜色代码 和 一键分享问题
  5. 【风力发电机组】基于simulink风速模型仿真
  6. 电脑显示服务器意外终止,Win7提示Dcom Server Process Launcher服务意外终止怎么办?...
  7. 泛函分析笔记(二)选择公理和佐恩引理
  8. Yann LeCun在线访谈:我的深度学习之路
  9. 嫦娥五号返回器携带月壤成功着陆地球!一文读懂你关心的六大问题
  10. JointJS入门实例01-补充第一篇在JOINTJS元素中使用HTML