第一步:加入需要的依賴
<!-- Apache POI庫用於導出Excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<!-- 解析Excel文件的jar包 用於2007+ 版本的excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
第二步:工具類
import org.apache.poi.xssf.usermodel.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 功能說明:文件工具類
* @author xuwen
* @date 2019/04/22
*/
public class FileUtils {
/**
* 導出文件
* @param response 請求響應
* @param sheetName Sheet名稱
* @param headers 表頭
* @param stringList 表數據
*/
public static void downloadExcelFile(HttpServletResponse response, String sheetName, String[] headers,
List<String[]> stringList) {
FileUtils.exportExcelFile(response, FileUtils.createExcelFile(sheetName, headers, stringList));
}
/**
* 創建excel文件
* @param sheetName Sheet名稱
* @param headers 表頭
* @param stringList 表數據
* @author xuwen
*/
private static XSSFWorkbook createExcelFile(String sheetName, String[] headers, List<String[]> stringList) {
// 創建excel文件
XSSFWorkbook workbook = new XSSFWorkbook();
// 設置excel文件格式
XSSFCellStyle cellStyle = workbook.createCellStyle();
// 設置sheet名稱
XSSFSheet sheet = workbook.createSheet(sheetName);
// 初始化行號
int rowNum = 0;
// 創建表頭行
XSSFRow row = sheet.createRow(rowNum);
// 填充表頭
for (int m = 0; m < headers.length; m++) {
XSSFCell cell = row.createCell(m);
cell.setCellValue(headers[m]);
}
// 填充表格數據
for (int n = 0; n < stringList.size(); n++) {
XSSFRow dataRow = sheet.createRow(++rowNum);
String[] data = stringList.get(n);
for (int j = 0; j < data.length; j++) {
dataRow.createCell(j).setCellValue(data[j]);
}
}
return workbook;
}
/**
* 下載模板
* @param response 請求響應
* @param file 文件
* @author xuwen
*/
public static void downloadTemplate(HttpServletResponse response, String file) {
try {
ClassPathResource classPathResource = new ClassPathResource(file);
InputStream inputStream = classPathResource.getInputStream();
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
FileUtils.exportExcelFile(response, workbook);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 在響應中返回文件流
* @param response 請求響應
* @param workbook excel文件
* @author xuwen
*/
public static void exportExcelFile(HttpServletResponse response, XSSFWorkbook workbook) {
response.setContentType("application/octet-stream;charset=UTF-8");
String excelFileName = "export.xlsx";
try {
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(excelFileName.getBytes("GB2312"), "iso8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
OutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
第三步:前端部分
自定義一個點擊事件 在 Ajax/Axios/Fetch 的 成功回調函數 裡觸發此方法即可。(這一步使用vue和jquery都一樣,因為使用的是原生js)
/**
* 下載文件
* @author xuwen
*/
export function download(data, fileName) {
let blob = new Blob([data]); //創建一個blob對象
let a = document.createElement('a'); //創建一個<a></a>標籤
a.href = URL.createObjectURL(blob); // response is a blob
a.download = fileName; //文件名稱
a.style.display = 'none';
document.body.appendChild(a);
a.click();
a.remove();
}
第四步:自定義業務邏輯
這裡為了做簡單示例,dao查詢直接用Map接收數據。
public void exportExcel(HttpServletResponse response, String id) {
// sheet名稱
String sheetName = "庫存信息";
// 表頭
String[] headers = {"序號", "編號", "名稱", "下單時間"};
//查詢需要導出報表的信息
List<Map<String, Object>> list = mapper.findById(id);
List<String[]> strList = new ArrayList<>();
int index = 0;
for (Map<String,Object> map : list) {
index ++;
//String.valueOf() 和 .toString() 懶得判空,直接使用 +「」 變字符串
String[] strings = {String.valueOf(index), map.get("code") + "", map.get("name") + "", map.get("createDate") + ""};
strList.add(strings);
}
// 導出文件, 這裡調用上面第二步給的工具類即可
FileUtils.downloadExcelFile(response, sheetName, headers, strList);