日期:2014-05-19  浏览次数:20593 次

poi写了个模板工具感觉还是不够完善,求完善,求思路!~
在使用这个工具时当数据量太大时会报错(好像是exl不能超出6万多数据),我尝试超过一定量换菜单,但是没有效果,求大侠鞋空闲看看,有代码有真相!~·

Java code


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


public class WorkBookPoiUtil {
    private static List<short[]> widths  ;
    private LinkedHashMap<String, List<?>> map ;
    private List<LinkedHashMap<String, String>> titles ;
/**
 * 
 * @param map String为菜单名称 ,对应List数据
 * @param titles  Key为title名称 , value为title属性名称     和 map  对应  title 和 属性 一一对应
 */
    
    public WorkBookPoiUtil(LinkedHashMap<String, List<?>> map , List<LinkedHashMap<String, String>> titles ){
        this(map, titles, null);
    }
    /**
     * 
     * @param map String为菜单名称 ,对应List数据
     * @param titles Key为title名称 , value为title属性名称    和 map  对应  title 和 属性 一一对应
     * @param width  设置每一列宽度
     *  
     */
    public WorkBookPoiUtil(LinkedHashMap<String, List<?>> map , List<LinkedHashMap<String, String>> titles , List<short[]> widths ){
        this.widths = widths;
        this.map = map ;
        this.titles = titles;
    
    }
    public static  void setSheet(LinkedHashMap<String, String> map, List<?> list,HSSFSheet s ,short[] width ) throws Exception{

        List<String> strings = new ArrayList<String>();
        int i =0 ;
        for (String key : map.keySet()) {
            if(width==null || width.length<= i)
                s.setColumnWidth((short) i,(short)6000);
            else
                s.setColumnWidth((short) i, width[i]);
            s.createRow(0).createCell((short) i).setCellValue(new HSSFRichTextString(key) );
            strings.add(map.get(key));
            i= i+1 ;

        }
        for (int j = 1; j < list.size()+1; j++) {
            for (int j2 = 0; j2 < strings.size(); j2++) {
                Class<?> class1 = list.get(j-1).getClass();
                String methodName = "get" + strings.get(j2).substring(0, 1).toUpperCase()
                        + strings.get(j2).substring(1);
                Method method =    class1.getMethod(methodName);
                if ("java.util.Date".equals(method.getReturnType()
                        .getName())) {
                    s.createRow(j).createCell((short) j2).setCellValue(new HSSFRichTextString(
                            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date)method.invoke(list.get(j-1)))
                            ));
                }else{

                    s.createRow(j).createCell((short) j2).setCellValue(new HSSFRichTextString(method.invoke(list.get(j-1)).toString()));
                }

            }

        }
    
    }
    /**
     * 
     * @param pathName  指定路径生成
     * @throws Exception
     */
    public void getPathExel(String pathName) throws Exception{
        FileOutputStream fos = new FileOutputStream(pathName); 
        HSSFWorkbook wb = new HSSFWorkbook();
        int i = 0 ;
        for (String key : map.keySet()) {
            HSSFSheet s = wb.createSheet(key);
            if(widths.size()<=i)
            setSheet(titles.get(i) , map.get(key) , s , null);
            else
                setSheet(titles.get(i) , map.get(key) , s , widths.get(i));
            i= i+1;
        }
        
        wb.write(fos);
        fos.flush();
        fos.close();
    }
    /**
     * 
     * @return   ByteArrayInputStream  一个流
     * @throws E