SpringBoot-EasyExcel導出數據(帶圖片)
前言
EasyExcel 是阿里巴巴開源的一個Java操作Excel的技術,和EasyPoi一樣是封裝Poi的工具類。
但是不同的地方在于,在EasyExcel中解決了Poi技術讀取大批量數據耗費內存的問題。
當然了,也封裝了很多常用的Excel操作
- 最基本的導入導出
- 圖片的導入導出
- 大批量數據的導入導出
- 模板的導出
- 官方地址:https://alibaba-easyexcel.github.io/quickstart/write.html
一、引入的maven依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
二、導出的實體類
EasyExcel也是注解式開發,常用注解如下
- ExcelProperty 指定當前字段對應excel中的那一列
- ExcelIgnore 默認所有字段都會和excel去匹配,加了這個注解會忽略該字段
- DateTimeFormat 日期轉換,用String去接收excel日期格式的數據會調用這個注解。里面的value參照java.text.SimpleDateFormat
- NumberFormat 數字轉換,用String去接收excel數字格式的數據會調用這個注解。里面的value參照java.text.DecimalFormat
import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.songwp.config.SxjgUrlImageConverter; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; import java.net.URL; /** * @Description 老師信息實體類 * @Author songwp * @Date 2023/3/30 13:57 **/ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ContentRowHeight(120) @AllArgsConstructor @NoArgsConstructor public class Teacher implements Serializable { /** * 教師編號 */ @ExcelProperty("教師編號") @ExcelIgnore private Integer teacherId; /** * 教師名稱 */ @ExcelProperty("教師名稱") private String teacherName; /** * 教師圖片 */ @ExcelProperty(value = {"教師圖片"},converter = SxjgUrlImageConverter.class) private URL teacherImage; /** * 教師狀態: 0 -任教中 1 - 為任教 */ @ExcelProperty("教師狀態") @ExcelIgnore private Integer teacherStatus; /** * 教師狀態: 0 -任教中 1 - 為任教 */ @ExcelProperty("教師狀態") private String teacherStatusStr; /** * 住址信息 */ @ExcelProperty("住址信息") private String address;
三、圖片轉換處理類
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.alibaba.excel.util.IoUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.util.ObjectUtils; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; /** * @Description 圖片處理 * @Author songwp * @Date 2023/3/30 15:04 **/ @Slf4j public class SxjgUrlImageConverter implements Converter<URL> { public static int urlConnectTimeout = 2000; public static int urlReadTimeout = 6000; @Override public Class<?> supportJavaTypeKey() { return URL.class; } @Override public WriteCellData<?> convertToExcelData(URL value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws IOException { InputStream inputStream = null; try { if (ObjectUtils.isEmpty(value)){ return new WriteCellData<>("圖片鏈接為空"); } URLConnection urlConnection = value.openConnection(); urlConnection.setConnectTimeout(urlConnectTimeout); urlConnection.setReadTimeout(urlReadTimeout); inputStream = urlConnection.getInputStream(); byte[] bytes = IoUtils.toByteArray(inputStream); return new WriteCellData<>(bytes); }catch (Exception e){ log.info("圖片獲取異常",e); return new WriteCellData<>("圖片獲取異常"); } finally { if (inputStream != null) { inputStream.close(); } } } }
四、導出的工具類
import com.alibaba.excel.EasyExcel; import com.sxjgkg.sjsk.innovation.InnovationConstants; import com.sxjgkg.sjsk.zhaixing.core.ZhaixingException; import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.List; /** * * @author songwp * @since 2023-04-20 14:04:42 */ @Slf4j public class EasyExcelUtil { /** * 導出excel * * @param response 響應實體類 * @param sheetName sheet頁簽名稱 * @param clazz 模板的字節碼對象 * @param list 需要導出的數據列表 * @throws ZhaixingException 業務異常 */ public static void exportExcel(HttpServletResponse response, String sheetName, Class clazz, List<?> list) throws ZhaixingException { try { String fileName = URLEncoder.encode(sheetName, StandardCharsets.UTF_8).replaceAll("\\+", "%20"); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), clazz).autoCloseStream(Boolean.TRUE).sheet("sheet") .doWrite(list); } catch (Exception e) { log.error(e.getMessage(), e); throw new ZhaixingException(InnovationConstants.Ex.EXPORT_EXCEPTION,e.getMessage()); } } }
五、導出方法測試
/** * 教師信息表導出 * @param response */ @GetMapping("/export") public void export(HttpServletResponse response) throws MalformedURLException { // 準備數據 List<Teacher> teachers = new ArrayList<>(); teachers.add(new Teacher(1,"馬云",new URL("https://money.gucheng.com/UploadFiles_6503/201901/2019012516201400.jpg"),1,"未任教","浙江杭州")); teachers.add(new Teacher(2,"王健林",new URL("https://img1.cache.netease.com/ent/2016/8/23/20160823221523324f5.jpg"),1,"未任教","上海浦東新區")); teachers.add(new Teacher(3,"雷軍",new URL("https://i1.073img.com/140526/5808312_102252_1.jpg"),1,"未任教","北京通州區")); teachers.add(new Teacher(4,"馬化騰",new URL("https://x0.ifengimg.com/res/2020/F43C0869EE9D07C77C0D82D13266BB1F94DBD148_size583_w1944_h1639.jpeg"),1,"未任教","中國深圳")); // 方法一 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 這里URLEncoder.encode可以防止中文亂碼 當然和easyexcel沒有關系 String fileName = null; try { fileName = URLEncoder.encode("教師信息表", "UTF-8").replaceAll("\\+", "%20"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); try { EasyExcel.write(response.getOutputStream(), Teacher.class).sheet("教師信息表").doWrite(teachers); } catch (IOException e) { throw new RuntimeException(e); } // 方法二 EasyExcelUtil.exportExcel(response,"教師信息表", Teacher.class,teachers) }
六、導出文件效果展示

古今成大事者,不唯有超世之才,必有堅韌不拔之志!

浙公網安備 33010602011771號