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

如何忽略基于SXSSFSheet的工作表中的错误?

我不能使用XSSFSheet,因为我有105,000行,而XSSFSheet会耗尽内存。

我在表中放置了一个只能由数字组成的文本字段。 Shitty Excel将为此单元格显示一个警告Number stored as text。即使将CellType设置为STRING并设置为文本"@"格式,无论顺序如何。

最小的可运行演示:

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将忽略范围numberStoredAsText的错误A1:A100

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()删除临时文件。

09-08 12:12