XSSFSheet
(Javadoc XSSFSheet)
有一个方法addIgnoredErrors(...)
。 SXSSFSheet
(Javadoc 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();
}
}
答案 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()来删除临时文件。