POI萬能匯出模板
阿新 • • 發佈:2019-01-03
一.問題
最近做公司的考勤報工系統,開發多張考勤報表,每一張報表都有匯出Excel需求。
由於每一張報表匯出Excel的欄位都不同,每一個張報表都寫了一個匯出方法,工作量大。
所以想能不能抽取出一個匯出的公共方法。
二.解決問題
通過Java的反射機制,取出物件中的對應欄位,設定到POI的Cell物件中,匯出Excel。
公共方法:
/**
* POI匯出公共方法
* @param obj
* @param className
* @param fileName
* @param excelHeaders
* @param fields
* @param response
* @throws Exception
*/
public static void publicExport(Object obj, Class className, String fileName, String[] excelHeaders,String[] fields, HttpServletResponse response) throws Exception {
//匯出資料為空,直接返回
List query = (List)obj;
if (query.size() == 0) {
return;
}
//獲取匯出資料的總條數
int countColumnNum = query.size();
//建立XSSFWorkbook檔案物件
XSSFWorkbook book = null;
//管理員匯出資料
book = new XSSFWorkbook();
//建立一個Name的新表
XSSFSheet sheet = book.createSheet(fileName);
// 獲取表的第一行
XSSFRow firstRow = sheet.createRow(0);
//建立表的第一行的每列的說明
XSSFCell[] firstCells = new XSSFCell[excelHeaders.length];
//給表的第一行的每一列賦值
for (int j = 0; j < excelHeaders.length; j++) {
firstCells[j] = firstRow.createCell(j);
firstCells[j].setCellValue(new XSSFRichTextString(excelHeaders[j]));
}
//反射從物件中取出方法物件
List<Method> methodList = new ArrayList<>();
for(String method : fields){
methodList.add(className.getMethod("get"+firstUpper(method)));
}
//把表的第一列寫好後,接下來從表的第二列開始把對應的值寫入到檔案裡
for (int i = 0; i < countColumnNum; i++) {
//給execl建立一行
XSSFRow row = sheet.createRow(i + 1);
//取出資料
Object object = query.get(i);
//迴圈給列賦值
for (int column = 0; column < excelHeaders.length; column++) {
//確認每一列對應的表的列
for(int method = 0;method<methodList.size(); method++){
XSSFCell cell = row.createCell(method);
cell.setCellValue(methodList.get(method).invoke(object)==null?"":methodList.get(method).invoke(object).toString());
}
}
}
//寫一個try catch捕捉異常(response獲取輸出流)
OutputStream os = null;
try {
//防止匯出的Excel檔名中文亂碼
String filename= new String(fileName.getBytes("utf-8"), "ISO_8859_1");
response.setHeader("Content-Disposition", "attachment;filename="+filename+".xlsx");
response.setContentType("application");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
os = response.getOutputStream();
book.write(os);
} catch (IOException e) {
System.out.println("IO流異常");
} finally {
try {
os.close();
} catch (IOException e) {
System.out.println("關閉IO流異常");
}
}
}
/**
*將字串的第一個字母轉換成大寫
*
*/
public static String firstUpper(String string) {
char[] charArray = string.toCharArray();
charArray[0] -= 32;
return String.valueOf(charArray);
}
引數說明:
obj:需要匯出的資料集合
className:需要匯出集合的物件Class
fileName: 匯出Excel檔名
excelHeaders:匯出Excel內容頭資訊
fields:需要匯出的對應欄位