溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用java反射機制導出Excel的公共方法以及使用的方法

發(fā)布時間:2020-04-06 23:49:07 來源:網絡 閱讀:437 作者:沙漏半杯 欄目:編程語言

import java.io.IOException;

import java.io.OutputStream;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.text.SimpleDateFormat;

import java.util.Collection;

import java.util.Date;

import java.util.Iterator;

import java.util.regex.Matcher;

import java.util.regex.Pattern;



import javax.servlet.http.HttpSession;



import org.apache.poi.ss.usermodel.CellStyle;

import org.apache.poi.ss.usermodel.IndexedColors;

import org.apache.poi.xssf.usermodel.XSSFCell;

import org.apache.poi.xssf.usermodel.XSSFCellStyle;

import org.apache.poi.xssf.usermodel.XSSFClientAnchor;

import org.apache.poi.xssf.usermodel.XSSFDrawing;

import org.apache.poi.xssf.usermodel.XSSFFont;

import org.apache.poi.xssf.usermodel.XSSFRichTextString;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;



import com.cddgg.lianyoulw.utils.Arith;



/**

?* 導出Excel表

?*??

?* @author wangbowen

?*?

?* @param <T>應用泛型,代表任意一個符合javabean風格的類

?*/

public class ExportExcel<T> {

? ? /**

? ? ?* 導出excel

? ? ?* @param footTitle 腳標題

? ? ?* @param dataset 控制數據

? ? ?* @param out 輸出流

? ? ?*? @param session 會話

? ? ?*/

? ? public void exportExcel(String footTitle,Collection<T> dataset, OutputStream out,HttpSession session) {

? ? ? ? export(footTitle, null, dataset, out, "yyyy-MM-dd",session);

? ? }

? ? /**

? ? ?* 導出excel

? ? ?* @param footTitle 腳標題

? ? ?* @param headers 表頭

? ? ?* @param dataset 控制數據

? ? ?* @param out 輸出流

? ? ?* @param session 會話

? ? ?*/

? ? public void exportExcel(String footTitle, String[] headers, Collection<T> dataset,

? ? ? ? ? ? OutputStream out,HttpSession session) {

? ? ? ? export(footTitle, headers, dataset, out, "yyyy-MM-dd",session);

? ? }

? ? /**

? ? ?* 導出excel

? ? ?* @param footTitle 腳標題

? ? ?* @param headers? 表頭

? ? ?* @param dataset 控制數據

? ? ?* @param out 輸出流

? ? ?* @param pattern 驗證

? ? ?*? @param session 會話

? ? ?*/

? ? public void exportExcel(String footTitle,String[] headers, Collection<T> dataset,

? ? ? ? ? ? OutputStream out, String pattern,HttpSession session) {

? ? ? ? export(footTitle,headers, dataset, out, pattern,session);

? ? }



? ? /**

? ? ?* 通用的方法,利用了JAVA的反射機制,可以將放置在JAVA集合中并且符號一定條件的數據以EXCEL 的形式輸出到指定IO設備上

? ? ?*?

? ? ?* @param title

? ? ?*? ? ? ? ? ? 表格標題

? ? ?* @param headers

? ? ?*? ? ? ? ? ? 表格屬性列名數組

? ? ?* @param dataset

? ? ?*? ? ? ? ? ? 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的

? ? ?*? ? ? ? ? ? javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)

? ? ?* @param out

? ? ?*? ? ? ? ? ? 輸出設備關聯的流對象,可以將EXCEL文檔導出到本地文件或者網絡中

? ? ?* @param pattern

? ? ?*? ? ? ? ? ? 如果有時間數據,設定輸出格式。默認為"yyy-MM-dd"

? ? ?*? @param session 會話

? ? ?*/

? ? public void export(String title, String[] headers,

? ? ? ? ? ? Collection<T> dataset, OutputStream out, String pattern, HttpSession session) {

? ? ? ? //申明一個工作簿

? ? ? ? XSSFWorkbook book = new XSSFWorkbook();

? ? ? ? //創(chuàng)建一個表

? ? ? ? XSSFSheet sheet = book.createSheet();

? ? ? ? // 設置表格默認列寬度為30個字節(jié)

? ? ? ? sheet.setDefaultColumnWidth(25);

? ? ? ? // 聲明一個畫圖的頂級管理器

? ? ? ? XSSFDrawing patriarch = sheet.createDrawingPatriarch();

? ? ? ? book.setSheetName(0, title); // 設置第一個sheet的名稱

? ? ? ? XSSFRow row = sheet.createRow((short) 0);

? ? ? ? XSSFFont font = book.createFont();

? ? ? ? // font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);

? ? ? ? font.setFontHeightInPoints((short) 9); // 設置字體大小

? ? ? ? font.setFontName("微軟雅黑");

? ? ? ? XSSFCellStyle style = book.createCellStyle();

? ? ? ? style.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 中對齊

? ? ? ? style.setFont(font);

? ? ? ? style.setBorderTop(XSSFCellStyle.BORDER_THIN);

? ? ? ? style.setBorderBottom(XSSFCellStyle.BORDER_THIN);

? ? ? ? style.setBorderLeft(XSSFCellStyle.BORDER_THIN);

? ? ? ? style.setBorderRight(XSSFCellStyle.BORDER_THIN);

? ? ? ? style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());

? ? ? ? style.setFillPattern(CellStyle.SOLID_FOREGROUND);

? ? ? ? XSSFCellStyle style2 = book.createCellStyle();

? ? ? ? style2.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 中對齊

? ? ? ? style2.setBorderTop(XSSFCellStyle.BORDER_THIN);

? ? ? ? style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);

? ? ? ? style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);

? ? ? ? style2.setBorderRight(XSSFCellStyle.BORDER_THIN);

? ? ? ? style2.setFont(font);

? ? ? ? for (short i = 0; i < headers.length; i++) {

? ? ? ? ? ? XSSFCell cell = row.createCell(i);

? ? ? ? ? ? cell.setCellStyle(style);

? ? ? ? ? ? XSSFRichTextString text = new XSSFRichTextString(headers[i]);

? ? ? ? ? ? cell.setCellValue(text);

? ? ? ? }

? ? ? ? // 循環(huán)數據

? ? ? ? Iterator<T> it = dataset.iterator();

? ? ? ? int index = 0;

? ? ? ? while (it.hasNext()) {

? ? ? ? ? ? index++;

? ? ? ? ? ? row = sheet.createRow(index);

? ? ? ? ? ? T t = (T) it.next();

? ? ? ? ? ? // 利用反射,根據javabean屬性的先后順序,動態(tài)調用getXxx()方法得到屬性值

? ? ? ? ? ? Field[] fields = t.getClass().getDeclaredFields();



? ? ? ? ? ? for (int i = 0; i < fields.length; i++) {

? ? ? ? ? ? ? ? XSSFCell cell = row.createCell(i);

? ? ? ? ? ? ? ? cell.setCellStyle(style2);

? ? ? ? ? ? ? ? Field field = fields[i];

? ? ? ? ? ? ? ? String fieldName = field.getName();

? ? ? ? ? ? ? ? //如果fieldName是idCard就進入if里面

? ? ? ? ? ? ? ? if(fieldName.equals("idCard")){

? ? ? ? ? ? ? ? fieldName = fieldName.equals("idCard")?"IDCard":fieldName;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? String getMethodName = "get"

? ? ? ? ? ? ? ? ? ? ? ? + fieldName.substring(0, 1).toUpperCase()

? ? ? ? ? ? ? ? ? ? ? ? + fieldName.substring(1);

? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? Class<? extends Object> tCls = t.getClass();

? ? ? ? ? ? ? ? ? ? Method getMethod = tCls.getMethod(getMethodName,

? ? ? ? ? ? ? ? ? ? ? ? ? ? new Class[] {});

? ? ? ? ? ? ? ? ? ? Object value = getMethod.invoke(t, new Object[] {});

? ? ? ? ? ? ? ? ? ? // 判斷值的類型后進行強制類型轉換

? ? ? ? ? ? ? ? ? ? String textValue = null;

? ? ? ? ? ? ? ? ? ? if (value instanceof Boolean) {

? ? ? ? ? ? ? ? ? ? ? ? boolean bValue = (Boolean) value;

? ? ? ? ? ? ? ? ? ? ? ? textValue = "男";

? ? ? ? ? ? ? ? ? ? ? ? if (!bValue) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? textValue = "女";

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? } else if (value instanceof Date) {

? ? ? ? ? ? ? ? ? ? ? ? Date date = (Date) value;

? ? ? ? ? ? ? ? ? ? ? ? SimpleDateFormat sdf = new SimpleDateFormat(pattern);

? ? ? ? ? ? ? ? ? ? ? ? textValue = sdf.format(date);

? ? ? ? ? ? ? ? ? ? }else if(value instanceof Double){

? ? ? ? ? ? ? ? ? ? ? ? double value1 = Double.parseDouble(value.toString());

? ? ? ? ? ? ? ? ? ? ? ? textValue = Arith.doubleTransform(value1);

? ? ? ? ? ? ? ? ? ? }else if (value instanceof byte[]) {

? ? ? ? ? ? ? ? ? ? ? ? // 有圖片時,設置行高為60px;

? ? ? ? ? ? ? ? ? ? ? ? row.setHeightInPoints(60);

? ? ? ? ? ? ? ? ? ? ? ? // 設置圖片所在列寬度為80px,注意這里單位的一個換算

? ? ? ? ? ? ? ? ? ? ? ? sheet.setColumnWidth(i, (short) (35.7 * 80));

? ? ? ? ? ? ? ? ? ? ? ? byte[] bsValue = (byte[]) value;

? ? ? ? ? ? ? ? ? ? ? ? XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1023, 255, (short) 6, index, (short) 6, index);

? ? ? ? ? ? ? ? ? ? ? ? anchor.setAnchorType(2);

? ? ? ? ? ? ? ? ? ? ? ? patriarch.createPicture(anchor, book.addPicture(

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bsValue, XSSFWorkbook.PICTURE_TYPE_JPEG));

? ? ? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ? ? //判斷value是否為空

? ? ? ? ? ? ? ? ? ? ? ? if(value != null){

? ? ? ? ? ? ? ? ? ? ? ? // 其它數據類型都當作字符串簡單處理

? ? ? ? ? ? ? ? ? ? ? ? textValue = value.toString();

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? // 如果不是圖片數據,就利用正則表達式判斷textValue是否全部由數字組成

? ? ? ? ? ? ? ? ? ? if (textValue != null) {

? ? ? ? ? ? ? ? ? ? ? ? Pattern p = Pattern.compile("^//d+(//.//d+)?$");

? ? ? ? ? ? ? ? ? ? ? ? Matcher matcher = p.matcher(textValue);

? ? ? ? ? ? ? ? ? ? ? ? if (matcher.matches()) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 是數字當作double處理

? ? ? ? ? ? ? ? ? ? ? ? ? ? cell.setCellValue(Double.parseDouble(textValue));

? ? ? ? ? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ? ? ? ?XSSFRichTextString richString = new XSSFRichTextString(

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? textValue);

? ? ? ? ? ? ? ? ? ? ? ? ? ? richString.applyFont(font);

? ? ? ? ? ? ? ? ? ? ? ? ? ? cell.setCellValue(richString);

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? } catch (SecurityException e) {



? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? } catch (NoSuchMethodException e) {



? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? } catch (IllegalArgumentException e) {



? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? } catch (IllegalAccessException e) {



? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? } catch (InvocationTargetException e) {



? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? } finally {

? ? ? ? ? ? ? ? ? ? // 清理資源

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }



? ? ? ? }

? ? ? ? try {

? ? ? ? ? ? book.write(out);

? ? ? ? ? ? out.flush();

? ? ? ? ? ? out.close();

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }



? ? }

? ??

}


使用方法:


?ExportExcel<ContractVO> ex = new ExportExcel<ContractVO>();

? ? ? ? // 設置列表名

? ? ? ? String[] headers = { "序號", "員工姓名", "性別","合同類型",? "×××號碼", "派遣單位",

? ? ? ? ? ? ? ? "派遣時間", "合同開始時間", "合同結束時間","合同期限","合同狀態(tài)","合同名稱" };


? ? ? ?//查詢導出列表名的值

? ? ? ? List<ContractVO> dataset = contractExpireDmn.getContractMessage();

? ? ? ? response.reset();

? ? ? ? // 設置生成的文件類型

? ? ? ? response.setContentType("application/vnd.ms-excel");


? ? ? //設置文件頭

? ? ? ? response.setHeader("Content-disposition","attachment;filename=" +new String(("單位合同預警信息").getBytes("gbk"), "iso8859-1")

? ? ? ? + ".xlsx");

? ? ? ? OutputStream os = response.getOutputStream();

? ? ? ? // 把數據傳入到導出Excel的方法里面

? ? ? ? ex.exportExcel("單位員工合同Excel文檔",headers, dataset, os,session);


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI