熱線電話:13121318867

登錄
首頁精彩閱讀java導出excel大量數據出現錯誤時解決辦法
java導出excel大量數據出現錯誤時解決辦法
2017-11-15
收藏

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<User> result = new ArrayList<User>();
        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;
    }


}

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢