此处不写vue的详细内容了(怎么下载后台返回的流文件), 其他文章有发布详细内容 链接.
本文重点的是java怎么通过hutool这个工具类生成excel表格的
实现功能: 导出excel表格为文件, 导入(读取)excel文件为数据, 导出excel模板跟导出excel是一个方法! 它会自动分辨是导出模板, 还是导出数据, 大致功能一样索性就写一起了 哈哈哈.
读取: 通过axios把需要生成excel表的数据发送过来, 使用list接收.
导入依赖
<!-- hutool 工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.6</version>
</dependency>
<!-- Java程序对Microsoft Office格式档案读和写的功能 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
controler
package com.gsz.hutoolexcel.controller;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.gsz.hutoolexcel.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@Slf4j
@RestController
public class VueTestController {
/**
* vue 请求到此接口 生成一个excel表格 存储到 response 中
* @param users
* @param response
* @return
*/
@RequestMapping("/vue")
public void test(@RequestBody List<User> users, HttpServletResponse response){
// 生成excel表 使用hutool工具类
ExcelWriter writer = ExcelUtil.getWriter(true);
// 设置标题信息
writer.merge(3,"用户基本信息");
// 设置这个文档 header 别名
writer.addHeaderAlias("name","姓名");
writer.addHeaderAlias("sex","性别");
writer.addHeaderAlias("address","地址");
writer.addHeaderAlias("date","日期");
// 每个单元格自动宽度
writer.autoSizeColumnAll();
log.info("数据的长度:{}",users.size());
// 判断这个携带的参数是否有数据没有则导出模板 不用生成下拉列表
if (users == null || users.size() < 1){
// 创建一个对象 传入以上那个集合中然后创建 模板
users.add(new User("例: 张三","石家庄","男","2022/10/13"));
}
// 生成下拉列表 根据用户的长度进行下拉列表的生成
for (int i = 0; i < users.size(); i++) {
// 设置下拉列表 这里将这个 i + 2 是为了跳过开头的两条标题
writer.addSelect(1,i + 2,"男","女");
}
// 一次性写入 强制输入标题: true
writer.write(users,true);
// 写出xls文件方式
//response为HttpServletResponse对象
response.setContentType("application/vnd.ms-excel;charset=utf-8");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition","attachment;");
// Servlet输出流 用来写回给浏览器
ServletOutputStream out= null;
try {
// 进行赋值
out = response.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
// 将 excel 表刷入到 ServletOutputStream 输出流
writer.flush(out, true);
//关闭writer,释放内存
writer.close();
// 关闭Servlet流
IoUtil.close(out);
log.info("excel已生成!");
}
/**
* 用户传入一个excel类型的file文件 进行读取并且返回给前端读取出来的对象
* @param file 用户传入一个excel文件 前端传入的文件key必须为file
* @return excel文件中的数据
*/
@RequestMapping("/importExcel")
public List<User> importExcel(RequestParam("file") MultipartFile file){
// 获取上传文件的名称 打印日志
log.info("filename:{}", file.getOriginalFilename());
// 用来存储这个文件中读取的对象
List<User> read = null;
try {
// 将传入excel文件转换为输入流
InputStream inputStream = file.getInputStream();
// 读取excel文件中的数据
ExcelReader reader = ExcelUtil.getReader(inputStream);
// 设置这个文档 header 别名
reader.addHeaderAlias("姓名","name");
reader.addHeaderAlias("性别","sex");
reader.addHeaderAlias("地址","address");
reader.addHeaderAlias("日期","date");
// 进行赋值 读取excel表中的数据为 bean (标题所在行,起始行), 从0开始
read = reader.read(1,2,User.class);
log.info("文件中的数据: {}",read);
} catch (IOException e) {
e.printStackTrace();
}
// 进行返回
return read;
}
}