Apache POI:如何在SXSSFSheet

时间:2017-11-24 17:34:11

标签: java apache-poi

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();
    }
}

1 个答案:

答案 0 :(得分:1)

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