Java導出數據到Excel表格
今天是2020年2月14日,首先祝各位情人節快樂
下面言歸正傳開始正文。
在後臺管理系統中經常會有導出數據到Excel表格的功能需求,這個功能是難以規避的,而且這也是一個非常使用且人性化的一個功能。下面就給大家分享一下我在項目中實現此功能的方式和方法。
我使用的是POI進行一個Excel的操作,POI組件是由Apache提供的組件包,主要是爲我們的Java程序提供對於office文檔的相關操作,廢話不多說直接上代碼。
添加依賴(SpringBoot)
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
POI相關組件簡介
HSSFWorkbook:Excel對象,相當於一個 .xls/.xlsx 文件
HSSFSheet:工作表對象,Excel文件包涵的sheet,一個對象代表一個表單
HSSFRow:表示表格中的行對象。
HSSFCell:表示表格中的單元格對象。
HSSFHeader:Excel文檔Sheet的頁眉。
HSSFFooter:Excel文檔Sheet的頁腳。
HSSFDataFormat:日期格式。
HSSFFont:字體對象。
HSSFCellStyle:單元格樣式(對齊樣式、邊框等)
HSSFComment:批註(註釋)。
HSSFPatriarch:和HSSFComment用於創建註釋的位置。
HSSFColor:顏色對象。
HSSFDateUtil:日期輔助工具
HSSFPrintSetup:打印輔助工具
HSSFErrorConstants:錯誤信息表
首先需要創建一個工具類
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* @Auther: ziye
* @Date: 2020/2/14
* @Description:
*/
public class ExcelUtil {
/**
* 導出Excel
*
* @param sheetName sheet名稱
* @param title 標題
* @param values 內容
* @param wb HSSFWorkbook對象
* @return
*/
public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
// 第一步,創建一個HSSFWorkbook,對應一個Excel文件
if (wb == null)
wb = new HSSFWorkbook();
// 第二步,在workbook中添加一個sheet,對應Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(sheetName);
// 第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數列數有限制
HSSFRow row = sheet.createRow(0);
// 第四步,創建單元格,並設置值表頭 設置表頭居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 創建一個居中格式
//聲明列對象
HSSFCell cell = null;
//創建標題
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
}
//創建內容
for (int i = 0; i < values.length; i++) {
row = sheet.createRow(i + 1);
for (int j = 0; j < values[i].length; j++) {
//將內容按順序賦給對應的列對象
row.createCell(j).setCellValue(values[i][j]);
}
}
return wb;
}
}
工具類創建完成後就開始進行相關的調用
便於大家理解和查看代碼,我就把調用過程直接寫在了Controller層中
@ResponseBody
@RequestMapping(value = "/exportExcel", method = RequestMethod.GET)
public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws Exception {
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//設置日期格式
String year = df.format(new Date());
//爲了方便大家理解,選擇用獲取數據表中的全部數據爲例子
List<Leader> list = leaderService.getList();
//設置Excel表頭
String[] title = {"ID", "領導姓名", "性別", "電子郵箱", "聯繫電話", "入職時間"};
//設置Excel文件名
String filename = "LeaderList_"+year+".xls";
//設置工作表名稱
String sheetName = "sheet1";
//開始對從數據庫中獲取到的數據進行處理
String[][] content = new String[list.size()][6];
try {
for (int i = 0; i < list.size(); i++) {
content[i][0] = String.valueOf(list.get(i).getLeaderId());
content[i][1] = list.get(i).getName();
if(list.get(i).getSex() == 0){
content[i][2] = "女";
}else{
content[i][2] = "男";
}
content[i][3] = list.get(i).getEmail();
content[i][4] = list.get(i).getPhone();
content[i][5] = String.valueOf(list.get(i).getIntime());
}
} catch (Exception e) {
e.printStackTrace();
}
HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
try {
// 響應到客戶端
this.setResponseHeader(response, filename);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 向客戶端發送響應流方法
*
* @param response
* @param fileName
*/
public void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
大家需要注意的一點就是,我這裏使用的是GET方式提交,是因爲我需要瀏覽器發送請求時即下載Excel,所以就不能用ajax進行傳輸
在頁面上的調用方式
便於理解,我選擇了最簡單直觀的調用方式(JS調用Controller方法)
<script>
function exportExcel(){
let url = "/leader/exportExcel";
location.href = url;
}
</script>
結語
以上代碼即是本人在實現此功能時所選擇的實現方式
如果文章中有錯誤,歡迎大家留言指正;若您有更好、更簡便的方式來實現此功能,歡迎大家在留言區留下您的建議。
在這個特殊的情人節,願:
你在被打擊時,記起你的珍貴,抵抗惡意;
你在迷茫時,堅信你的珍貴,拋開蜚語;
愛你所愛 行你所行 聽從你心 無問東西