簡體   English   中英

Apache POI:如何在SXSSFSheet中使用addIgnoredErrors(…)功能

[英]Apache POI: How to use addIgnoredErrors(…) functionality in SXSSFSheet

XSSFSheetJavadoc XSSFSheet )具有方法addIgnoredErrors(...) SXSSFSheetJavadoc SXSSFSheet )沒有此方法。

如何忽略基於SXSSFSheet的工作表中的錯誤?

我不能使用XSSFSheet ,因為我有105,000行,而XSSFSheet會消耗內存。

我在表中放置了一個只能由數字組成的文本字段。 Shitty Excel將顯示一個警告Number stored as text該單元格的Number stored as text 即使我將CellType設置為STRING並將其格式設置為Text "@" ,無論順序如何。

最小的可運行演示:

public void run() {
    try {
        final SXSSFWorkbook workbook = new SXSSFWorkbook(-1);

        final DataFormat dataFormat = workbook.createDataFormat();

        CellStyle styleDef;
        styleDef = workbook.createCellStyle();
        styleDef.setDataFormat(dataFormat.getFormat("@"));

        final SXSSFSheet sheet = workbook.createSheet();
        final SXSSFRow row = sheet.createRow(0);

        final SXSSFCell cell = row.createCell(0);
        final String text = "123";
        cell.setCellType(CellType.STRING);
        cell.setCellValue(text);
        cell.setCellStyle(styleDef);

        workbook.write(new FileOutputStream("test.xlsx"));
        workbook.close();
        // Hint from Axel Richter, to make it a full working example
        workbook.dispose();

    } catch (final Exception e) {
        e.printStackTrace();
    }
}

SXSSFSheet有一個字段XSSFSheet _sh內部。 因此,我們可以使用反射來獲取並使用它。

以下示例將

<ignoredErrors>
 <ignoredError sqref="A1:A100" numberStoredAsText="true"/>
</ignoredErrors>

/xl/worksheets/sheet1.xml ,因此Excel將忽略范圍A1:A100的錯誤numberStoredAsText

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.streaming.*;

import java.lang.reflect.Field;

public class CreateExcelSXSSFWorkbookNumberAsText {

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

  SXSSFWorkbook workbook = new SXSSFWorkbook();

  DataFormat dataFormat = workbook.createDataFormat();

  CellStyle styleDef;
  styleDef = workbook.createCellStyle();
  styleDef.setDataFormat(dataFormat.getFormat("@"));
  //styleDef.setQuotePrefixed(true);

  SXSSFSheet sheet = workbook.createSheet();

  Field _sh = SXSSFSheet.class.getDeclaredField("_sh");
  _sh.setAccessible(true); 
  XSSFSheet xssfsheet = (XSSFSheet)_sh.get(sheet); 
  xssfsheet.addIgnoredErrors(new CellRangeAddress(0, 99, 0, 0), IgnoredErrorType.NUMBER_STORED_AS_TEXT);     

  for (int r = 0; r < 100; r++) {
   SXSSFRow row = sheet.createRow(r);
   SXSSFCell cell = row.createCell(0);
   String text = "" + new java.util.Random().nextInt();
   cell.setCellValue(text);
   cell.setCellStyle(styleDef);
  }

  workbook.write(new FileOutputStream("test.xlsx"));
  workbook.close();
  workbook.dispose();
 }
}

順便說一句:您應該使用SXSSFWorkbook.dispose()擺脫臨時文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM