我们经常需要将MYSQL里的表导出成为Excel表格,这样可以使用Excel表格自带的许多工具,也更方便那些非计算机专业的人员浏览。

Java中为我们提供了两种方式来实现,一种是POI,一种是阿里的easyExcel。这里我介绍得是POI功能,因为阿里的easyExcel功能虽然代码上更容易理解,但是容易和别的依赖冲突,因此不在这里介绍,感兴趣的朋友可以自己去搜索一下。

1、导入Maven依赖

<!-- 导出表格poi依赖03版本-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>

        <!-- 导出表格poi依赖07版本-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

03版本的支持.xls文件,07版本兼容了.xlsx和.xls文件,因此推荐大家使用07版本的依赖,或者两个都添加也没有关系

2、代码编写

String PATH = "C:\\Users\\asus\\Desktop\\";
        String fileName=PATH+"orders_"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ".xlsx";
        // 1.创建工作簿
        Workbook workbook = new XSSFWorkbook();
        // 2.创建表名
        Sheet sheet = workbook.createSheet("订单表");
        //3.创建单元格并写入数据
        Row rowHead=sheet.createRow(0);
        rowHead.createCell(0).setCellValue("订单号");
        rowHead.createCell(1).setCellValue("用户名");
        rowHead.createCell(2).setCellValue("手机号");
        rowHead.createCell(3).setCellValue("地址");
        rowHead.createCell(4).setCellValue("收货人");
        rowHead.createCell(5).setCellValue("实收金额");
        rowHead.createCell(6).setCellValue("支付方式");
        rowHead.createCell(7).setCellValue("下单时间");
        rowHead.createCell(8).setCellValue("结账时间");
        rowHead.createCell(9).setCellValue("订单状态");

        List<Orders> list = this.list();
        for (int i = 0; i <list.size() ; i++) {
            int j=0;
            String payMethod=list.get(i).getPayMethod()==1?"微信":"支付宝";
            Integer statusCode=list.get(i).getStatus();
            String status=statusCode==1?"待付款":(statusCode==2?"待派送":(statusCode==3?"已派送":(statusCode==4?"已完成":"已取消")));
            Row row = sheet.createRow(i + 1);
            row.createCell(j++).setCellValue(list.get(i).getNumber());
            row.createCell(j++).setCellValue(list.get(i).getUserName());
            row.createCell(j++).setCellValue(list.get(i).getPhone());
            row.createCell(j++).setCellValue(list.get(i).getAddress());
            row.createCell(j++).setCellValue(list.get(i).getConsignee());
            row.createCell(j++).setCellValue(list.get(i).getAmount().toString());
            row.createCell(j++).setCellValue(payMethod);
            row.createCell(j++).setCellValue(list.get(i).getOrderTime().toString());
            row.createCell(j++).setCellValue(list.get(i).getCheckoutTime().toString());
            row.createCell(j++).setCellValue(status);
        }
        //4.创建流用于输出
        FileOutputStream fileOutputStream = new FileOutputStream(fileName);
        //5.输出
        workbook.write(fileOutputStream);
        //6.关闭
        workbook.close();
    }

 PATH变量指向的是我们需要保存的路径,filename对应的就是该路径+文件名,这里我们使用了当前时间的字符串,这样可以直接看成是哪天导出的表格。

导出的表格效果如下,桌面的表文件名

java 数据库导出 java数据库导出excel表格_java 数据库导出

java 数据库导出 java数据库导出excel表格_数据库_02

java 数据库导出 java数据库导出excel表格_java 数据库导出_03

 

 

不难看出, 订单表的字段是由代码Sheet sheet = workbook.createSheet("订单表")控制的

表的首行内容是由这段代码所控制的

Row rowHead=sheet.createRow(0);
        rowHead.createCell(0).setCellValue("订单号");
        rowHead.createCell(1).setCellValue("用户名");
        rowHead.createCell(2).setCellValue("手机号");
        rowHead.createCell(3).setCellValue("地址");
        rowHead.createCell(4).setCellValue("收货人");
        rowHead.createCell(5).setCellValue("实收金额");
        rowHead.createCell(6).setCellValue("支付方式");
        rowHead.createCell(7).setCellValue("下单时间");
        rowHead.createCell(8).setCellValue("结账时间");
        rowHead.createCell(9).setCellValue("订单状态");

从第二行开始的表的正式内容是由以下这段代码控制的

List<Orders> list = this.list();
        for (int i = 0; i <list.size() ; i++) {
            int j=0;
            String payMethod=list.get(i).getPayMethod()==1?"微信":"支付宝";
            Integer statusCode=list.get(i).getStatus();
            String status=statusCode==1?"待付款":(statusCode==2?"待派送":(statusCode==3?"已派送":(statusCode==4?"已完成":"已取消")));
            Row row = sheet.createRow(i + 1);
            row.createCell(j++).setCellValue(list.get(i).getNumber());
            row.createCell(j++).setCellValue(list.get(i).getUserName());
            row.createCell(j++).setCellValue(list.get(i).getPhone());
            row.createCell(j++).setCellValue(list.get(i).getAddress());
            row.createCell(j++).setCellValue(list.get(i).getConsignee());
            row.createCell(j++).setCellValue(list.get(i).getAmount().toString());
            row.createCell(j++).setCellValue(payMethod);
            row.createCell(j++).setCellValue(list.get(i).getOrderTime().toString());
            row.createCell(j++).setCellValue(list.get(i).getCheckoutTime().toString());
            row.createCell(j++).setCellValue(status);
        }

 Order表的实体类如下

package com.itheima.reggie.entity;

import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 订单
 * @author asus
 */
@Data
public class Orders implements Serializable {

    private static final long serialVersionUID = 1L;

    //主键id
    private Long id;

    //订单号
    private String number;

    //订单状态 1待付款,2待派送,3已派送,4已完成,5已取消
    private Integer status;

    //下单用户id
    private Long userId;

    //地址id
    private Long addressBookId;

    //下单时间
    private LocalDateTime orderTime;

    //结账时间
    private LocalDateTime checkoutTime;

    //支付方式 1微信,2支付宝
    private Integer payMethod;

    //实收金额
    private BigDecimal amount;

    //备注
    private String remark;

    //用户名
    private String userName;

    //手机号
    private String phone;

    //地址
    private String address;

    //收货人
    private String consignee;
}

这里使用@Data注解,自动注入get和set方法,如果大家不知道如何使用的话,将@Data注解删去,使用IDEA自动生成get和set方法即可。

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for orders
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` bigint NOT NULL COMMENT '主键',
  `number` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '订单号',
  `status` int NOT NULL DEFAULT '1' COMMENT '订单状态 1待付款,2待派送,3已派送,4已完成,5已取消',
  `user_id` bigint NOT NULL COMMENT '下单用户',
  `address_book_id` bigint NOT NULL COMMENT '地址id',
  `order_time` datetime NOT NULL COMMENT '下单时间',
  `checkout_time` datetime NOT NULL COMMENT '结账时间',
  `pay_method` int NOT NULL DEFAULT '1' COMMENT '支付方式 1微信,2支付宝',
  `amount` decimal(10,2) NOT NULL COMMENT '实收金额',
  `remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `consignee` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='订单表';

Orders表结构如上