1

jExcel APIを使用してExcelシートにデータを書き込んでいます。以下は、正常に動作している私のコードです。しかし、Excelシートに大量のデータを書き込んでいると、この例外が発生します-

jxl.write.biff.RowsExceededException: The maximum number of rows permitted on
a worksheet been exceeded

以下はコードです。最初のシートがそれ以上行を収容できない場合、どうすれば別のシートにデータを書き込むことができますか? 誰か助けてくれませんか?

 public void write() throws IOException, WriteException {

    readFileIPAddress();

    File file = new File(inputFile);
    WorkbookSettings wbSettings = new WorkbookSettings();

    wbSettings.setLocale(new Locale("en", "EN"));

    WritableWorkbook workbook = Workbook.createWorkbook(file, wbSettings);
    workbook.createSheet("Report", 0);
    WritableSheet excelSheet = workbook.getSheet(0);
    createLabel(excelSheet);
    createContent(excelSheet);

    workbook.write();
    workbook.close();
    }


    private void createLabel(WritableSheet sheet) throws WriteException {

    WritableFont times15pt = new WritableFont(WritableFont.TAHOMA, 11);
    times = new WritableCellFormat(times15pt);
    times.setWrap(true);

    WritableFont times10ptBoldUnderline = new WritableFont(WritableFont.TAHOMA, 13, WritableFont.BOLD, false, UnderlineStyle.SINGLE);
    timesBoldUnderline = new WritableCellFormat(times10ptBoldUnderline);
    timesBoldUnderline.setWrap(true);

    CellView cv = new CellView();
    cv.setFormat(times);
    cv.setFormat(timesBoldUnderline);
    cv.setAutosize(true);

    addCaption(sheet, 0, 0, "IP Address");
    addCaption(sheet, 1, 0, "Digital Element Country Code");
    addCaption(sheet, 2, 0, "Maxmind Country Code");
    addCaption(sheet, 3, 0, "Neustar City");
    addCaption(sheet, 4, 0, "Maxmind City");
    addCaption(sheet, 5, 0, "Neustar Zip Code");
    addCaption(sheet, 6, 0, "Maxmind Zip Code");
    }

     private void createContent(WritableSheet sheet) throws WriteException, RowsExceededException {

    NaEdgeDb edge = null;
    try {
    while (!workQueue.isEmpty()) {
        String ipAddress = workQueue.take();

        edge = new NaEdgeDb();
        edge.set_server_addr(serverIPAddress);
        edge.set_id(10);
        if (checkIPDuplicate.add(ipAddress)) {

            resp = GeoLocationService.getLocationIp(ipAddress, 0);
            edge.naQueryEdge(ipAddress);

            addNumber(sheet, 0, j, ipAddress);

            addNumber(sheet, 1, j, (edge.edge_twoLetterCountry));

            addNumber(sheet, 2, j, (resp.getLocation() != null ? resp.getLocation().getCountry() : null));

            addNumber(sheet, 3, j, (edge.edge_city));

            addNumber(sheet, 4, j, (resp.getLocation() != null ? resp.getLocation().getCity() : null));

            addNumber(sheet, 5, j, (edge.edge_postalCode));

            addNumber(sheet, 6, j, (resp.getLocation() != null ? resp.getLocation().getZipCode() : null));
            j++;
        } 
        } 
    } catch (Exception e) {
        getLogger().log(LogLevel.ERROR, e.fillInStackTrace());
        e.printStackTrace();
    }
  }

    private void addCaption(WritableSheet sheet, int column, int row, String s) throws RowsExceededException,
        WriteException {
    Label label;
    label = new Label(column, row, s, timesBoldUnderline);
    sheet.addCell(label);
    }

    private void addNumber(WritableSheet sheet, int column, int row, String str) throws WriteException,
        RowsExceededException {
    Label number;
    number = new Label(column, row, str);
    sheet.addCell(number);
    }

更新されたコード:-

これはまだ同じ例外をスローしています。なぜかわからない?このコードで新しいシートの作成を既に処理していますか? このコードに問題はありますか?

 private void createContent(WritableSheet sheet, WritableWorkbook workbook2) throws WriteException, RowsExceededException {

    NaEdgeDb edge = null;
    WritableSheet ws2 = workbook2.createSheet("sheet2", 2);
    try {
    while (!workQueue.isEmpty()) {
        String ipAddress = workQueue.take(); // generateIPAddress();

        edge = new NaEdgeDb();
        edge.set_server_addr(serverIPAddress);
        edge.set_id(10);
        System.out.println(sheet.getRows());
        if (checkIPDuplicate.add(ipAddress) && sheet.getRows() <= 65536 ) {

            resp = GeoLocationService.getLocationIp(ipAddress, 0);
            edge.naQueryEdge(ipAddress);

            addNumber(sheet, 0, j, ipAddress);

            addNumber(sheet, 1, j, (edge.edge_twoLetterCountry));

            addNumber(sheet, 2, j, (resp.getLocation() != null ? resp.getLocation().getCountry() : null));

            addNumber(sheet, 3, j, (edge.edge_city));

            addNumber(sheet, 4, j, (resp.getLocation() != null ? resp.getLocation().getCity() : null));

            addNumber(sheet, 5, j, (edge.edge_postalCode));

            addNumber(sheet, 6, j, (resp.getLocation() != null ? resp.getLocation().getZipCode() : null));
            j++;
        } else {
            resp = GeoLocationService.getLocationIp(ipAddress, 0);
            edge.naQueryEdge(ipAddress);

            addNumber(ws2, 0, j, ipAddress);

            addNumber(ws2, 1, j, (edge.edge_twoLetterCountry));

            addNumber(ws2, 2, j, (resp.getLocation() != null ? resp.getLocation().getCountry() : null));

            addNumber(ws2, 3, j, (edge.edge_city));

            addNumber(ws2, 4, j, (resp.getLocation() != null ? resp.getLocation().getCity() : null));

            addNumber(ws2, 5, j, (edge.edge_postalCode));

            addNumber(ws2, 6, j, (resp.getLocation() != null ? resp.getLocation().getZipCode() : null));
            k++;
        }
        } 
    } catch (Exception e) {
        getLogger().log(LogLevel.ERROR, e.fillInStackTrace());
        e.printStackTrace();
    }
    System.out.println("Size of HashSet:" + checkIPDuplicate.size());
    }
4

1 に答える 1

2

必要に応じて、WritableWorkbook#createSheet(java.lang.String、int))を使用して新しいシートを作成できると思います。

の代わりに、メソッドWritableSheetを渡します。カウンターを使用して、現在のシートに追加された行数を確認します。シートがいっぱいの場合(counter == MAX_ROWS)、新しいシートを作成し、行カウンターを0にリセットします。WritableWorkbookcreateContent

于 2012-11-16T19:27:43.010 に答える