Java导出excel并下载功能解析

java哥 阅读:951 2019-12-05 08:54:22 评论:0

我们使用的导出并下载功能是利用一个插件叫POI的插件提供的导出功能,很实用;首先先导入Jar包:

Jar包下载地址:http://poi.apache.org/   官方文档地址:http://poi.apache.org/spreadsheet/quick-guide.html

Action代码:

public  void exportToExcel(List<PortalContactVO> data) throws Exception   
    {   
        this.setEnableAccessRequest(true); 
        this.setEnableAccessResponse(true); 
        HttpServletRequest request = this.getRequest(); 
        HttpServletResponse response = this.getResponse(); 
        String randomNumber = request.getParameter("randomNumber");// session名称 
        try { 
            session = request.getSession(); 
            session.setAttribute(randomNumber, new Double(1)); 
            // 导出的EXCEL文件名 
            String exportFileName = "addressBook.xlsx"; 
            response.reset(); 
            response.setContentType("octets/stream"); 
            // response.setHeader("Content-Disposition","attachment;filename="+exportFileName); 
            response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(exportFileName.getBytes("UTF-8"), "iso8859-1") + "\""); 
 
            // 导出的EXCEL列属性 
            List<String> columnListName = new ArrayList<String>(); 
            columnListName.add("userName&姓名"); 
            columnListName.add("mobile&手机"); 
            columnListName.add("shopTel&分店电话"); 
            columnListName.add("postName&职位"); 
            columnListName.add("email&邮箱"); 
            columnListName.add("shopAddress&分店地址"); 
            Bean2ExcelConversionUtils.beans2excelFile07(columnListName, data, response.getOutputStream()); 
            session.setAttribute(randomNumber, new Double(100)); 
 
        } catch (Exception e) { 
            e.printStackTrace(); 
            session.setAttribute(randomNumber, new Double(100)); 
        } catch (Throwable e) { 
            e.printStackTrace(); 
            session.setAttribute(randomNumber, new Double(100)); 
        } 
    }

JSP代码:

   <form id="exportForm">     
       <input class="btnStyle" type="submit" id="inputExport" value="导出" onclick="exportToExcel()" /> 
   </form>
function exportToExcel() { 
            var randomNumber=new Date().getTime(); 
            top.$.jBox.tip("正在导出...", 'loading'); 
            var exportDate = "${ctx}/xxxAction.do?method=export&randomNumber="+randomNumber; 
            $("#exportForm").attr("action", exportDate); 
            $("#exportForm").attr("method","post"); 
            $("#exportForm").submit(); 
        }

 

因为是使用的插件,所以需要引入一个工具类(下面的工具类直接复制到新建的类文件里面即可)

import java.beans.Introspector; 
import java.beans.PropertyDescriptor; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.List; 
 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.apache.poi.hssf.usermodel.HSSFCell; 
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.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.CellStyle; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.xssf.streaming.SXSSFSheet; 
import org.apache.poi.xssf.streaming.SXSSFWorkbook; 
 
/** 
 * @author Tan Jiangyong 
 * @date 2013-9-3 下午3:36:43 
 * @version V1.0 
 */ 
@SuppressWarnings("all") 
public class Bean2ExcelConversionUtils { 
    private static final String PATTERN="yyyy-MM-dd HH:mm:ss";    //excel日期格式,默认配置 
    private static final String DATE_PATTERN="yyyy-MM-dd";        //excel日期格式 
    private static final String DATE_HH_PATTERN="HH:mm:ss";        //excel时间格式 
    private static final int TOTAL_SIZE=40000;                    //每个excel写入多少数据(默认配置) 
    private static final int MAX_SHEET_SIZE=10000;                //每一个sheet的大小(默认配置) 
    private static final int COLUMN_WIDTH_WORD=25;                //列宽,默认汉字个数为25个 
    private static final int FLUSH_ROWS=100;                    //每生成excel行数,内存中缓存记录数清空(目的,避免零时文件过大) 
     
    /** 
     * 07、10办公版EXCEL导出(数据直接写到服务器的EXCEL里,以下载的形式,下载导出的数据) 
     * @param listName        列表头名称 
     * @param beans         实体集合 
     * @param result        数字字典Map集 
     * @param filePath        服务器存放文件路径 
     * @param fileName         文件名称 
     * @param totalSize     EXCEL条数量 
     * @param maxSheetSize     sheet页条数量 
     * @return              文件集合 
     * @throws Exception     
     */ 
    public static <T> List<File> beans2excelFile07(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize) throws Exception{ 
        if(totalSize==null || totalSize<=0) 
            totalSize=TOTAL_SIZE; 
        if(maxSheetSize==null || maxSheetSize<=0) 
            maxSheetSize=MAX_SHEET_SIZE; 
        if(fileName==null) 
            fileName=""; 
        return beans2excelFile2007(listName, beans, result, filePath, fileName,totalSize,maxSheetSize); 
    } 
    /** 
     * 07、10办公版EXCEL导出(数据直接写到服务器的EXCEL里,以下载的形式,下载导出的数据) 
     * @param listName        列表头名称 
     * @param beans         实体集合 
     * @param result        数字字典Map集 
     * @param filePath        服务器存放文件路径 
     * @param fileName         文件名称 
     * @param totalSize     EXCEL条数量 
     * @param maxSheetSize     sheet页条数量 
     * @param request        客户端请求对象 
     * @param response        客户端响应对象 
     * @throws Exception 
     */ 
    public static <T> void beans2excelFile07(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize,HttpServletRequest request,HttpServletResponse response) throws Exception{ 
        if(totalSize==null || totalSize<=0) 
            totalSize=TOTAL_SIZE; 
        if(maxSheetSize==null || maxSheetSize<=0) 
            maxSheetSize=MAX_SHEET_SIZE; 
        if(fileName==null) 
            fileName=""; 
        List<File> files = beans2excelFile2007(listName, beans, result, filePath, fileName,totalSize,maxSheetSize); 
        DownLoadUtils.downLoadFiles(files, filePath, request, response); 
    } 
     
    /** 
     * 07、10办公版EXCEL导出,每个EXCEL组织数据 
     * @param listName         列表头名称 
     * @param beans             实体集合 
     * @param result         数字字典Map集 
     * @param filePath         服务器存放文件路径 
     * @param fileName         文件名称 
     * @param totalSize      EXCEL条数量 
     * @param maxSheetSize  sheet页条数量 
     * @return                文件集合 
     * @throws Exception 
     */ 
    private static <T> List<File> beans2excelFile2007(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize) throws Exception{ 
        if ((listName == null) || (listName.size() == 0)) { 
            throw new Exception("listName is null when create excel document"); 
        } 
        List<File> listFile=new ArrayList<File>();//返回的文件集合 
         
        int size=beans==null?0:beans.size(); 
        String fileSuffixName=".xlsx";//后缀 
        String path="";//文件路径 
        Integer startIdx=0;//数据读取的起始行 
        Integer endIdx=0;//数据读取的结束行 
        (new File(filePath)).mkdirs(); //没有该目录创建目录 
        if(size==0){ 
            startIdx=0; 
            endIdx=(totalSize)>size?size:(totalSize); 
            String name=fileName+"_第0-0条数据"; 
            path=filePath+File.separatorChar+name+fileSuffixName; 
            Workbook wb =new SXSSFWorkbook(); 
            buildExcelDocument2007(wb, listName, beans,result,startIdx,endIdx,maxSheetSize); 
            //没有文件,创建文件 
            File file = new File(path); 
            if (!file.exists()){   
                file.createNewFile();   
            } 
            FileOutputStream out=new FileOutputStream(file); 
            wb.write(out); 
            out.close(); 
            return listFile; 
        } 
        for (int i = 0; i < size;i++) { 
            int remainder=i%totalSize; 
            if(size==0 || remainder==0){ 
                startIdx=i; 
                endIdx=(i+totalSize)>size?size:(i+totalSize); 
                String name=fileName+"_第"+(startIdx+1)+"-"+(endIdx)+"条数据"; 
                path=filePath+"/"+name+fileSuffixName; 
                Workbook wb =new SXSSFWorkbook(); 
                buildExcelDocument2007(wb, listName, beans,result,startIdx,endIdx,maxSheetSize); 
                //没有文件,创建文件 
                File file = new File(path); 
                if (!file.exists()){   
                    file.createNewFile();   
                } 
                FileOutputStream out=new FileOutputStream(file); 
                wb.write(out); 
                out.close(); 
                listFile.add(file); 
            }else if((size-i)<totalSize && i>endIdx){//最后,不满一万条 
                startIdx=i; 
                endIdx=i+totalSize; 
                String name=fileName+"_第"+(startIdx+1)+"-"+(endIdx)+"条数据"; 
                path=filePath+name+"."+fileSuffixName;//没有文件,创建文件 
                Workbook wb =new SXSSFWorkbook(); 
                buildExcelDocument2007(wb, listName, beans, result,startIdx,endIdx,maxSheetSize); 
                //没有文件,创建文件 
                File file = new File(path); 
                if (!file.exists()){   
                    file.createNewFile();   
                } 
                FileOutputStream out=new FileOutputStream(file); 
                wb.write(out); 
                out.close(); 
                listFile.add(file); 
            } 
        } 
        return listFile; 
    } 
     
    /** 
     * 07、10办公版EXCEL导出,每个EXCEL写入数据 
     * @param wb            EXCEL工作薄 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param result        数字字典Map集 
     * @param startIdx        数据集合,开始行 
     * @param endIdx        数据集合,结束始行 
     * @param maxSheetSize    SHEET页条数 
     * @throws Exception  
     */ 
    private static <T> void buildExcelDocument2007(Workbook wb, List<String> listName, List<T> beans,HashMap<String,HashMap<String,String>> result,Integer startIdx,Integer endIdx,Integer maxSheetSize) throws Exception 
    { 
        int totalSize=endIdx-startIdx;//总共条数 
        try 
        { 
            CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null); 
            List titles = new ArrayList(); 
            List beanAttrNames = new ArrayList(); 
            boolean flagListExists=false; 
            List flagList=new ArrayList(); 
            List widthList=new ArrayList(); 
            HashMap<String,String> dateMap=new HashMap<String, String>(); 
            String[] header = new String[listName.size()]; 
            int rows_max = 0;//标题占多少列 
            for (int i=0;i<listName.size();i++) 
            { 
                String[] str=listName.get(i).split("&"); 
                String en_name=str[0]; 
                String zh_name=str[1]; 
                beanAttrNames.add(i,en_name); 
                titles.add(i, zh_name); 
                header[i]=zh_name; 
                if (zh_name.split("_").length > rows_max) { 
                    rows_max = zh_name.split("_").length; 
                } 
                if(str.length>2){ 
                    String flag=str[2]; 
                    flagList.add(i,flag); 
                    if(!flagListExists) 
                        flagListExists=true; 
                } 
                if(str.length>3){ 
                    widthList.add(str[3]); 
                } 
                if(str.length>4){ 
                    dateMap.put(en_name, str[4]); 
                } 
            } 
 
            PropertyDescriptor[] props = null; 
 
            int size=endIdx-startIdx; 
            Sheet sheet=null; 
             
            //如果没有数据,导出表头 
            if(size==0){ 
                sheet=ExcelHeadUtils.getExcelHead2007(wb, header, "Sheet1"); 
                sheet.setDefaultRowHeight((short)350);//高度 
                setColumnWidth2007(widthList, sheet,beanAttrNames.size()); 
                return ; 
            } 
            int u=1;//用来创建每个sheet的行 
            int h=0;//用来标注每个sheet也得名字:多少行-多少行 
            for (int i = startIdx; i < endIdx ; i++) { 
                int remainder=h%maxSheetSize; 
                if(size==0 || i==startIdx || remainder==0){ 
                    u=1; 
                    int section=(h+maxSheetSize)>totalSize?totalSize:(h+maxSheetSize); 
                    sheet=ExcelHeadUtils.getExcelHead2007(wb, header,"第"+(h+1)+"-"+section+"条"); 
                    sheet.createFreezePane( 1, rows_max, 1, rows_max); 
                    sheet.setDefaultRowHeight((short)350);//高度 
                    setColumnWidth2007(widthList, sheet,beanAttrNames.size()); 
                } 
                if(props==null) 
                    props=Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors(); 
                Object bean = beans.get(i); 
                Row row = sheet.createRow(u+rows_max-1); 
                u++; 
                h++; 
                for (int j = 0; j < beanAttrNames.size(); j++) { 
                    String beanAttrName = (String)beanAttrNames.get(j); 
                    String flag=""; 
                    if(flagListExists) 
                        flag=(String)flagList.get(j); 
                    for (int k = 0; k < props.length; k++) { 
                        String propName = props[k].getName(); 
                        if (propName.equals(beanAttrName)) 
                        { 
                            String pattern=dateMap.get(beanAttrName); 
                            Cell cell = row.createCell((short)j); 
 
                            Object cellValue = callGetter(bean, props[k],pattern); 
                            if("true".equalsIgnoreCase(flag)){ 
                                if(result!=null){ 
                                    HashMap<String,String> hash=result.get(beanAttrName); 
                                    if(hash!=null) 
                                        cellValue=hash.get(cellValue); 
                                } 
                            } 
                            if (cellValue == null) { 
                                cellValue = ""; 
                            } 
                            setExcelCellText2007(cell, cellValue.toString(),cellStyle); 
                        } 
                    } 
                } 
                 //每当行数达到设置的值就刷新数据到硬盘,以清理内存 
                if(i%FLUSH_ROWS==0){ 
                   ((SXSSFSheet)sheet).flushRows(); 
                } 
            } 
        } catch (Exception e) { 
            throw new Exception(e); 
        } 
    } 
 
    /** 
     * 07、10办公版EXCEL导出(直接以流的方式,写到客户端,导出的EXCEL文件只有一个) 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param maxSheetSize    SHEET页的条数 
     * @param outputStream    客户端输出流 
     * @throws Exception 
     */ 
    public static <T> void beans2excelFile07(List<String> listName,List<T> beans, OutputStream outputStream) throws Exception{ 
        if ((listName == null) || (listName.size() == 0)) { 
            throw new Exception("listName is null when create excel document"); 
        } 
        if (outputStream == null) { 
            throw new Exception("outputStream is null when create excel document"); 
        } 
        Workbook wb =new SXSSFWorkbook(); 
        beans2excelFile07(listName, beans, null, null, MAX_SHEET_SIZE, outputStream); 
        try { 
            wb.write(outputStream); 
            outputStream.close(); 
        } catch (IOException e) { 
            throw new Exception(e); 
        }  
    } 
    /** 
     * 07、10办公版EXCEL导出(直接以流的方式,写到客户端,导出的EXCEL文件只有一个) 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param maxSheetSize    SHEET页的条数 
     * @param outputStream    客户端输出流 
     * @throws Exception 
     */ 
    public static <T> void beans2excelFile07(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String sheetName,Integer maxSheetSize, OutputStream outputStream) throws Exception{ 
        if ((listName == null) || (listName.size() == 0)) { 
            throw new Exception("listName is null when create excel document"); 
        } 
        if (outputStream == null) { 
            throw new Exception("outputStream is null when create excel document"); 
        } 
        if(maxSheetSize==null || maxSheetSize<=0){ 
            maxSheetSize=MAX_SHEET_SIZE; 
        } 
        if(sheetName==null || "".equals(sheetName.trim())){ 
            sheetName="Sheet"; 
        } 
        Workbook wb =new SXSSFWorkbook(); 
        if(maxSheetSize==null || maxSheetSize<=0){ 
            maxSheetSize=MAX_SHEET_SIZE; 
        } 
        buildExcelDocument2007(wb, listName, beans,result,sheetName,maxSheetSize); 
        try { 
            wb.write(outputStream); 
            outputStream.close(); 
        } catch (IOException e) { 
            throw new Exception(e); 
        }  
    } 
    /** 
     *  
     * @param listName 
     * @param beans 
     * @param response 
     * @param fileName 导出的文件名称 
     * @throws Exception 
     */ 
    public static <T> void beans2excelFile07(List<String> listName, List<T> beans, HttpServletResponse response,String fileName) throws Exception { 
        response.reset(); 
        response.setContentType("octets/stream"); 
        response.setHeader("Content-Disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName, "UTF-8")); 
        if ((listName == null) || (listName.size() == 0)) { 
            throw new Exception("listName is null when create excel document"); 
        } 
        if (response.getOutputStream() == null) { 
            throw new Exception("outputStream is null when create excel document"); 
        } 
        beans2excelFile07(listName, beans, null, null, MAX_SHEET_SIZE, response.getOutputStream()); 
    } 
    /** 
     * 07、10办公版EXCEL导出,EXCEL写入数据 
     * @param wb            EXCEL工作薄 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param maxSheetSize    SHEET页的条数 
     * @throws Exception  
     */ 
    private static <T> void buildExcelDocument2007(Workbook wb, List<String> listName, List<T> beans,HashMap<String,HashMap<String,String>> result,String sheetName,Integer maxSheetSize) throws Exception 
    { 
        try 
        { 
            CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null); 
            List titles = new ArrayList(); 
            List beanAttrNames = new ArrayList(); 
            List widthList = new ArrayList(); 
            HashMap<String,String> dateMap=new HashMap<String, String>(); 
            String[] header = new String[listName.size()]; 
            int rows_max = 0;//标题占多少列 
            List flagList=new ArrayList(); 
            boolean flagListExists=false; 
            for (int i=0;i<listName.size();i++) 
            { 
                String[] str=listName.get(i).split("&"); 
                String en_name=str[0]; 
                String zh_name=str[1]; 
                beanAttrNames.add(i,en_name); 
                titles.add(i, zh_name); 
                header[i]=zh_name; 
                if (zh_name.split("_").length > rows_max) { 
                    rows_max = zh_name.split("_").length; 
                } 
                if(str.length>2){ 
                    String flag=str[2]; 
                    flagList.add(i,flag); 
                    if(!flagListExists) 
                        flagListExists=true; 
                } 
                if(str.length>3){ 
                    widthList.add(str[3]); 
                } 
                if(str.length>4){ 
                    dateMap.put(en_name, str[4]); 
                } 
            } 
 
            PropertyDescriptor[] props = null; 
 
            int size=beans==null?0:beans.size(); 
            Sheet sheet=null; 
             
            //如果没有数据,导出表头 
            if(size==0){ 
                sheet=ExcelHeadUtils.getExcelHead2007(wb, header, sheetName); 
                sheet.setDefaultRowHeight((short)350);//高度 
                setColumnWidth2007(widthList, sheet,beanAttrNames.size()); 
                return ; 
            } 
             
            for (int i = 0; i < size ; i++) { 
                int remainder=i%maxSheetSize; 
                if(size==0 || i==0 || remainder==0){ 
                    sheet=ExcelHeadUtils.getExcelHead2007(wb, header,sheetName+(i/maxSheetSize)); 
                    sheet.createFreezePane( 1, rows_max, 1, rows_max); 
                    sheet.setDefaultRowHeight((short)350);//高度 
                    setColumnWidth2007(widthList, sheet,beanAttrNames.size()); 
                } 
                if(props==null) 
                    props=Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors(); 
                Object bean = beans.get(i); 
                Row row = sheet.createRow(remainder+rows_max); 
                for (int j = 0; j < beanAttrNames.size(); j++) { 
                    String beanAttrName = (String)beanAttrNames.get(j); 
                    String flag=""; 
                    if(flagListExists) 
                        flag=(String)flagList.get(j); 
                    for (int k = 0; k < props.length; k++) { 
                        String propName = props[k].getName(); 
                        if (propName.equals(beanAttrName)) 
                        { 
                            String pattern=dateMap.get(beanAttrName); 
                            Cell cell = row.createCell((short)j); 
 
                            Object cellValue = callGetter(bean, props[k],pattern); 
                            if("true".equalsIgnoreCase(flag)){ 
                                if(result!=null){ 
                                    HashMap<String,String> hash=result.get(beanAttrName); 
                                    if(hash!=null) 
                                        cellValue=hash.get(cellValue); 
                                } 
                            } 
                            if (cellValue == null) { 
                                cellValue = ""; 
                            } 
                            setExcelCellText2007(cell, cellValue.toString(),cellStyle); 
                        } 
                    } 
                } 
                 //每当行数达到设置的值就刷新数据到硬盘,以清理内存 
                if(i%FLUSH_ROWS==0){ 
                   ((SXSSFSheet)sheet).flushRows(); 
                } 
            } 
        } catch (Exception e) { 
            throw new Exception(e); 
        } 
    } 
    /** 
     * 07、10办公版EXCEL导出(直接以流的方式,写到客户端,导出的EXCEL文件只有一个) 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param maxSheetSize    SHEET页的条数 
     * @param outputStream    客户端输出流 
     * @throws Exception 
     */ 
    public static <T> void beans2excelFile07List(List<ArrayList<String>> listColumnName,List<List> list2beans,HashMap<String,HashMap<String,HashMap<String,String>>> result,List<String> listSheetName, OutputStream outputStream) throws Exception{ 
        if ((listColumnName == null) || (listColumnName.size() == 0)) { 
            throw new Exception("listColumnName is null when create excel document"); 
        } 
        if (list2beans.size() != listColumnName.size()) { 
            throw new Exception("list2beans and listColumnName size Unequal"); 
        } 
        if (outputStream == null) { 
            throw new Exception("outputStream is null when create excel document"); 
        } 
        Workbook wb =new SXSSFWorkbook(); 
        buildExcelDocument2007List(wb, listColumnName, list2beans, result, listSheetName); 
        try { 
            wb.write(outputStream); 
            outputStream.close(); 
        } catch (IOException e) { 
            throw new Exception(e); 
        }  
    } 
    /** 
     * 07、10办公版EXCEL导出,EXCEL写入数据 
     * @param wb            EXCEL工作薄 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param maxSheetSize    SHEET页的条数 
     * @throws Exception  
     */ 
    private static <T> void buildExcelDocument2007List(Workbook wb, List<ArrayList<String>> listColumnName,List<List> list2beans,HashMap<String,HashMap<String,HashMap<String,String>>> resultMap,List<String> listSheetName) throws Exception 
    { 
        try 
        { 
            int sheets=listColumnName.size(); 
            boolean sheetNameIsNullFlag=false; 
            if(listSheetName==null || listSheetName.size()!=sheets){ 
                sheetNameIsNullFlag=true; 
            } 
            for (int s = 0; s < sheets; s++) { 
                String sheetName="Sheet"+s; 
                if(!sheetNameIsNullFlag){ 
                    sheetName=listSheetName.get(s); 
                } 
                List<String> listName=listColumnName.get(s); 
                CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null); 
                List titles = new ArrayList(); 
                List beanAttrNames = new ArrayList(); 
                List widthList = new ArrayList(); 
                HashMap<String,String> dateMap=new HashMap<String, String>(); 
                String[] header = new String[listName.size()]; 
                int rows_max = 0;//标题占多少列 
                List flagList=new ArrayList(); 
                boolean flagListExists=false; 
                for (int i=0;i<listName.size();i++) 
                { 
                    String[] str=listName.get(i).split("&"); 
                    String en_name=str[0]; 
                    String zh_name=str[1]; 
                    beanAttrNames.add(i,en_name); 
                    titles.add(i, zh_name); 
                    header[i]=zh_name; 
                    if (zh_name.split("_").length > rows_max) { 
                        rows_max = zh_name.split("_").length; 
                    } 
                    if(str.length>2){ 
                        String flag=str[2]; 
                        flagList.add(i,flag); 
                        if(!flagListExists) 
                            flagListExists=true; 
                    } 
                    if(str.length>3){ 
                        widthList.add(str[3]); 
                    } 
                    if(str.length>4){ 
                        dateMap.put(en_name, str[4]); 
                    } 
                } 
     
                PropertyDescriptor[] props = null; 
                ArrayList<T> beans=(ArrayList<T>)list2beans.get(s); 
                int size=beans==null?0:beans.size(); 
                Sheet sheet=null; 
                 
                //如果没有数据,导出表头 
                if(size==0){ 
                    sheet=ExcelHeadUtils.getExcelHead2007(wb, header, sheetName); 
                    sheet.setDefaultRowHeight((short)350);//高度 
                    setColumnWidth2007(widthList, sheet,beanAttrNames.size()); 
                    return ; 
                } 
                 
                HashMap<String,HashMap<String,String>> result=null; 
                if(resultMap!=null){ 
                    result=resultMap.get(sheetName); 
                } 
                sheet=ExcelHeadUtils.getExcelHead2007(wb, header,sheetName); 
                sheet.createFreezePane( 1, rows_max, 1, rows_max); 
                sheet.setDefaultRowHeight((short)350);//高度 
                setColumnWidth2007(widthList, sheet,beanAttrNames.size()); 
                for (int i = 0; i < size ; i++) { 
                    if(props==null) 
                        props=Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors(); 
                    Object bean = beans.get(i); 
                    Row row = sheet.createRow(rows_max+i); 
                    for (int j = 0; j < beanAttrNames.size(); j++) { 
                        String beanAttrName = (String)beanAttrNames.get(j); 
                        String flag=""; 
                        if(flagListExists) 
                            flag=(String)flagList.get(j); 
                        for (int k = 0; k < props.length; k++) { 
                            String propName = props[k].getName(); 
                            if (propName.equals(beanAttrName)) 
                            { 
                                String pattern=dateMap.get(beanAttrName); 
                                Cell cell = row.createCell((short)j); 
     
                                Object cellValue = callGetter(bean, props[k],pattern); 
                                if("true".equalsIgnoreCase(flag)){ 
                                    if(result!=null){ 
                                        HashMap<String,String> hash=result.get(beanAttrName); 
                                        if(hash!=null) 
                                            cellValue=hash.get(cellValue); 
                                    } 
                                } 
                                if (cellValue == null) { 
                                    cellValue = ""; 
                                } 
                                setExcelCellText2007(cell, cellValue.toString(),cellStyle); 
                            } 
                        } 
                    } 
                     //每当行数达到设置的值就刷新数据到硬盘,以清理内存 
                    if(i%FLUSH_ROWS==0){ 
                       ((SXSSFSheet)sheet).flushRows(); 
                    } 
                } 
            } 
        } catch (Exception e) { 
            throw new Exception(e); 
        } 
    } 
    /** 
     * 07、10办公版EXCEL导出,单元格设置 
     * @param cell        单元格对象 
     * @param text        单元格文本内容 
     * @param cellStyle    单元格格式 
     */ 
    private static void setExcelCellText2007(Cell cell, Object text,CellStyle cellStyle) 
    { 
        cell.setCellValue(text.toString()); 
        cell.setCellType(1);//单元格类型 
        cell.setCellStyle(cellStyle); 
    } 
     
    /** 
     * 07、10办公版EXCEL导出,单元格宽度设置 
     * @param widthList        列宽集合 
     * @param sheet            sheet对象 
     * @param allSize        总列数 
     */ 
    private static void setColumnWidth2007(List widthList,Sheet sheet,int allSize){ 
        if(widthList!=null && widthList.size()>0){ 
            int size=widthList.size(); 
            for (int i = 0; i < size; i++) { 
                try { 
                    Integer width=Integer.parseInt((String) widthList.get(i)); 
                    sheet.setColumnWidth((short) i,width*256); 
                } catch (NumberFormatException e) { 
                    continue; 
                } 
            } 
        }else{ 
            for (int i = 0; i < allSize; i++) { 
                try { 
                    sheet.setColumnWidth((short) i,COLUMN_WIDTH_WORD*256); 
                } catch (NumberFormatException e) { 
                    continue; 
                } 
            } 
         
        } 
    } 
     
    /** 
     * 03、WPS:EXCEL导出(数据直接写到服务器的EXCEL里,以下载的形式,下载导出的数据) 
     * @param listName            列表头名称 
     * @param beans                实体集合 
     * @param result            数字字典Map集 
     * @param filePath            服务器存放文件路径 
     * @param fileName            文件名称 
     * @param totalSize            EXCEL条数量 
     * @param maxSheetSize        sheet页条数量 
     * @return List<File>        文件集合 
     * @throws Exception 
     */ 
    public static <T> List<File> beans2excelFile03(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize) throws Exception{ 
        if(totalSize==null || totalSize<=0) 
            totalSize=TOTAL_SIZE; 
        if(maxSheetSize==null || maxSheetSize<=0) 
            maxSheetSize=MAX_SHEET_SIZE; 
        if(fileName==null) 
            fileName=""; 
        return beans2excelFile2003(listName, beans, result, filePath, fileName,totalSize,maxSheetSize); 
    } 
    /** 
     * 03、WPS:EXCEL导出(数据直接写到服务器的EXCEL里,以下载的形式,下载导出的数据) 
     * @param listName            列表头名称 
     * @param beans                实体集合 
     * @param result            数字字典Map集 
     * @param filePath            服务器存放文件路径 
     * @param fileName            文件名称 
     * @param totalSize            EXCEL条数量 
     * @param maxSheetSize        sheet页条数量 
     * @param request        客户端请求对象 
     * @param response        客户端响应对象 
     * @throws Exception 
     */ 
    public static <T> void beans2excelFile03(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize,HttpServletRequest request,HttpServletResponse response) throws Exception{ 
        if(totalSize==null || totalSize<=0) 
            totalSize=TOTAL_SIZE; 
        if(maxSheetSize==null || maxSheetSize<=0) 
            maxSheetSize=MAX_SHEET_SIZE; 
        if(fileName==null) 
            fileName=""; 
        List<File> files=beans2excelFile2003(listName, beans, result, filePath, fileName,totalSize,maxSheetSize); 
        DownLoadUtils.downLoadFiles(files, filePath, request, response); 
    } 
    /** 
     *  03、WPS:EXCEL导出,每个EXCEL组织数据 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param result        数字字典Map集 
     * @param filePath        服务器存放文件路径 
     * @param fileName        文件名称 
     * @param totalSize        EXCEL条数量 
     * @param maxSheetSize    sheet页条数量 
     * @return                文件集合 
     * @throws Exception 
     */ 
    private static <T> List<File> beans2excelFile2003(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize) throws Exception{ 
        if ((listName == null) || (listName.size() == 0)) { 
            throw new Exception("listName is null when create excel document"); 
        } 
        List<File> listFile=new ArrayList<File>();//返回的文件集合 
         
        int size=beans==null?0:beans.size(); 
        String fileSuffixName=".xls";//后缀 
        String path="";//文件路径 
        Integer startIdx=0;//数据读取的起始行 
        Integer endIdx=0;//数据读取的结束行 
        (new File(filePath)).mkdirs(); //没有该目录创建目录 
        if(size==0){ 
            startIdx=0; 
            endIdx=(totalSize)>size?size:(totalSize); 
            String name=fileName+"_第0-0条数据"; 
            path=filePath+File.separatorChar+name+fileSuffixName; 
            HSSFWorkbook wb =new HSSFWorkbook(); 
            buildExcelDocument2003(wb, listName, beans,result,startIdx,endIdx,maxSheetSize); 
            //没有文件,创建文件 
            File file = new File(path); 
            if (!file.exists()){   
                file.createNewFile();   
            } 
            FileOutputStream out=new FileOutputStream(file); 
            wb.write(out); 
            out.close(); 
            return listFile; 
        } 
        for (int i = 0; i < size;i++) { 
            int remainder=i%totalSize; 
            if(size==0 || remainder==0){ 
                startIdx=i; 
                endIdx=(i+totalSize)>size?size:(i+totalSize); 
                String name=fileName+"_第"+(startIdx+1)+"-"+(endIdx)+"条数据"; 
                path=filePath+"/"+name+fileSuffixName; 
                HSSFWorkbook wb =new HSSFWorkbook(); 
                buildExcelDocument2003(wb, listName, beans,result,startIdx,endIdx,maxSheetSize); 
                //没有文件,创建文件 
                File file = new File(path); 
                if (!file.exists()){   
                    file.createNewFile();   
                } 
                FileOutputStream out=new FileOutputStream(file); 
                wb.write(out); 
                out.close(); 
                listFile.add(file); 
            }else if((size-i)<totalSize && i>endIdx){//最后,不满一万条 
                startIdx=i; 
                endIdx=i+totalSize; 
                String name=fileName+"_第"+(startIdx+1)+"-"+(endIdx)+"条数据"; 
                path=filePath+name+"."+fileSuffixName;//没有文件,创建文件 
                HSSFWorkbook wb =new HSSFWorkbook(); 
                buildExcelDocument2003(wb, listName, beans, result,startIdx,endIdx,maxSheetSize); 
                //没有文件,创建文件 
                File file = new File(path); 
                if (!file.exists()){   
                    file.createNewFile();   
                } 
                FileOutputStream out=new FileOutputStream(file); 
                wb.write(out); 
                out.close(); 
                listFile.add(file); 
            } 
        } 
        return listFile; 
    } 
     
    /** 
     * 03,WPS:EXCEL导出,每个EXCEL写入数据 
     * @param wb            EXCEL工作薄 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param result        数字字典Map集 
     * @param startIdx        数据集合,开始行 
     * @param endIdx        数据集合,结束始行 
     * @param maxSheetSize    SHEET页条数 
     * @throws Exception  
     */ 
    private static <T> void buildExcelDocument2003(HSSFWorkbook wb, List<String> listName, List<T> beans,HashMap<String,HashMap<String,String>> result,Integer startIdx,Integer endIdx,Integer maxSheetSize) throws Exception 
    { 
        int totalSize=endIdx-startIdx;//总共条数 
        try 
        { 
            CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null); 
            List titles = new ArrayList(); 
            List beanAttrNames = new ArrayList(); 
            List widthList=new ArrayList(); 
            String[] header = new String[listName.size()]; 
            List flagList=new ArrayList(); 
            boolean flagListExists=false; 
            int rows_max = 0;//标题占多少列 
            HashMap<String,String> dateMap=new HashMap<String, String>(); 
            for (int i=0;i<listName.size();i++) 
            { 
                String[] str=listName.get(i).split("&"); 
                String en_name=str[0]; 
                String zh_name=str[1]; 
                beanAttrNames.add(i,en_name); 
                titles.add(i, zh_name); 
                header[i]=zh_name; 
                if (zh_name.split("_").length > rows_max) { 
                    rows_max = zh_name.split("_").length; 
                } 
                if(str.length>2){ 
                    String flag=str[2]; 
                    flagList.add(i,flag); 
                    if(!flagListExists) 
                        flagListExists=true; 
                } 
                if(str.length>3){ 
                    widthList.add(str[3]); 
                } 
                if(str.length>4){ 
                    dateMap.put(en_name, str[4]); 
                } 
            } 
 
            PropertyDescriptor[] props = null; 
 
            int size=endIdx-startIdx; 
            HSSFSheet sheet=null; 
             
            //如果没有数据,导出表头 
            if(size==0){ 
                sheet=ExcelHeadUtils.getExcelHead2003(wb, header, "Sheet1"); 
                sheet.setDefaultRowHeight((short)350);//高度 
                setColumnWidth2003(widthList, sheet,beanAttrNames.size()); 
                return ; 
            } 
            int u=1;//用来创建每个sheet的行 
            int h=0;//用来标注每个sheet也得名字:多少行-多少行 
            for (int i = startIdx; i < endIdx ; i++) { 
                int remainder=h%maxSheetSize; 
                if(size==0 || i==startIdx || remainder==0){ 
                    u=1; 
                    int section=(h+maxSheetSize)>totalSize?totalSize:(h+maxSheetSize); 
                    sheet=ExcelHeadUtils.getExcelHead2003(wb, header, "第"+(h+1)+"-"+section+"条"); 
                    sheet.createFreezePane( 1, rows_max, 1, rows_max); 
                    sheet.setDefaultRowHeight((short)350);//高度 
                    setColumnWidth2003(widthList, sheet,beanAttrNames.size()); 
                } 
                if(props==null) 
                    props=Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors(); 
                Object bean = beans.get(i); 
                HSSFRow row = sheet.createRow(u+rows_max-1); 
                u++; 
                h++; 
                for (int j = 0; j < beanAttrNames.size(); j++) { 
                    String beanAttrName = (String)beanAttrNames.get(j); 
                    String flag=null; 
                    if(flagListExists) 
                        flag=(String)flagList.get(j); 
                    for (int k = 0; k < props.length; k++) { 
                        String propName = props[k].getName(); 
                        if (propName.equals(beanAttrName)) 
                        { 
                            String pattern=dateMap.get(beanAttrName); 
                            HSSFCell cell = row.createCell((short)j); 
                            Object cellValue = callGetter(bean, props[k],pattern); 
                            if("true".equalsIgnoreCase(flag)){ 
                                if(result!=null){ 
                                    HashMap<String,String> hash=result.get(beanAttrName); 
                                    if(hash!=null) 
                                        cellValue=hash.get(cellValue); 
                                } 
                            } 
                            if (cellValue == null) { 
                                cellValue = ""; 
                            } 
                            setExcelCellText2003(cell, cellValue.toString(),cellStyle); 
                        } 
                    } 
                } 
            } 
        } catch (Exception e) { 
            throw new Exception(e); 
        } 
    } 
     
    /** 
     * 03,WPS:EXCEL导出(直接以流的方式,写到客户端,导出的EXCEL文件只有一个) 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param maxSheetSize    sheet页条数量 
     * @param outputStream    客户端输出流 
     * @throws Exception 
     */ 
    public static <T> void beans2excelFile03(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String sheetName,Integer maxSheetSize, OutputStream outputStream) throws Exception{ 
        if ((listName == null) || (listName.size() == 0)) { 
            throw new Exception("listName is null when create excel document"); 
        } 
        if(maxSheetSize==null || maxSheetSize<=0){ 
            maxSheetSize=MAX_SHEET_SIZE; 
        } 
        if(sheetName==null || "".equals(sheetName.trim())){ 
            sheetName="Sheet"; 
        } 
        HSSFWorkbook wb =new HSSFWorkbook(); 
        if(maxSheetSize==null || maxSheetSize<=0) 
            maxSheetSize=MAX_SHEET_SIZE; 
        buildExcelDocument2003(wb, listName, beans,result,sheetName,maxSheetSize); 
        try { 
            wb.write(outputStream); 
            outputStream.close(); 
        } catch (IOException e) { 
            throw new Exception(e); 
        }  
    } 
 
    /** 
     * 03,WPS:EXCEL导出,EXCEL写入数据 
     * @param wb            EXCEL工作薄 
     * @param listName        列表头名称 
     * @param beans            实体集合 
     * @param maxSheetSize    sheet页条数量 
     * @throws Exception  
     */ 
    private static <T> void buildExcelDocument2003(HSSFWorkbook wb, List<String> listName, List<T> beans,HashMap<String,HashMap<String,String>> result,String sheetName,Integer maxSheetSize) throws Exception 
    { 
        try 
        { 
            CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null); 
            List titles = new ArrayList(); 
            List beanAttrNames = new ArrayList(); 
            List widthList = new ArrayList(); 
            HashMap<String,String> dateMap=new HashMap<String, String>(); 
            String[] header = new String[listName.size()]; 
            int rows_max = 0;//标题占多少列 
            List flagList=new ArrayList(); 
            boolean flagListExists=false; 
            for (int i=0;i<listName.size();i++) 
            { 
                String[] str=listName.get(i).split("&"); 
                String en_name=str[0]; 
                String zh_name=str[1]; 
                beanAttrNames.add(i,en_name); 
                titles.add(i, zh_name);     
                header[i]=zh_name; 
                if (zh_name.split("_").length > rows_max) { 
                    rows_max = zh_name.split("_").length; 
                } 
                if(str.length>2){ 
                    String flag=str[2]; 
                    flagList.add(i,flag); 
                    if(!flagListExists) 
                        flagListExists=true; 
                } 
                if(str.length>3){ 
                    widthList.add(str[3]); 
                } 
                if(str.length>4){ 
                    dateMap.put(en_name, str[4]); 
                } 
            } 
            PropertyDescriptor[] props =null; 
 
            int size=beans==null?0:beans.size(); 
            HSSFSheet sheet=null; 
            //如果没有数据,导出表头 
            if(size==0){ 
                sheet=ExcelHeadUtils.getExcelHead2003(wb, header, sheetName); 
                setColumnWidth2003(widthList, sheet,beanAttrNames.size()); 
                sheet.setDefaultRowHeight((short)350);//高度 
                return ; 
            } 
            for (int i = 0; i < size ; i++) { 
                int remainder=i%maxSheetSize; 
                if(size==0 || i==0 || remainder==0){ 
                    sheet=ExcelHeadUtils.getExcelHead2003(wb, header, sheetName+(i/maxSheetSize)); 
                    sheet.createFreezePane( 1, rows_max, 1, rows_max); 
                    setColumnWidth2003(widthList, sheet,beanAttrNames.size()); 
                    sheet.setDefaultRowHeight((short)350);//高度 
                } 
                if(props==null) 
                    props= Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors(); 
                Object bean = beans.get(i); 
                HSSFRow row = sheet.createRow(remainder+rows_max); 
                for (int j = 0; j < beanAttrNames.size(); j++) { 
 
                    String beanAttrName = (String)beanAttrNames.get(j); 
                    String flag=null; 
                    if(flagListExists) 
                        flag=(String)flagList.get(j); 
                    for (int k = 0; k < props.length; k++) { 
                        String propName = props[k].getName(); 
                        if (propName.equals(beanAttrName)) 
                        { 
                            String pattern=dateMap.get(beanAttrName); 
                            HSSFCell cell = row.createCell((short)j); 
                            Object cellValue = callGetter(bean, props[k],pattern); 
                            if("true".equalsIgnoreCase(flag)){ 
                                if(result!=null){ 
                                    HashMap<String,String> hash=result.get(beanAttrName); 
                                    if(hash!=null) 
                                        cellValue=hash.get(cellValue); 
                                } 
                            } 
                            if (cellValue == null) { 
                                cellValue = ""; 
                            } 
                            setExcelCellText2003(cell, cellValue.toString(),cellStyle); 
                        } 
                    } 
                } 
            } 
        } catch (Exception e) { 
            throw new Exception(e); 
        } 
    } 
 
    /** 
     * 03,WPS:EXCEL导出,单元格设置 
     * @param cell        单元格对象 
     * @param text        单元格文本内容 
     * @param cellStyle    单元格格式 
     */ 
    private static void setExcelCellText2003(HSSFCell cell, Object text,CellStyle cellStyle) 
    { 
        cell.setCellValue(text.toString()); 
        cell.setCellType(1);//单元格类型 
        cell.setCellStyle(cellStyle); 
    } 
 
    /** 
     * 03,WPS:EXCEL导出,单元格宽度设置 
     * @param widthList        列宽集合 
     * @param sheet            sheet对象 
     * @param allSize        总列数 
     */ 
    private static void setColumnWidth2003(List widthList,HSSFSheet sheet,int allSize){ 
        if(widthList!=null && widthList.size()>0){ 
            int size=widthList.size(); 
            for (int i = 0; i < size; i++) { 
                try { 
                    Integer width=Integer.parseInt((String) widthList.get(i)); 
                    sheet.setColumnWidth((short) i,width*256); 
                } catch (NumberFormatException e) { 
                    continue; 
                } 
            } 
        }else{ 
            for (int i = 0; i < allSize; i++) { 
                try { 
                    sheet.setColumnWidth((short) i,COLUMN_WIDTH_WORD*256); 
                } catch (NumberFormatException e) { 
                    continue; 
                } 
            } 
        } 
    } 
 
    /** 
     * 根据反射,获取实体属性的值 
     * @param target    实体属性 
     * @param prop        反射调用类 
     * @param pattern    日期格式 
     * @return             
     */ 
    private static Object callGetter(Object target, PropertyDescriptor prop,String pattern) { 
        Object o = null; 
        if (prop.getReadMethod() != null) { 
            try { 
                o = prop.getReadMethod().invoke(target, null); 
                if (Date.class.equals(prop.getPropertyType())) { 
                    if(pattern!=null && !"".equals(pattern)){ 
                        try { 
                            o = new SimpleDateFormat(pattern).format(o); 
                        } catch (Exception e) { 
                            o = new SimpleDateFormat(PATTERN).format(o); 
                        } 
                    }else{ 
                        o = formatDate(o); 
                    } 
                } 
            } catch (Exception e) { 
                o = null; 
            } 
        } 
        return o; 
    } 
     
    /** 
     * 日期转换 
     * @param date 
     * @return 字符串的日期 
     */ 
    private static String formatDate(Object date) { 
        if(date==null) 
            return ""; 
        String dateStr = new SimpleDateFormat(DATE_HH_PATTERN).format(date); 
        if("00:00:00".equals(dateStr)){ 
            return new SimpleDateFormat(DATE_PATTERN).format(date); 
        } 
        return new SimpleDateFormat(PATTERN).format(date); 
    } 
}

 

然后看看效果吧:

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

全民解析

全民解析

关注我们