【Hutool】:使用hutool實現復雜excel導出功能
轉自:https://blog.csdn.net/weixin_45511500/article/details/118884656
引入依賴
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
編寫pojo類
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
/**
* 學號
*/
private String sno;
/**
* 姓名
*/
private String name;
/**
* 年齡
*/
private Integer age;
/**
* 性別
*/
private String gender;
/**
* 籍貫
*/
private String nativePlace;
/**
* 入學時間
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date enrollmentTime;
private BigDecimal money;
}
編寫實現類
@PostMapping("user_export_excel")
@ResponseBody
public void exportExcel(HttpServletResponse response) throws UnsupportedEncodingException, ParseException {
// 設置響應類型
response.setContentType("application/vnd.ms-excel");
// 設置字符編碼
response.setCharacterEncoding("utf-8");
// 設置響應頭信息
response.setHeader("Content-disposition",
"attachment;filename*=utf-8''" + URLEncoder.encode("學生花名冊", "UTF-8") + ".xlsx");
List<Student> studentList = new ArrayList<Student>() {
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
add(new Student("1001", "張三", 23, "男", "陝西西安", dateFormat.parse("2020-09-01"), BigDecimal.valueOf(22.33)));
add(new Student("1002", "李四", 22, "女", "陝西渭南", dateFormat.parse("2020-09-01"),BigDecimal.valueOf(11.99)));
}
};
// 寫入文件
ExcelWriter writer = ExcelUtil.getWriter();
// 設置合並單元格
// writer.merge(11, "BOM報價單", false);
// writer.merge(3,"您上傳的BOM", false);
// writer.merge(1, 1 ,4,9,"商城報價單", false);
// 設置標題一樣式
CellStyle cellStyle1 = writer.createCellStyle();
cellStyle1.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle1.setAlignment(HorizontalAlignment.CENTER);
cellStyle1.setBorderLeft(writer.getCellStyle().getBorderLeft());
cellStyle1.setBorderRight(writer.getCellStyle().getBorderRight());
cellStyle1.setBorderBottom(writer.getCellStyle().getBorderBottom());
Font font = writer.createFont();
font.setBold(true);
font.setFontHeightInPoints((short) 12);
font.setFontName("微軟雅黑");
cellStyle1.setFont(font);
// 設置“總價” 單元格樣式
CellStyle cellStyle = writer.createCellStyle();
cellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.GOLD.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//設置垂直居中和水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setAlignment(HorizontalAlignment.LEFT);
//設置邊框
cellStyle.setBorderRight(writer.getCellStyle().getBorderRight());
cellStyle.setBorderBottom(writer.getCellStyle().getBorderBottom());
// 標題一
writer.merge(0,0,0,11, "BOM報價單", cellStyle1);
// 標題二
writer.merge(1,1,0,3,"您上傳的BOM", cellStyle1);
writer.merge(1, 1 ,4,9,"商城報價單", cellStyle1);
writer.merge(1,1,10,11,"總價(含稅): "+ " 99.99",cellStyle);
// 跳過前面兩行(為了設置標題樣式)原始的設置標題方法,不可以,例:merge(3, "標題名", false);
writer.passRows(2);
// 設置高度(行row)
writer.setRowHeight(0, 50);
writer.setRowHeight(1, 30);
// 設置導出信息的表頭
writer.addHeaderAlias("sno", "學號");
writer.addHeaderAlias("name", "姓名");
writer.addHeaderAlias("age", "年齡");
writer.addHeaderAlias("gender", "性別");
writer.addHeaderAlias("nativePlace", "籍貫");
writer.addHeaderAlias("enrollmentTime", "入學時間");
writer.addHeaderAlias("money", "金錢");
// 設置列寬(Colum)
writer.setColumnWidth(5, 20);
writer.setColumnWidth(10, 10);
writer.setColumnWidth(11, 10);
// 設置導出表頭樣式,但不包括合並單元格
CellStyle headCellStyle = writer.getHeadCellStyle();
headCellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.LIME.getIndex());
headCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 寫入
writer.write(studentList, true);
// 主要針對自定義表頭設置 行高(必須要寫入完成后才可以設置)
for (int i = 2; i < studentList.size(); i++) {
writer.setRowHeight(i,20);
}
try {
writer.flush(response.getOutputStream(), true);
} catch (IOException e) {
e.printStackTrace();
} finally {
writer.close();
}
}
效果圖

