亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在工作表中添加大量 ValidationData 時,POI 會寫入損壞的 .xlsx

在工作表中添加大量 ValidationData 時,POI 會寫入損壞的 .xlsx

慕斯709654 2023-03-02 15:41:07
我想.xlsx在 JAVA 中使用 POI 編寫一個大文件(50K 行)。我希望每一行都包含多個下拉單元格。當行數小于 30K 時代碼工作正常,但如果行數超過 35K 則寫入損壞的文件。我試過了SXSSFWorkbook,XSSFWorkbook但沒有一個對我有用。這是代碼:        SXSSFWorkbook workbook = new SXSSFWorkbook(100);        SXSSFSheet sheet = workbook.createSheet();        String[] optionsArray = new String[] {"1000.00","2000.00"};        int no_of_rows = 35000;        for(int i=0;i<=no_of_rows;i++) {            SXSSFRow row1 = sheet.createRow(i);            SXSSFCell r1c1 = row1.createCell(0);            DataValidationConstraint  constraint1 = sheet.getDataValidationHelper().createExplicitListConstraint(optionsArray);            CellRangeAddressList addressList1 = new CellRangeAddressList(i, i, 0, 0);            DataValidation dataValidation1 = sheet.getDataValidationHelper().createValidation(constraint1, addressList1);            sheet.addValidationData(dataValidation1);            r1c1.setCellValue("1000.00");               SXSSFCell r1c2 = row1.createCell(1);            DataValidationConstraint  constraint2 = sheet.getDataValidationHelper().createExplicitListConstraint(optionsArray);            CellRangeAddressList addressList2 = new CellRangeAddressList(i, i, 1, 1);            DataValidation dataValidation2 = sheet.getDataValidationHelper().createValidation(constraint2, addressList2);            sheet.addValidationData(dataValidation2);            r1c2.setCellValue("2000.00");        }        FileOutputStream fos =new FileOutputStream(new File("c:\\data\\testout.xlsx"));        workbook.write(fos);        workbook.close();        fos.close();我希望 POI 至少能夠很好地處理 50K 行此類數據。
查看完整描述

1 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

不要DataValidation為每個單元格創建一個。相反,只創建兩個需要的數據驗證,一個A1:A50001用于B1:B50001. 為此,CellRangeAddressLists 可以包含整個列范圍:


CellRangeAddressList addressList1 = new CellRangeAddressList(0, no_of_rows, 0, 0);


CellRangeAddressList addressList1 = new CellRangeAddressList(0, no_of_rows, 1, 1);

你的例子:


import java.io.File;

import java.io.FileOutputStream;

import org.apache.poi.ss.util.*;

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.streaming.*;


class CreateSXSSFWorkbookDataValidations {


    public static void main(String[] args) throws Exception {


        SXSSFWorkbook workbook = new SXSSFWorkbook(100);

        SXSSFSheet sheet = workbook.createSheet();


        String[] optionsArray = new String[] {"1000.00","2000.00"};


        int no_of_rows = 50000;


        for(int i=0;i<=no_of_rows;i++) {

            SXSSFRow row1 = sheet.createRow(i);

            SXSSFCell r1c1 = row1.createCell(0);

            r1c1.setCellValue("1000.00");   

            SXSSFCell r1c2 = row1.createCell(1);

            r1c2.setCellValue("2000.00");

        }


        DataValidationConstraint constraint1 = sheet.getDataValidationHelper().createExplicitListConstraint(optionsArray);

        CellRangeAddressList addressList1 = new CellRangeAddressList(0, no_of_rows, 0, 0);

        DataValidation dataValidation1 = sheet.getDataValidationHelper().createValidation(constraint1, addressList1);

        sheet.addValidationData(dataValidation1);


        DataValidationConstraint constraint2 = sheet.getDataValidationHelper().createExplicitListConstraint(optionsArray);

        CellRangeAddressList addressList2 = new CellRangeAddressList(0, no_of_rows, 1, 1);

        DataValidation dataValidation2 = sheet.getDataValidationHelper().createValidation(constraint2, addressList2);

        sheet.addValidationData(dataValidation2);


        FileOutputStream fos = new FileOutputStream(new File("testout.xlsx"));

        workbook.write(fos);

        workbook.close();

        fos.close();



    }

}

當不同的唯一數據驗證的計數超過限制時,不可能對每個單個單元格進行不同的唯一數據驗證。這個限制是一個Excel限制,而不是apache poi一個。


Excel 規范和限制中沒有記錄這種數據驗證的特殊限制。但這可能與唯一單元格格式/單元格樣式 (64,000) 的限制或工作表中超鏈接的限制 (66,530) 有關。


查看完整回答
反對 回復 2023-03-02
  • 1 回答
  • 0 關注
  • 361 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號