我们经常需要将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对应的就是该路径+文件名,这里我们使用了当前时间的字符串,这样可以直接看成是哪天导出的表格。
导出的表格效果如下,桌面的表文件名
不难看出, 订单表的字段是由代码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表结构如上