import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Date; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class XLSExport { // 定制日期格式 private static String DATE_FORMAT = "m/d/yy h:mm" ; // "m/d/yy h:mm" // 定制浮点数格式 private static String NUMBER_FORMAT = " #,##0.00 " ; private String xlsFileName; private HSSFWorkbook workbook; private HSSFSheet sheet; private HSSFRow row; public XLSExport() { this .workbook = new HSSFWorkbook(); this .sheet = workbook.createSheet(); } /** * 初始化Excel * @param fileName * 导出文件名 */ public XLSExport(String fileName) { this .xlsFileName = fileName; this .workbook = new HSSFWorkbook(); this .sheet = workbook.createSheet(); } /** * 导出Excel文件 * @throws XLSException */ public void exportXLS() throws XLSException { try { FileOutputStream fOut = new FileOutputStream(xlsFileName); workbook.write(fOut); fOut.flush(); fOut.close(); } catch (FileNotFoundException e) { throw new XLSException("生成导出Excel文件出错! " ); } catch (IOException e) { throw new XLSException("写入Excel文件出错! "); } } /** * 导出 excel 能够穿 response.getOutputStream * @param os * @throws XLSException */ public void exportXLS(OutputStream os) throws XLSException { try { workbook.write(os); os.flush(); os.close(); } catch (FileNotFoundException e) { throw new XLSException("生成导出Excel文件出错! " ); } catch (IOException e) { throw new XLSException("写入Excel文件出错! "); } } /** * 使用ByteArrayOutputStream * 将 Workbook内容写到此输出流 再经过toByteArray方法获取数据源 * 再 new ByteArrayInputStream(); * @return */ public InputStream getExcelInputStream(){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { workbook.write(bos); } catch (IOException e) { e.printStackTrace(); } return new ByteArrayInputStream(bos.toByteArray()); } /** * 增长一行 * @param index * 行号 */ public void createRow( int index) { this .row = this .sheet.createRow(index); } /** * 建立表头 * @param index * @param headName */ public void createTableHead(int index,String...headName){ createRow(index); //添加表头信息 for(int i = 0;i<headName.length;i++){ setCell(i,headName[i]); } } /** * 根据传进来的集合 生成excel * @param list * @param flag :true 表明有表头 false 没有 */ public void createExcelByList(List list,boolean flag){ for(int i = 0;i<list.size();i++){ //建立行 createRow(flag?i+1:i); //获取对象及反射对象 Object obj = list.get(i); Class c = obj.getClass(); //获取全部属性 Field[] fieldArray = c.getDeclaredFields(); //遍历全部属性 try { for(int j = 0;j<fieldArray.length;j++){ //获取属性对应的值 String getter = GetNameUtil.getGetter(fieldArray[j]); Method m = c.getDeclaredMethod(getter); Object value = m.invoke(obj); if(value != null){ Class type = fieldArray[j].getType();//获取属性类型 if(type==Integer.class||type==int.class){ setCell(j, (Integer)value); }else if(type==Double.class||type==double.class){ setCell(j, (Double)value); }else if(type==Date.class){//java.sql.Date日期处理 Date d = (Date)value; GregorianCalendar gc = new GregorianCalendar(); gc.setTime(d); setCell(j, gc); }else if(type==String.class){ setCell(j, (String)value); } } } } catch (Exception e) { e.printStackTrace(); } } } /** * 设置单元格 * @param index * 列号 * @param value * 单元格填充值 */ public void setCell( int index, String value) { HSSFCell cell = this .row.createCell(index); cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setCellValue(value); } /** * 设置单元格 * @param index * 列号 * @param value * 单元格填充值 */ public void setCell( int index, Calendar value) { HSSFCell cell = this .row.createCell(index); cell.setCellValue(value.getTime()); HSSFCellStyle cellStyle = workbook.createCellStyle(); // 创建新的cell样式 cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(DATE_FORMAT)); // 设置cell样式为定制的日期格式 cell.setCellStyle(cellStyle); // 设置该cell日期的显示格式 sheet.setColumnWidth(index, 10000); } /** * 设置单元格 * @param index * 列号 * @param value * 单元格填充值 */ public void setCell( int index, int value) { HSSFCell cell = this .row.createCell(index); cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cell.setCellValue(value); } /** * 设置单元格 * @param index * 列号 * @param value * 单元格填充值 */ public void setCell( int index, double value) { HSSFCell cell = this .row.createCell(index); cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cell.setCellValue(value); HSSFCellStyle cellStyle = workbook.createCellStyle(); // 创建新的cell样式 HSSFDataFormat format = workbook.createDataFormat(); cellStyle.setDataFormat(format.getFormat(NUMBER_FORMAT)); // 设置cell样式为定制的浮点数格式 cell.setCellStyle(cellStyle); // 设置该cell浮点数的显示格式 } public String getXlsFileName() { return xlsFileName; } public void setXlsFileName(String xlsFileName) { this.xlsFileName = xlsFileName; } public HSSFWorkbook getWorkbook() { return workbook; } public void setWorkbook(HSSFWorkbook workbook) { this.workbook = workbook; } public HSSFSheet getSheet() { return sheet; } public void setSheet(HSSFSheet sheet) { this.sheet = sheet; } public HSSFRow getRow() { return row; } public void setRow(HSSFRow row) { this.row = row; } }