热门IT资讯网

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

发表于:2024-11-25 作者:热门IT资讯网编辑
编辑最后更新 2024年11月25日,import java.io.IOException;import java.io.OutputStream;import java.lang.reflect.Field;import java.la

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 应用泛型,代表任意一个符合javabean风格的类

*/

public class ExportExcel {

/**

* 导出excel

* @param footTitle 脚标题

* @param dataset 控制数据

* @param out 输出流

* @param session 会话

*/

public void exportExcel(String footTitle,Collection 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 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 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 dataset, OutputStream out, String pattern, HttpSession session) {

//申明一个工作簿

XSSFWorkbook book = new XSSFWorkbook();

//创建一个表

XSSFSheet sheet = book.createSheet();

// 设置表格默认列宽度为30个字节

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);

}

// 循环数据

Iterator it = dataset.iterator();

int index = 0;

while (it.hasNext()) {

index++;

row = sheet.createRow(index);

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

// 利用反射,根据javabean属性的先后顺序,动态调用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 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 ex = new ExportExcel();

// 设置列表名

String[] headers = { "序号", "员工姓名", "性别","合同类型", "×××号码", "派遣单位",

"派遣时间", "合同开始时间", "合同结束时间","合同期限","合同状态","合同名称" };


//查询导出列表名的值

List 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);


0