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();
            }
        }
    }
  • 相关阅读:
    Socket编程注意接收缓冲区大小
    Ubuntu 14.04环境变量修改
    python模块------json
    解决ssh连接linux系统特别慢的问题
    centos7 安装 ftp 服务及创建 repo源
    qcow2镜像制作
    k8s-helm01-----helm基本使用
    mysql常用sql
    js中自执行函数(function(){})()和(function(){}())区别
    npm镜像指定用淘宝镜像去下载
  • 原文地址:https://www.cnblogs.com/Alandre/p/3810820.html
Copyright © 2011-2022 走看看