import java.io.IOException;
古交網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,古交網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為古交上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的古交做網(wǎng)站的公司定做!
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;
/**
?* 導(dǎo)出Excel表
?*??
?* @author wangbowen
?*?
?* @param
?*/
public class ExportExcel
? ? /**
? ? ?* 導(dǎo)出excel
? ? ?* @param footTitle 腳標(biāo)題
? ? ?* @param dataset 控制數(shù)據(jù)
? ? ?* @param out 輸出流
? ? ?*? @param session 會(huì)話
? ? ?*/
? ? public void exportExcel(String footTitle,Collection
? ? ? ? export(footTitle, null, dataset, out, "yyyy-MM-dd",session);
? ? }
? ? /**
? ? ?* 導(dǎo)出excel
? ? ?* @param footTitle 腳標(biāo)題
? ? ?* @param headers 表頭
? ? ?* @param dataset 控制數(shù)據(jù)
? ? ?* @param out 輸出流
? ? ?* @param session 會(huì)話
? ? ?*/
? ? public void exportExcel(String footTitle, String[] headers, Collection
? ? ? ? ? ? OutputStream out,HttpSession session) {
? ? ? ? export(footTitle, headers, dataset, out, "yyyy-MM-dd",session);
? ? }
? ? /**
? ? ?* 導(dǎo)出excel
? ? ?* @param footTitle 腳標(biāo)題
? ? ?* @param headers? 表頭
? ? ?* @param dataset 控制數(shù)據(jù)
? ? ?* @param out 輸出流
? ? ?* @param pattern 驗(yàn)證
? ? ?*? @param session 會(huì)話
? ? ?*/
? ? public void exportExcel(String footTitle,String[] headers, Collection
? ? ? ? ? ? OutputStream out, String pattern,HttpSession session) {
? ? ? ? export(footTitle,headers, dataset, out, pattern,session);
? ? }
? ? /**
? ? ?* 通用的方法,利用了JAVA的反射機(jī)制,可以將放置在JAVA集合中并且符號一定條件的數(shù)據(jù)以EXCEL 的形式輸出到指定IO設(shè)備上
? ? ?*?
? ? ?* @param title
? ? ?*? ? ? ? ? ? 表格標(biāo)題
? ? ?* @param headers
? ? ?*? ? ? ? ? ? 表格屬性列名數(shù)組
? ? ?* @param dataset
? ? ?*? ? ? ? ? ? 需要顯示的數(shù)據(jù)集合,集合中一定要放置符合javabean風(fēng)格的類的對象。此方法支持的
? ? ?*? ? ? ? ? ? javabean屬性的數(shù)據(jù)類型有基本數(shù)據(jù)類型及String,Date,byte[](圖片數(shù)據(jù))
? ? ?* @param out
? ? ?*? ? ? ? ? ? 輸出設(shè)備關(guān)聯(lián)的流對象,可以將EXCEL文檔導(dǎo)出到本地文件或者網(wǎng)絡(luò)中
? ? ?* @param pattern
? ? ?*? ? ? ? ? ? 如果有時(shí)間數(shù)據(jù),設(shè)定輸出格式。默認(rèn)為"yyy-MM-dd"
? ? ?*? @param session 會(huì)話
? ? ?*/
? ? public void export(String title, String[] headers,
? ? ? ? ? ? Collection
? ? ? ? //申明一個(gè)工作簿
? ? ? ? XSSFWorkbook book = new XSSFWorkbook();
? ? ? ? //創(chuàng)建一個(gè)表
? ? ? ? XSSFSheet sheet = book.createSheet();
? ? ? ? // 設(shè)置表格默認(rèn)列寬度為30個(gè)字節(jié)
? ? ? ? sheet.setDefaultColumnWidth(25);
? ? ? ? // 聲明一個(gè)畫圖的頂級管理器
? ? ? ? XSSFDrawing patriarch = sheet.createDrawingPatriarch();
? ? ? ? book.setSheetName(0, title); // 設(shè)置第一個(gè)sheet的名稱
? ? ? ? XSSFRow row = sheet.createRow((short) 0);
? ? ? ? XSSFFont font = book.createFont();
? ? ? ? // font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
? ? ? ? font.setFontHeightInPoints((short) 9); // 設(shè)置字體大小
? ? ? ? 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)數(shù)據(jù)
? ? ? ? Iterator
? ? ? ? int index = 0;
? ? ? ? while (it.hasNext()) {
? ? ? ? ? ? index++;
? ? ? ? ? ? row = sheet.createRow(index);
? ? ? ? ? ? T t = (T) it.next();
? ? ? ? ? ? // 利用反射,根據(jù)javabean屬性的先后順序,動(dòng)態(tài)調(diào)用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就進(jìn)入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[] {});
? ? ? ? ? ? ? ? ? ? // 判斷值的類型后進(jìn)行強(qiáng)制類型轉(zhuǎn)換
? ? ? ? ? ? ? ? ? ? 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[]) {
? ? ? ? ? ? ? ? ? ? ? ? // 有圖片時(shí),設(shè)置行高為60px;
? ? ? ? ? ? ? ? ? ? ? ? row.setHeightInPoints(60);
? ? ? ? ? ? ? ? ? ? ? ? // 設(shè)置圖片所在列寬度為80px,注意這里單位的一個(gè)換算
? ? ? ? ? ? ? ? ? ? ? ? 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){
? ? ? ? ? ? ? ? ? ? ? ? // 其它數(shù)據(jù)類型都當(dāng)作字符串簡單處理
? ? ? ? ? ? ? ? ? ? ? ? textValue = value.toString();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? // 如果不是圖片數(shù)據(jù),就利用正則表達(dá)式判斷textValue是否全部由數(shù)字組成
? ? ? ? ? ? ? ? ? ? if (textValue != null) {
? ? ? ? ? ? ? ? ? ? ? ? Pattern p = Pattern.compile("^//d+(//.//d+)?$");
? ? ? ? ? ? ? ? ? ? ? ? Matcher matcher = p.matcher(textValue);
? ? ? ? ? ? ? ? ? ? ? ? if (matcher.matches()) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 是數(shù)字當(dāng)作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
? ? ? ? // 設(shè)置列表名
? ? ? ? String[] headers = { "序號", "員工姓名", "性別","合同類型",? "×××號碼", "派遣單位",
? ? ? ? ? ? ? ? "派遣時(shí)間", "合同開始時(shí)間", "合同結(jié)束時(shí)間","合同期限","合同狀態(tài)","合同名稱" };
? ? ? ?//查詢導(dǎo)出列表名的值
? ? ? ? List
? ? ? ? response.reset();
? ? ? ? // 設(shè)置生成的文件類型
? ? ? ? response.setContentType("application/vnd.ms-excel");
? ? ? //設(shè)置文件頭
? ? ? ? response.setHeader("Content-disposition","attachment;filename=" +new String(("單位合同預(yù)警信息").getBytes("gbk"), "iso8859-1")
? ? ? ? + ".xlsx");
? ? ? ? OutputStream os = response.getOutputStream();
? ? ? ? // 把數(shù)據(jù)傳入到導(dǎo)出Excel的方法里面
? ? ? ? ex.exportExcel("單位員工合同Excel文檔",headers, dataset, os,session);