首页 > 代码库 > HP-JavaUtil: xls 操作类

HP-JavaUtil: xls 操作类

Written In The Font

谢谢,陈明.哈哈!共勉,努力搞定它.

路漫漫其修远兮,吾将上下而求索

Content

ExportExcelAndSave(

    String[] header,

    List<Object> excelList,

    String sheetTitle,

    String filePath,

    String fileName)

 

@param header 表格属性列名数组

@param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

@param sheetTitle 表格标题名

@param filePath Excel文件保存位置

@param fileName Excel文件名

 

ExportExcelAndSave(

    String[] header,

    String[] properties,

    List<Object> excelList,

    String sheetTitle,

    String filePath,

    String fileName)

 

@param header 表格属性列名数组

@param properties 表头对应javaBean中的属性

@param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

@param sheetTitle 表格标题名

@param filePath Excel文件保存位置

@param fileName Excel文件名

 

ExportExcelAndZip(

    String[] header,

    List<Object> excelList,

    String sheetTitle,

    String filePath,

    String excelName,

    String zipName)

 

@param header 表格属性列名数组

@param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

@param sheetTitle 表格标题名

@param filePath zip文件保存位置

@param excelName  Excel名称

@param zipName zip名称

 

ExportExcelAndZip(

    String[] header,

    String[] properties,

    List<Object> excelList,

    String sheetTitle,

    String filePath,

    String excelName,

    String zipName)

 

@param header 表格属性列名数组

@param properties 表头对应javaBean的属性

@param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

@param sheetTitle 表格标题名

@param filePath zip文件保存位置

@param excelName  Excel名称

@param zipName zip名称

 

大数据存储

 

ExportExcelForBigDataAndSave(

    String[] header,

    List<Object> excelList,

    String sheetTitle,

    String flag,

    String filePath,

    String fileName)

 

@param header 表格属性列名数组

@param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

@param sheetTitle 表格标题名

@param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet

@param filePath 文件保存路径

@param fileName 保存文件名

 

ExportExcelForBigDataAndSave(

    String[] header,

    String[] properties,

    List<Object> excelList,

    String sheetTitle,

    String flag,

    String filePath,

    String fileName)

 

@param header 表格属性列名数组

@param properties 表头对应javaBean属性

@param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

@param sheetTitle 表格标题名

@param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet

@param filePath 文件保存路径

@param fileName 保存文件名

 

ExportExcelForBigDataAndZipAndSave(

    String[] header,

    List<Object> excelList,

    String sheetTitle,

    String flag,

    String filePath,

    String excelName,

    String zipName)

 

@param header 表格属性列名数组

@param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

@param sheetTitle 表格标题名

@param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet

@param filePath 文件保存路径

@param excelName Excel文件名

@param zipName zip文件名

 

ExportExcelForBigDataAndZipAndSave(

    String[] header,

    String[] properties,

    List<Object> excelList,

    String sheetTitle,

    String flag,

    String filePath,

    String excelName,

    String zipName)

 

@param header 表格属性列名数组

@param properties 表头对应javaBean属性

@param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

@param sheetTitle 表格标题名

@param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet

@param filePath 文件保存路径

@param excelName  Excel文件名

@param zipName ZIP文件名

 

package com.javaUtil.utils.excel;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.Random;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;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.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;/** * @Description: Excel 生成通用类,为了兼容,所有 Excel 统一生成 Excel2003 即:xx.xls * @Project:javaUtils * @Author : chenssy * @email:chenssy995812509@163.com * @Web:cmsblogs.com * @Date : 2014年6月15日 下午9:09:38 * @version 1.0 */public class ExcelExportHelper {        /** 时间格式:默认为yyyy-MM-dd */    private String DATE_PATTERN = "yyyy-MM-dd";        /** 图片宽度,默认为:100 */    private int IMAGE_WIDTH = 30;         /** 图片高度,默认为:50 */    private int IMAGE_HEIGHT = 5;        /** 单元格的最大宽度 */    private int[] maxWidth;        /**      * 单页支持最多数据列:超过65534会出错     * 若数据列多余65534则需要通过MORE_EXCEL_FLAG、MORE_SHEET_FLAG来区别生成多个Excel、还是sheet     */    private int maxRowCount = 2500;        /** 大量数据,多个Excel标识---0001 */    private String  MORE_EXCEL_FLAG = "0001";        /** 大量数据,多个sheet标识---0001 */    private String MORE_SHEET_FLAG = "0002";        /**     * 默认构造函数      */    public ExcelExportHelper(){    }        /**     * @param datePattern 指定的时间格式     */    public ExcelExportHelper(String datePattern){        this.DATE_PATTERN = datePattern;    }        /**     * @param imageWidth 指定图片的宽度     * @param imageHeight 指定图片的高度     */    public ExcelExportHelper(int imageWidth,int imageHeight){        this.IMAGE_HEIGHT = imageHeight;        this.IMAGE_WIDTH = imageWidth;    }        /**     * @param datePatter 指定时间格式     * @param imageWidth 指定图片的宽度     * @param imageHeight 指定图片的高度     */    public ExcelExportHelper(String datePatter,int imageWidht,int imageHeight){        this.DATE_PATTERN = datePatter;        this.IMAGE_HEIGHT = imageHeight;        this.IMAGE_WIDTH = imageWidht;    }        /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,如有图片请转换为byte[]<br>     * header、excelList规则如下:<br>     * header、excelList中的Bean必须对应(javaBean的属性顺序):如下<br>     * header:姓名、年龄、性别、班级<br>     * Bean:name、age、sex、class<br>     *      * @author chenssy      * @date 2014年6月15日 下午9:18:37     *      * @param header  表格属性列名数组     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @return 生成的HSSFWorkBook     * @version 1.0     */    public HSSFWorkbook exportExcel(String[] header,List<Object> excelList,String sheetTitle){        //生成一个Excel        HSSFWorkbook book = new HSSFWorkbook();          //生成一个表格        sheetTitle = getSheetTitle(sheetTitle);   //判断、设置sheetTitle        HSSFSheet sheet = book.createSheet(sheetTitle);                //设置Excel里面数据        setExcelContentData(book,sheet,header,excelList);                System.out.println("——————————————————ExcelExportHelper:Excel生成成功...");                return book;    }        /**     *      * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,如有图片请转换为byte[]<br>     * header、properties需要一一对应:<Br>     * header = ["学号","年龄","性别","班级"]     * properties = ["id","age","sex","class"],其对应的excelList中javaBean的属性值     *      * @author chenssy      * @date 2014年6月19日 下午6:02:02     *      * @param header  Excel表头     * @param properties  表头对应javaBean中的属性     * @param excelList  需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle  表格标题名     *      * @return 生成的HSSFWorkbook     * @version 1.0     */    public HSSFWorkbook exportExcel(String[] header,String[] properties,List<Object> excelList,            String sheetTitle){        //生成一个Excel        HSSFWorkbook book = new HSSFWorkbook();        // 生成一个表格        sheetTitle = getSheetTitle(sheetTitle); // 判断、设置sheetTitle        HSSFSheet sheet = book.createSheet(sheetTitle);        // 设置Excel里面数据        setExcelContentData(book, sheet, header, properties ,excelList);        System.out.println("——————————————————ExcelExportHelper:Excel生成成功...");        return book;    }    /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,并将Excel保存至某个路径下,     * 如有图片请转换为byte[]<br>     * header、excelList规则如下:<br>     * header、excelList中的Bean必须一一对应(javaBean的属性顺序):如下<br>     * header:姓名、年龄、性别、班级<br>     * Bean:name、age、sex、class<br>     *      * @author chenssy      * @date 2014年6月17日 下午2:24:38     *      * @param header 表格属性列名数组     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param filePath Excel文件保存位置      * @param fileName Excel文件名     *      * @return     * @version 1.0     */    public void exportExcelAndSave(String[] header,List<Object> excelList,String sheetTitle,            String filePath,String fileName){        //生成Excel        HSSFWorkbook book = exportExcel(header, excelList, sheetTitle);                //保存生成的Excel        saveExcel(book,filePath,fileName);    }        /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,并将Excel保存至某个路径下,     * 如有图片请转换为byte[]<br>     * header、properties需要一一对应:<Br>     * header = ["学号","年龄","性别","班级"]     * properties = ["id","age","sex","class"],其对应的excelList中javaBean的属性值     *      * @author chenming      * @date 2014年6月19日 下午6:24:56     *      * @param header 表格属性列名数组     * @param properties 表头对应javaBean中的属性     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param filePath Excel文件保存位置      * @param fileName Excel文件名     * @version 1.0     */    public void exportExcelAndSave(String[] header,String[] properties,List<Object> excelList,String sheetTitle,            String filePath,String fileName){        //生成Excel        HSSFWorkbook book = exportExcel(header, properties,excelList, sheetTitle);            //保存生成的Excel        saveExcel(book,filePath,fileName);    }    /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,并将 Excel 打包 zip 格式保存至某个路径下,     * 如有图片请转换为byte[]<br>     * header、excelList规则如下:<br>     * header、excelList中的Bean必须一一对应(javaBean的属性顺序):如下<br>     * header:姓名、年龄、性别、班级<br>     * Bean:name、age、sex、class<br>     *      * @author chenssy      * @date 2014年6月18日 下午12:36:01     *      * @param header 表格属性列名数组     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param filePath zip文件保存位置      * @param excelName  Excel名称     * @param zipName zip名称     *      * @version 1.0     */    public void exportExcelAndZip(String[] header,List<Object> excelList,String sheetTitle,            String filePath,String excelName,String zipName){        //生成Excel        HSSFWorkbook book = exportExcel(header, excelList, sheetTitle);                //将生成的Excel打包保存起来        List<HSSFWorkbook> books = new ArrayList<HSSFWorkbook>();        books.add(book);        zipExcelAndSave(books, filePath, zipName, excelName);    }        /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,并将 Excel 打包 zip 格式保存至某个路径下,     * 如有图片请转换为byte[]<br>     * header、properties需要一一对应:<Br>     * header = ["学号","年龄","性别","班级"]     * properties = ["id","age","sex","class"],其对应的excelList中javaBean的属性值     *      * @author chenssy      * @date 2014年6月19日 下午6:33:04     *      * @param header 表格属性列名数组     * @param properties 表头对应javaBean的属性     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param filePath zip文件保存位置      * @param excelName  Excel名称     * @param zipName zip名称     *      * @version 1.0     */    public void exportExcelAndZip(String[] header,String[] properties,List<Object> excelList,String sheetTitle,            String filePath,String excelName,String zipName){        //生成Excel        HSSFWorkbook book = exportExcel(header, properties,excelList, sheetTitle);                        //将生成的Excel打包保存起来        List<HSSFWorkbook> books = new ArrayList<HSSFWorkbook>();        books.add(book);        zipExcelAndSave(books, filePath, zipName, excelName);    }        /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,如有图片请转换为byte[]<br>     * 用于大数据量时使用,涉及到一个表只能有65536行,当数据量较大时会直接写入下一个表(excel、sheet)     * header、excelList规则如下:<br>     * header、excelList中的Bean必须一一对应(javaBean的属性顺序):如下<br>     * header:姓名、年龄、性别、班级<br>     * Bean:name、age、sex、class<br>     *      * @author chenssy      * @date 2014年6月17日 下午9:53:15     *      * @param header 表格属性列名数组     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet     * @return List<HSSFWorkbook>     * @version 1.0     */    public List<HSSFWorkbook> exportExcelForBigData(String[] header,List<Object> excelList,String sheetTitle,            String flag){        List<HSSFWorkbook> list = new ArrayList<>();    //创建表数据结果集        //判断需要生成几个Excel        int num  = excelList.size() % maxRowCount == 0 ? excelList.size() / maxRowCount : excelList.size() / maxRowCount + 1;                HSSFWorkbook book = new HSSFWorkbook();        List<Object> newList  = null;    //新数据列表        String newTitle = null;    //新title        for(int i = 0 ; i < num ; i++){            //计算新的数据列表            int beginRowNum = maxRowCount * i;            int endRowNum = maxRowCount * (i + 1) > excelList.size() ? excelList.size() : maxRowCount * (i + 1);            newList = excelList.subList(beginRowNum, endRowNum);            newTitle = getSheetTitle(sheetTitle) + "_" + i;                if(MORE_EXCEL_FLAG.equals(flag)){     //如果是创建多个Excel                book = exportExcel(header, newList, newTitle);                list.add(book);            }            else if(MORE_SHEET_FLAG.equals(flag)){   //创建多sheet                HSSFSheet sheet = book.createSheet(newTitle);                setExcelContentData(book,sheet,header,newList);            }        }                if(MORE_SHEET_FLAG.equals(flag)){   //创建多sheet            list.add(book);        }                return list;    }        /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,如有图片请转换为byte[]<br>     * 用于大数据量时使用,涉及到一个表只能有65536行,当数据量较大时会直接写入下一个表(excel、sheet)     * header、properties需要一一对应:<Br>     * header = ["学号","年龄","性别","班级"]     * properties = ["id","age","sex","class"],其对应的excelList中javaBean的属性值     *      * @author chenssy      * @date 2014年6月19日 下午6:41:23     *      * @param header 表格属性列名数组     * @param properties 表头对应javaBean的属性     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet     * @return List<HSSFWorkbook>     * @version 1.0     */    public List<HSSFWorkbook> exportExcelForBigData(String[] header,String[] properties,            List<Object> excelList,String sheetTitle, String flag){        List<HSSFWorkbook> list = new ArrayList<>();    //创建表数据结果集        // 判断需要生成几个Excel        int num = excelList.size() % maxRowCount == 0 ? excelList.size() / maxRowCount : excelList.size() / maxRowCount + 1;        HSSFWorkbook book = new HSSFWorkbook();        List<Object> newList = null; // 新数据列表        String newTitle = null; // 新title        for (int i = 0; i < num; i++) {            // 计算新的数据列表            int beginRowNum = maxRowCount * i;            int endRowNum = maxRowCount * (i + 1) > excelList.size() ? excelList.size() : maxRowCount * (i + 1);            newList = excelList.subList(beginRowNum, endRowNum);            newTitle = getSheetTitle(sheetTitle) + "_" + i;            if (MORE_EXCEL_FLAG.equals(flag)) { // 如果是创建多个Excel                book = exportExcel(header,properties, newList, newTitle);                list.add(book);            } else if (MORE_SHEET_FLAG.equals(flag)) { // 创建多sheet                HSSFSheet sheet = book.createSheet(newTitle);                setExcelContentData(book, sheet, header, properties,newList);            }        }        if (MORE_SHEET_FLAG.equals(flag)) { // 创建多sheet            list.add(book);        }        return list;    }            /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,并将Excel保存至某个路径下,     * 如有图片请转换为byte[]<br>     * 用于大数据量时使用,涉及到一个表只能有65536行,当数据量较大时会直接写入下一个表(excel、sheet)     * header、excelList规则如下:<br>     * header、excelList中的Bean必须一一对应(javaBean的属性顺序):如下<br>     * header:姓名、年龄、性别、班级<br>     * Bean:name、age、sex、class<br>     *      * @author chenssy      * @date 2014年6月17日 下午10:39:15     *      * @param header 表格属性列名数组     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet     * @param filePath 文件保存路径     * @param fileName 保存文件名     * @return      * @version 1.0     */    public void exportExcelForBigDataAndSave(String[] header,List<Object> excelList,String sheetTitle,            String flag,String filePath,String fileName){        //获取数据结果集        List<HSSFWorkbook> books = exportExcelForBigData(header, excelList, sheetTitle, flag);        String _fileName = "";        for(int i = 0 ; i < books.size() ; i ++){            HSSFWorkbook book = books.get(i);            _fileName = getFileName(fileName) + "_0" + i;            //保存Excel文件            saveExcel(book, filePath, _fileName);        }    }        /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,并将Excel保存至某个路径下,     * 如有图片请转换为byte[]<br>     * 用于大数据量时使用,涉及到一个表只能有65536行,当数据量较大时会直接写入下一个表(excel、sheet)     * header、properties需要一一对应:<Br>     * header = ["学号","年龄","性别","班级"]     * properties = ["id","age","sex","class"],其对应的excelList中javaBean的属性值     *      * @author chenssy      * @date 2014年6月19日 下午8:22:25     *      * @param header 表格属性列名数组     * @param properties 表头对应javaBean属性     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet     * @param filePath 文件保存路径     * @param fileName 保存文件名     * @version 1.0     */    public void exportExcelForBigDataAndSave(String[] header,String[] properties,List<Object> excelList,String sheetTitle,            String flag,String filePath,String fileName){        //获取数据结果集        List<HSSFWorkbook> books = exportExcelForBigData(header, properties,excelList, sheetTitle, flag);                String _fileName = "";        for(int i = 0 ; i < books.size() ; i ++){            HSSFWorkbook book = books.get(i);            _fileName = getFileName(fileName) + "_0" + i;            //保存Excel文件            saveExcel(book, filePath, _fileName);        }    }            /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,并将 Excel 打包成 ZIP      * 保存至某个路径下,如有图片请转换为byte[]<br>     * 用于大数据量时使用,涉及到一个表只能有65536行,当数据量较大时会直接写入下一个表(excel、sheet)     * header、excelList规则如下:<br>     * header、excelList中的Bean必须一一对应(javaBean的属性顺序):如下<br>     * header:姓名、年龄、性别、班级<br>     * Bean:name、age、sex、class<br>     *      * @author chenssy      * @date 2014年6月19日 下午10:39:15     *      * @param header 表格属性列名数组     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet     * @param filePath 文件保存路径     * @param excelName Excel文件名     * @param zipName zip文件名     * @return      * @version 1.0     */    public void exportExcelForBigDataAndZipAndSave(String[] header,List<Object> excelList,String sheetTitle,            String flag,String filePath,String excelName,String zipName){        //获取生成的Excel集合        List<HSSFWorkbook> books = exportExcelForBigData(header, excelList, sheetTitle, flag);                //将生成的Excel打包并保存        zipExcelAndSave(books, filePath, zipName, excelName);    }        /**     * 通用方法,使用 java 反射机制,根据提供表头 header ,数据列 excelList 生成 Excel,并将 Excel 打包成 ZIP      * 保存至某个路径下,如有图片请转换为byte[]<br>     * 用于大数据量时使用,涉及到一个表只能有65536行,当数据量较大时会直接写入下一个表(excel、sheet)     * header、properties需要一一对应:<Br>     * header = ["学号","年龄","性别","班级"]     * properties = ["id","age","sex","class"],其对应的excelList中javaBean的属性值     *      * @author chenssy      * @date 2014年6月19日 下午8:24:21     *      * @param header 表格属性列名数组     * @param properties 表头对应javaBean属性     * @param excelList 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)     * @param sheetTitle 表格标题名     * @param flag 分页标识为。flag == 0001:生成多个Excel,flag == 0002:生成多个sheet     * @param filePath 文件保存路径     * @param excelName  Excel文件名     * @param zipName ZIP文件名     * @version 1.0     */    public void exportExcelForBigDataAndZipAndSave(String[] header,String[] properties,List<Object> excelList,String sheetTitle,            String flag,String filePath,String excelName,String zipName){        //获取生成的Excel集合        List<HSSFWorkbook> books = exportExcelForBigData(header, properties,excelList, sheetTitle, flag);                //将生成的Excel打包并保存        zipExcelAndSave(books, filePath, zipName, excelName);    }    /**     * 填充Excel数据内容     * @author chenssy      * @date 2014年6月17日 下午10:32:34     * @param book Excel     * @param sheet sheet     * @param header Excel头部title     * @param excelList Excel数据列     * @version 1.0     */    @SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })    private void setExcelContentData(HSSFWorkbook book,HSSFSheet sheet,String[] header,List<Object> excelList) {        //设置列头样式(居中、变粗、蓝色)        HSSFCellStyle headerStyle = book.createCellStyle();        setHeaderStyle(headerStyle, book);        // 设置单元格样式        HSSFCellStyle cellStyle = book.createCellStyle();        setCellStyle(cellStyle, book);        // 创建头部        HSSFRow row = createHeader(sheet, headerStyle, header);        // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();                int index = 0;        /* 避免在迭代过程中产生的新对象太多,这里讲循环内部变量全部移出来 */        Object t = null;            HSSFCell cell = null;        Field field = null;        String fieldName = null;        String getMethodName = null;        Class tCls = null;        Method getMethod = null;        Object value = null;        // 遍历集合数据,产生数据行        Iterator<Object> it = excelList.iterator();        maxWidth = new int[header.length];   //初始化单元格宽度        while (it.hasNext()) {            index++;            row = sheet.createRow(index);            // 设置数据列            t = it.next();            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值            Field[] fields = t.getClass().getDeclaredFields();            for (short i = 0; i < fields.length; i++) {                cell = row.createCell(i);                cell.setCellStyle(cellStyle);                field = fields[i];                fieldName = field.getName();                getMethodName = "get"+ fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);  //构建getter方法                try {                    tCls = t.getClass();                    getMethod = tCls.getMethod(getMethodName,new Class[] {});                    value = (Object) getMethod.invoke(t, new Object[] {});                    // 将value设置当单元格指定位置                    setCellData(row, index, i, value, cell, sheet, patriarch, book);                } catch (NoSuchMethodException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                } catch (SecurityException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                } catch (IllegalAccessException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                } catch (IllegalArgumentException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                } catch (InvocationTargetException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                }            }        }                System.out.println("——————————————————填充Excel数据成功..........");    }        /**     * 填充Excel内容     * @author chenssy      * @date 2014年6月19日 下午6:00:35     * @param book     * @param sheet     * @param header     * @param properties     * @param excelList     * @version 1.0     */    @SuppressWarnings("rawtypes")    private void setExcelContentData(HSSFWorkbook book, HSSFSheet sheet, String[] header, String[] properties,            List<Object> excelList) {        //设置列头样式(居中、变粗、蓝色)        HSSFCellStyle headerStyle = book.createCellStyle();        setHeaderStyle(headerStyle, book);        // 设置单元格样式        HSSFCellStyle cellStyle = book.createCellStyle();        setCellStyle(cellStyle, book);        // 创建头部        HSSFRow row = createHeader(sheet, headerStyle, header);        // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();        /* 为了避免迭代过程中产生过多的新对象,这里将循环内部变量全部移出来 */        int index = 0;        Object t = null;        HSSFCell cell = null;        Object o = null;        Class clazz = null;        PropertyDescriptor pd = null;        Method getMethod = null;        // 遍历集合数据,产生数据行        Iterator<Object> it = excelList.iterator();        maxWidth = new int[header.length];   //初始化单元格宽度        while (it.hasNext()) {            index++;            row = sheet.createRow(index);            // 设置数据列            t = it.next();            for(int i = 0 ; i < header.length ; i++){                cell = row.createCell(i);                cell.setCellStyle(cellStyle);                o = null;    //每一个单元格都需要将O设置为null                try {                    clazz = t.getClass();                    pd = new PropertyDescriptor(properties[i],clazz);                    getMethod = pd.getReadMethod();   // 获得get方法                    if (pd != null) {                         o  = getMethod.invoke(t);   //执行get方法返回一个Object                      }                      setCellData(row, index, i, o, cell, sheet, patriarch, book);                } catch (IntrospectionException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                } catch (IllegalAccessException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                } catch (IllegalArgumentException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                } catch (InvocationTargetException e) {                    e.printStackTrace();                    System.out.println("——————————————————创建Excel数据列表时出错。method:setDataRow,message:"+e.getMessage());                }            }        }        System.out.println("——————————————————填充Excel数据成功..........");    }        /**     * 设置sheet的title,若为空则为yyyyMMddHH24mmss     * @author chenssy      * @date 2014年6月16日 下午1:46:06     * @param sheetTitle     * @return     * @version 1.0     */    private  String getSheetTitle(String sheetTitle) {        String title = null;        if(sheetTitle != null && !"".equals(sheetTitle)){            title = sheetTitle;        }        else{            Date date = new Date();            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH24mmss");            title = sdf.format(date);        }        return title;    }        /**     * 设置Excel图片的格式:字体居中、变粗、蓝色、12号     * @author chenssy      * @date 2014年6月16日 下午8:46:49     * @param headerStyle     * @version 1.0     */    private void setHeaderStyle(HSSFCellStyle headerStyle,HSSFWorkbook book) {        headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);   //水平居中        headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中         //设置字体        HSSFFont font = book.createFont();        font.setFontHeightInPoints((short) 12);     //字号:12号        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);   //变粗        font.setColor(HSSFColor.BLUE.index);   //蓝色                headerStyle.setFont(font);    }        /**     * 设置单元格样式     * @author chenssy      * @date 2014年6月17日 上午11:00:53     * @param cellStyle     * @param book     * @version 1.0     */    private void setCellStyle(HSSFCellStyle cellStyle, HSSFWorkbook book) {        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);   //水平居中        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中                 HSSFFont font = book.createFont();        font.setFontHeightInPoints((short)12);                cellStyle.setFont(font);    }        /**     * 根据头部样式、头部数据创建Excel头部     * @author chenssy      * @date 2014年6月17日 上午11:37:28     * @param sheet sheet     * @param headerStyle 头部样式     * @param header 头部数据     * @return 设置完成的头部Row     * @version 1.0     */    private HSSFRow createHeader(HSSFSheet sheet,HSSFCellStyle headerStyle,            String[] header) {        HSSFRow headRow = sheet.createRow(0);        headRow.setHeightInPoints((short)(20));   //设置头部高度        //添加数据        HSSFCell cell = null;        for(int i = 0 ; i < header.length ; i++){            cell = headRow.createCell(i);            cell.setCellStyle(headerStyle);            HSSFRichTextString text = new HSSFRichTextString(header[i]);            cell.setCellValue(text);        }                return headRow;    }        /**     * 设置单元格数据     * @author chenssy      * @date 2014年6月17日 上午11:48:14     * @param row  指定行     * @param index      * @param i 行数     * @param value 单元格值     * @param cell 单元格     * @param sheet sheet     * @param patriarch  顶级画板     * @param book Excel     * @version 1.0     */    private void setCellData(HSSFRow row, int index ,int i ,Object value,HSSFCell cell,HSSFSheet sheet,HSSFPatriarch patriarch,HSSFWorkbook book) {        String textValue = null;         if (value instanceof Date) {    //为日期设置时间格式            Date date = (Date) value;            SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);            textValue = sdf.format(date);          }        if(value instanceof byte[]){   //byte为图片            //设置图片单元格宽度、高度            row.setHeightInPoints((short)(IMAGE_HEIGHT * 10));            sheet.setColumnWidth(i, IMAGE_WIDTH * 256);            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255,(short) i, index, (short) i, index);               anchor.setAnchorType(3);               //插入图片              byte[] bsValue = http://www.mamicode.com/(byte[]) value;            patriarch.createPicture(anchor, book.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));         }        else{   //其余全部当做字符处理            if(value != null){                textValue = String.valueOf(value);            }            else{                textValue = "";            }        }        // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成        if (textValue != null) {            Pattern p = Pattern.compile("^//d+(//.//d+)?$");            Matcher matcher = p.matcher(textValue);                        //设置单元格宽度,是文字能够全部显示            setCellMaxWidth(textValue,i);            sheet.setColumnWidth(i, maxWidth[i]);    //设置单元格宽度            row.setHeightInPoints((short)(20));   //设置单元格高度            if (matcher.matches()) {                // 是数字当作double处理                cell.setCellValue(Double.parseDouble(textValue));            } else {                cell.setCellValue(textValue);            }        }    }    /**     * 获取文件名,若为空,则规则为:yyyyMMddHH24mmss+6位随机数     * @author chenssy      * @date 2014年6月17日 下午5:44:27     * @param fileName     * @return     * @version 1.0     */    private String getFileName(String fileName) {        if(fileName == null || "".equals(fileName)){            //日期            Date date = new Date();            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH24mmss");            //随机数            Random random = new Random();            fileName = sdf.format(date) + String.valueOf(Math.abs(random.nextInt() * 1000000));        }        return fileName;    }        /**     * 根据字数来获取单元格大小,并更新当前列的最大宽度     * @author chenssy      * @date 2014年6月17日 下午7:35:52     * @param textValue      * @param 指定列     * @return     * @version 1.0     */    private void setCellMaxWidth(String textValue,int i ) {        int size = textValue.length();        int width = (size + 6) * 256;        if(maxWidth[i] <= width){            maxWidth[i] = width;        }    }        /**     * 将生成的Excel保存到指定路径下     * @author chenming      * @date 2014年6月19日 下午6:10:17     * @param book 生成的Excel     * @param filePath 需要保存的路劲     * @param fileName Excel文件名     * @version 1.0     */    private void saveExcel(HSSFWorkbook book, String filePath, String fileName) {        //检测保存路劲是否存在,不存在则新建        checkFilePathIsExist(filePath);        //将Excel保存至指定目录下        fileName = getFileName(fileName);        FileOutputStream out = null;        try {            out = new FileOutputStream(filePath + "\\" + fileName + ".xls");            book.write(out);             System.out.println("——————————————————保存Excel文件成功,保存路径:" + filePath + "\\" + fileName + ".xls");        } catch (Exception e) {            e.printStackTrace();            System.out.println("——————————————————保存Excel文件失败。exportExcelForListAndSave,message:"+e.getMessage());        }finally{            if(out != null){                try {                    out.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    /**     * 将生成的Excel打包并保存到指定路径下     * @author chenssy      * @date 2014年6月19日 下午6:18:09     * @param book 生成的Excel     * @param filePath 保存路劲     * @param zipName zip 文件名     * @param excelName Excel文件名     * @version 1.0     */    private void zipExcelAndSave(List<HSSFWorkbook> books,String filePath,String zipName,String excelName){        //检测保存路径是否存在,若不存在则新建        checkFilePathIsExist(filePath);                zipName = getFileName(zipName);        excelName = getFileName(excelName);                //将Excel打包并保存至指定目录下        FileOutputStream out = null;        ZipOutputStream zip = null;        try {            out = new FileOutputStream(filePath + "\\" + zipName + ".zip");            zip = new ZipOutputStream(out);            HSSFWorkbook book = null;            String _excelName = "";            for (int i = 0; i < books.size(); i++) {                book = books.get(i);                _excelName = getFileName(excelName) + "_0" + i;                ZipEntry entry = new ZipEntry(_excelName + ".xls");                zip.putNextEntry(entry);                book.write(zip);            }            System.out.println("——————————————————保存Excel文件成功,保存路径:" + filePath + "\\" + zipName + ".xls");        } catch (FileNotFoundException e) {            e.printStackTrace();            System.out.println("——————————————————保存Excel文件失败。method:exportExcelForBigDataAndSave,message:" + e.getMessage());        } catch (IOException e) {            e.printStackTrace();            System.out.println("——————————————————保存Excel文件失败。method:exportExcelForBigDataAndSave,message:" + e.getMessage());        } finally {            if (zip != null) {                try {                    zip.flush();                    zip.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if (out != null) {                try {                    out.flush();                    out.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }        /**     * 检测保存路径是否存在,不存在则新建     * @author chenssy      * @date 2014年6月18日 下午1:05:17     * @param filePath     * @version 1.0     */    private void checkFilePathIsExist(String filePath) {        File file = new File(filePath);                if(!file.exists()){            file.mkdirs();        }    }}