Excel工具類分享
阿新 • • 發佈:2021-10-02
用於將資料寫入到excel中並寫回到前端.xls檔案;
使用到的技術:
阿里巴巴開源的 easyExcel,官方文件:EasyExcel · 語雀 (yuque.com);
其餘參考的部落格:(13條訊息) Java使用EasyExcel下載xls、xlsx 出現檔案格式與副檔名不匹配_小肥羊的部落格-CSDN部落格;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.example.demo.domain.StudentVO;import org.apache.poi.ss.formula.functions.T; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; public class ExcelUtils { /** * 使用response,將指定集合中的資料作為excel輸出 * @param response 應該傳入HttpServletResponse,傳入前需要先設定response的返回內容型別和返回頭資訊 * response.setContentType("application/vnd.ms-excel"); * response.setHeader("content-Disposition","attachment;filename=" + "輸出的檔名" +".xls") *@param list 需要寫到excel中的資料,List<T>中的T需要是個bean,不能使用map,否則資料寫入不成功 * @param voType 將list中的封裝好的bean的位元組碼物件傳送過來,如 StudengVO.class, 如果傳遞有問題,可能會出現沒有表頭的情況; * @throws IOException 將異常丟擲,一旦有問題,會將異常拋給方法的呼叫著; */ public static void responseExcel(HttpServletResponse response, List list, Class voType) throwsException { //獲取excelWriter物件,指定將都對應寫到哪裡。 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build(); //獲取sheet的索引號為0,並將其名稱改為report的sheet WriteSheet sheet = EasyExcel.writerSheet(0,"report").head(voType).build(); //使用Writer物件,向sheet中寫入list ExcelWriter write = excelWriter.write(list, sheet);//關閉excelWriter資源,在其中會關閉response中的流資源很重要 excelWriter.finish(); } }
引數中需要傳遞進去java Bean的class物件,舉例:
import com.alibaba.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data //lombok外掛 @NoArgsConstructor @AllArgsConstructor public class StudentVO { @ExcelProperty("姓名") //在這裡定義表頭的名稱,否則會將該bean的屬性名作為該列的表頭名稱 private String name; @ExcelProperty("年齡") //在這裡定義表頭的名稱,否則會將該bean的屬性名作為該列的表頭名稱 private String age; }
Controller層程式碼舉例:
import com.example.demo.domain.StudentVO; import com.example.demo.util.ExcelUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; @Controller public class testController { @GetMapping("/test") @ResponseBody public void test(HttpServletResponse response){ try {
// 模擬資料 List<StudentVO> list = new ArrayList<>(); StudentVO s1 = new StudentVO("張三","21"); StudentVO s2 = new StudentVO("李四","24"); list.add(s1); list.add(s2);
//設定響應體的格式 response.setContentType("application/vnd.ms-excel"); response.setHeader("content-Disposition","attachment;filename=" + "test.xls");
//呼叫工具類 進行寫操作 ExcelUtils.responseExcel(response,list,StudentVO.class); } catch (Exception e) { e.printStackTrace(); } } }
測試所使用到了jar包的地址:
<properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- easyExcel 進行報表匯出--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> <!-- lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>