java导出excel大量数据出现错误时解决办法

问题描述:java导出大量数据出现错误:jxl.write.biff.RowsExceededException: The maximum number of rows permitted on a works
问题解释:这个问题实质上就是在导出数据的时候数据的最大值超出了jxl.write包中预设的sheet表格的最大值后者是内存溢出问题,是因为一次性将大量数据载入到内存中,导致虚拟内存不足。
解决的办法:
1、需要注意Excel的行数限制,在导出文件的时候对大数据量导入进行分页处理。
2、将大量数据加载到内存中,会使虚拟内存不足,导致程序无法运行,可以通过增加虚拟内存来解决此问题,但不推荐此方式,建议将大量数据的操作划分成小量数据进行操作。
具体的测试代码如下:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class TestDome {
    public static void outputExcelData() throws IOException, WriteException {
        /*1、设置写入excel表格的值
         * 这里可扩展为在数据中调取的相关的数据*/
        List result = new ArrayList();
        User user = new User();
        user.setId("1");
        user.setName("zhangshang");
        result.add(user);
        User user2 = new User();
        user2.setId("1");
        user2.setName("shanghai");
        result.add(user2);
        User user3 = new User();
        user3.setId("1");
        user3.setName("beijing");
        result.add(user3);
        /*2、设置文件的名字和导出的位置
         * 这里可扩展为服务器地址或者是硬盘地址*/
        String fileName = "D://sfData.xls";
        /*3、Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象*/
        WritableWorkbook wwb = Workbook.createWorkbook(new File(fileName));
        File dbfFile = new File(fileName);
        if (!dbfFile.exists() || dbfFile.isDirectory()) {
            dbfFile.createNewFile();
        }
        int totle = result.size();//获取List集合的size
        int mus = 2;//每个工作表格最多存储2条数据(注:excel表格一个工作表可以存储65536条)
        int avg = totle / mus;
        for (int i = 0; i < avg + 1; i++) {
            WritableSheet ws = wwb.createSheet("列表" + (i + 1), i); //创建一个可写入的工作表
            //添加表头
            ws.addCell(new Label(0, 0, "序号"));
            ws.addCell(new Label(1, 0, "姓名"));
            int num = i * mus;
            int index = 0;
            for (int m = num; m < result.size(); m++) {
                if (index == mus) {//判断index == mus的时候跳出当前for循环
                    break;
                }
                User use = (User) result.get(m);
                //将生成的单元格添加到工作表中
                //(这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行)
                ws.addCell(new Label(0, index + 1, use.getId()));
                ws.addCell(new Label(1, index + 1, use.getName()));
                index++;
            }
        }
        wwb.write();//从内存中写入文件中
        wwb.close();//关闭资源,释放内存
    }
    //测试
    public static void main(String[] args) {
        try {
            outputExcelData();
            System.out.println("导出完成!");
        } catch (WriteException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
/**
 * Title: 实体类
 * Description: TestDemo
 * @author cxg
 * @date 2016年7月19日 上午10:25:04
 */
public class User {
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


}

你可能感兴趣的:(java)