读书人

poi写了个模板工具感觉还是不够完善

发布时间: 2012-05-08 22:09:41 作者: rapoo

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 Exception     */    public ByteArrayInputStream getInputStreamExel() throws Exception{        ByteArrayOutputStream fos = new ByteArrayOutputStream();        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);        return  new ByteArrayInputStream(fos.toByteArray());    }} 



[解决办法]
可以分多个excel,然后名字取成同一批次的的.然后同一批次打1个压缩包
[解决办法]
不会是excel2003吧? excel2007应该没有6万多的限制了
看到你把大量的数据都通过List的来传递,这会不会对内存有负担呢?数据量太大,内存崩溃了怎么办

读书人网 >J2EE开发

热点推荐