zoukankan      html  css  js  c++  java
  • 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 = (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();
            }
        }
    }
  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/Alandre/p/3810820.html
Copyright © 2011-2022 走看看