这篇文档手把手教你完成导出excel,有这个demo,其他excel导出都通用。
?模板下载如果要VIP,去我的主页-资源里面看下,我另外一个资料。
引入以下依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>repository.org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</dependency>
1、模板excel见附件。
2、以下为模拟数据对象:
package com.example.demo.excel;
import lombok.Data;
/**
* 模拟数据对象
* @Auth xiajun
*/
@Data
public class DataDemo {
private String content;//工作内容
private String allPers;//用工总人数
private String ptNum;//普通用工数
private String jgNum;//技工用工数
private String price;//单价(元)
private String money;//金额(元)
private String notes;//备注
public DataDemo(){
}
public DataDemo(String content, String allPers, String ptNum, String jgNum, String price, String money, String notes) {
this.content = content;
this.allPers = allPers;
this.ptNum = ptNum;
this.jgNum = jgNum;
this.price = price;
this.money = money;
this.notes = notes;
}
}
3、以下为excel导出逻辑
package com.example.demo.excel;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.StyleSet;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
/**
* java导出excel
* @Auth xiajun
*/
@Slf4j
@RestController
@RequestMapping("mvc/cadre")
public class Test {
@GetMapping(path = "/export")
public void export(HttpServletResponse response) throws IOException {
{
//1、模拟数据
List<DataDemo> datas = new ArrayList<>();
//模拟数据
for(int i =0 ;i < 4; i++){
datas.add(new DataDemo("填坑"+i, "11"+i, "22"+i, "33"+i, "44"+i, "55"+i, "备注一下"+i));
}
//2、读取已存在的Excel文件
ExcelWriter writer = ExcelUtil.getWriter("templates/mb.xlsx");
//3、=====================设置列表前指定单元格数据============================
//协作单位
writer.getOrCreateCell(0, 2)
.setCellValue("协作单位:中国建筑集团");//setCellValue这个不改变原有单元格样式
//时间
writer.getOrCreateCell(5, 2)
.setCellValue("时间:2024-01-04");
//4、=====================设置列表数据=================================
int insertRowNum = 5; // 指定要插入新行的行号
int numberOfNewRows = datas.size(); // 指定要插入的新行数量
// 先将原有的行向下移动 numberOfNewRows 行,为新行腾出位置
writer.getSheet().shiftRows(insertRowNum, writer.getSheet().getLastRowNum(), numberOfNewRows, true, true);
AtomicInteger count = new AtomicInteger(0);
for (int i = 0; i < datas.size(); i++) {
writer.getOrCreateRow(insertRowNum + i + 1); // 获取或创建新行对象
int number = count.incrementAndGet();//序号
//x为第几列,y为第几行,按照你模板来设置
writer.writeCellValue(0, insertRowNum, number);
writer.writeCellValue(1, insertRowNum, datas.get(i).getContent());
writer.writeCellValue(2, insertRowNum, datas.get(i).getAllPers());
writer.writeCellValue(3, insertRowNum, datas.get(i).getPtNum());
writer.writeCellValue(4, insertRowNum, datas.get(i).getJgNum());
writer.writeCellValue(5, insertRowNum, datas.get(i).getPrice());
writer.writeCellValue(6, insertRowNum, datas.get(i).getMoney());
writer.writeCellValue(7, insertRowNum, datas.get(i).getNotes());
insertRowNum++;//数据往下面排
}
//5、=====================设置列表后指定单元格数据============================
//合计金额
log.info("设置列表后的行:{}", insertRowNum);
writer.getOrCreateCell(3, insertRowNum)
.setCellValue("100万元");
//协作单位负责人
writer.getOrCreateCell(0, insertRowNum+1)
.setCellValue("协作单位负责人:张三");
//经办人
writer.getOrCreateCell(3, insertRowNum+1)
.setCellValue("经办人:李四");
//部门负责人
writer.getOrCreateCell(5, insertRowNum+1)
.setCellValue("部门负责人:王五");
//6、======================输出文件====================================
// 设置content—type
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
response.setHeader("Content-Disposition","attachment;filename=data.xlsx");
// 设置标题
//Content-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。
ServletOutputStream outputStream = response.getOutputStream();
//将Writer刷新到OutPut
writer.flush(outputStream, true);
outputStream.close();
}
}
}
4、导出效果
注意事项:如果你调整了代码设置数据,但是没生效,把target目录下的class文件删除重启哈就生效了。
============================好用记得点个赞哟!!!==========================