在使用这个工具时当数据量太大时会报错(好像是exl不能超出6万多数据),我尝试超过一定量换菜单,但是没有效果,求大侠鞋空闲看看,有代码有真相!~·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());
}
}

解决方案 »

  1.   

    可以分多个excel,然后名字取成同一批次的的.然后同一批次打1个压缩包
      

  2.   

    不会是excel2003吧? excel2007应该没有6万多的限制了
    看到你把大量的数据都通过List的来传递,这会不会对内存有负担呢?数据量太大,内存崩溃了怎么办
      

  3.   

    有点好的思路吗? 主要数据源就是List不用List用什么呢 ? 还有版本的支持这个倒是还不知道呢!~