package com.jy.common;
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 org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;


	/**
	 * 
	 * 利用开源组件POI3.0.2动态导出EXCEL文档
	 * 转载时请保留以下信息,注明出处!
	 * @author leno
	 * @version v1.0
	 * @param <T>
	 *            应用泛型,代表任意一个符合javabean风格的类
	 *            注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
	 *            byte[]表jpg格式的图片数据
	 */

	public class ExportExcel<T> {
		public void exportExcel(Collection<T> dataset, OutputStream out) {
			exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
		}
		public void exportExcel(String[] headers, Collection<T> dataset,
		OutputStream out) {
			exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
		}
		public void exportExcel(String[] headers, Collection<T> dataset,
		OutputStream out, String pattern) {
			exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
		}
		/**
		 * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
		 * @param title  表格标题名
		 * @param headers 表格属性列名数组
		 * @param dataset  需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
		 *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
		 * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
		 * @param pattern  如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
		 */
		@SuppressWarnings("unchecked")
		public void exportExcel(String title, String[] headers,
		Collection<T> dataset, OutputStream out, String pattern) {
			// 声明一个工作薄
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 生成一个表格
			HSSFSheet sheet = workbook.createSheet(title);
			// 设置表格默认列宽度为15个字节
			sheet.setDefaultColumnWidth((short) 15);
			// 生成一个样式
			HSSFCellStyle style = workbook.createCellStyle();
			// 设置这些样式
			style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
			style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			style.setBorderRight(HSSFCellStyle.BORDER_THIN);
			style.setBorderTop(HSSFCellStyle.BORDER_THIN);
			style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			// 生成一个字体
			HSSFFont font = workbook.createFont();
			font.setColor(HSSFColor.VIOLET.index);
			font.setFontHeightInPoints((short) 12);
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			// 把字体应用到当前的样式
			style.setFont(font);
			// 生成并设置另一个样式
			HSSFCellStyle style2 = workbook.createCellStyle();
			style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
			style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
			style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
			style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
			// 生成另一个字体
			HSSFFont font2 = workbook.createFont();
			font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
			// 把字体应用到当前的样式
			style2.setFont(font2);
			// 声明一个画图的顶级管理器
			HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
			// 定义注释的大小和位置,详见文档
			HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(
					0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
			// 设置注释内容
			comment.setString(new HSSFRichTextString("Table数据导出结果!"));
			// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
			comment.setAuthor("leno");
			// 产生表格标题行
			HSSFRow row = sheet.createRow(0);
			for (short i = 0; i < headers.length; i++) {
				HSSFCell cell = row.createCell(i);
				cell.setCellStyle(style);
				HSSFRichTextString text = new HSSFRichTextString(headers[i]);
				cell.setCellValue(text);
			}
			// 遍历集合数据,产生数据行
			Iterator<T> 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 (short i = 0; i < fields.length; i++) {
					HSSFCell cell = row.createCell(i);
					cell.setCellStyle(style2);
					Field field = fields[i];
					String fieldName = field.getName();
					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 Integer) {
						// int intValue = (Integer) value;
						// cell.setCellValue(intValue);
						// } else if (value instanceof Float) {
						// float fValue = (Float) value;
						// textValue = new HSSFRichTextString(
						// String.valueOf(fValue));
						// cell.setCellValue(textValue);
						// } else if (value instanceof Double) {
						// double dValue = (Double) value;
						// textValue = new HSSFRichTextString(
						// String.valueOf(dValue));
						// cell.setCellValue(textValue);
						// } else if (value instanceof Long) {
						// long longValue = (Long) value;
						// cell.setCellValue(longValue);
						// }
						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 byte[]) {
							// 有图片时,设置行高为60px;
							row.setHeightInPoints(60);
							// 设置图片所在列宽度为80px,注意这里单位的一个换算
							sheet.setColumnWidth(i, (short) (35.7 * 80));
							// sheet.autoSizeColumn(i);
							byte[] bsValue = (byte[]) value;
							HSSFClientAnchor anchor = new HSSFClientAnchor(0,
									0,
									1023, 255, (short) 6, index, (short) 6,
									index);
							anchor.setAnchorType(2);
							patriarch.createPicture(anchor,
									workbook.addPicture(
									bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
						} else {
							// 其它数据类型都当作字符串简单处理
							if(value==null){
								value="";
							}
							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 {
								HSSFRichTextString richString = new HSSFRichTextString(
										textValue);
								HSSFFont font3 = workbook.createFont();
								font3.setColor(HSSFColor.BLUE.index);
								richString.applyFont(font3);
								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 {
				
				workbook.write(out);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
}
最近下载更多
wydpopwyd  LV11 2021年1月20日
hdf999  LV12 2021年1月13日
wjh12345654321  LV14 2020年7月17日
libo1212  LV8 2020年5月9日
zhuhaijun  LV12 2020年3月4日
gao1230  LV4 2019年12月25日
supervip  LV4 2019年10月16日
182money  LV12 2019年9月16日
默灬默  LV1 2019年7月31日
longtianshang  LV9 2019年7月26日
最近浏览更多
uni-code_0123  LV1 2023年11月29日
badboy1979  LV12 2023年11月16日
601601lmy  LV5 2023年10月20日
是你爸爸啊100  LV5 2022年8月8日
yangtongyong  LV15 2022年6月24日
June06  LV2 2022年4月25日
caozongan  LV19 2022年2月21日
Yanxigul 2021年12月1日
暂无贡献等级
tansuo阿郎  LV8 2021年11月29日
快乐又混蛋 2021年11月4日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友