本文摘要
文中介紹了便捷Excel輪子easypoi,特點及使用方法,以及如何實現Excel多Sheet的導出功能
前言
Excel 作為開發中常用功能,經常需要用到,小老弟找了網上一些多Sheet導出的實現,都不太滿意,因此根據EasyPoi的說明文檔寫了一個工具類,在這里和大家分享
EasyPoi和阿里的EasyExcel都有用過,是為便捷操作Excel的開源輪子,基於不重復造的原則,小老弟對使用較多的easyPoi進行本文所需功能的實現
EasyPoi支持如下
功能列表 | 詳細 |
---|---|
Excel導入 | 注解導入 && Map導入 && 大數據量導入sax模式 && 導入文件保存 && 文件校驗 && 字段校驗 |
Excel導出 | 注解導出 && 模板導出 && html導出,Excel自適應xls和xlsx兩種格式 |
Excel轉html | |
word導出 | word只支持docx模式 |
pdf導出 |
准備工作
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
多sheet的Excel導出
生成workbook關鍵代碼
/**
* 創建workbook,
* 通過maplist填充Excel內容
* 返回workbook
*
* 進一步使用可以寫入流,e.g.
* FileOutputStream fos = new FileOutputStream(file);
* workbook.write(fos);
* */
public static Workbook mutiSheet(List<Map<String, Object>> mapListList){
Workbook workbook = null;
workbook = ExcelExportUtil.exportExcel(mapListList,ExcelType.XSSF);
return workbook;
}
多sheet工具類WorkBookUtils
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.jdcloud.task.domain.vo.wenxian.IndustryStoreMomFungi;
import org.apache.poi.ss.usermodel.Workbook;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class WorkBookUtils {
/**
* 創建workbook,
* 通過maplist填充Excel內容
* 返回workbook
*
* 進一步使用可以寫入流,e.g.
* FileOutputStream fos = new FileOutputStream(file);
* workbook.write(fos);
* */
public static Workbook mutiSheet(List<Map<String, Object>> mapListList){
Workbook workbook = null;
workbook = ExcelExportUtil.exportExcel(mapListList,ExcelType.XSSF);
return workbook;
}
public static Map<String, Object> createOneSheet(ExportParams exportParams,Class<?> clazz,List<?> data){
Map<String, Object> map = new HashMap<>();
map.put("title",exportParams);//new ExportParams("title"+i, "sheetName"+i, ExcelType.XSSF)
map.put("entity", clazz);
map.put("data",data);
return map;
}
/*
* 創建一個表格並填充內容
* 返回map供工作簿使用
* */
public static Map<String, Object> createOneSheet(String sheetName,String title,Class<?> clazz,List<?> data){
ExportParams exportParams = new ExportParams(title,sheetName, ExcelType.XSSF);
return createOneSheet(exportParams,clazz,data);
}
}
service
/**
* 將數據存儲進response,調用接口就能下載文件
* */
public void exportData(HttpServletRequest request, HttpServletResponse response ) throws URISyntaxException, IOException {
String fileName="data.xlsx";
File file = createDatafile(fileName);
Object data=null;
fillData(file,data);
datatoResponse(request,response,file,fileName);
}
/**
* 將數據存儲進response,調用接口就能下載文件
* */
private void datatoResponse(HttpServletRequest request, HttpServletResponse response,File file,String fileName) throws IOException {
OutputStream out = null;
FileInputStream in = null;
try {
// 1.讀取要下載的內容
in = new FileInputStream(file);
// 2. 告訴瀏覽器下載的方式以及一些設置
// 解決文件名亂碼問題,獲取瀏覽器類型,轉換對應文件名編碼格式,IE要求文件名必須是utf-8, firefo要求是iso-8859-1編碼
String agent = request.getHeader("user-agent");
if (agent.contains("FireFox")) {
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
// 設置下載文件的mineType,告訴瀏覽器下載文件類型
String mineType = request.getServletContext().getMimeType(fileName);
response.setContentType(mineType);
// 設置一個響應頭,無論是否被瀏覽器解析,都下載
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
// 將要下載的文件內容通過輸出流寫到瀏覽器
out = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
}
}
/**
* 設置文件路徑 && 保證文件對象的正確打開
* */
private File createDatafile(String fileName) throws URISyntaxException, IOException {
File file = null;
String resource = this.getClass().getClassLoader().getResource("").getPath()+fileName;
URI uri = new URI(resource);
File myFile = new File(resource);//創建File對象,參數為String類型,表示目錄名
//判斷文件是否存在,如不存在則調用createNewFile()創建新目錄,否則跳至異常處理代碼
if(!myFile.exists()) myFile.createNewFile();
System.out.println("文件創建成功");
return myFile;
}
private File fillData(File savefile,Object data) throws IOException {
List<Map<String, Object>> lists = new ArrayList<>();
//sheet1
List<Map<String, String>> datas1 = excelDao.queryTableColumns("whole_network_wenxian_region_trend_info");
Map<String, Object> temp1 = WorkBookUtils.createOneSheet("表1", "表頭大標題", Map.class, datas1);
lists.add(temp1);
//sheet2
List<Map<String, String>> datas2 = excelDao.queryTableColumns("whole_network_wenxian_industry_trend");
Map<String, Object> temp2 = WorkBookUtils.createOneSheet("表2", "表頭大標題", Map.class, datas2);
lists.add(temp2);
Workbook workbook = WorkBookUtils.mutiSheet(lists);
FileOutputStream fos = new FileOutputStream(savefile);
workbook.write(fos);
fos.close();
return savefile;
}
controller
@RequestMapping("/export")
public void export(HttpServletRequest request, HttpServletResponse response) throws Exception {
excelService.exportData(request,response);
}