2017-11-24 3 views
0

XSSFSheet (Javadoc XSSFSheet) 의 메소드는 addIgnoredErrors(...)입니다. SXSSFSheet (Javadoc SXSSFSheet)에는이 방법이 없습니다.Apache POI : SXSSFSheet에서 addIgnoredErrors (...) 기능을 사용하는 방법

SXSSFSheet 기반 시트의 오류를 어떻게 무시할 수 있습니까?

내가 105,000 행을 가지고 있고 XSSFSheet이 메모리를 날려 버리므로 XSSFSheet을 사용할 수 없습니다.

숫자로만 구성된 텍스트 필드를 표에 넣었습니다. Shitty Excel은이 셀에 대해 경고 Number stored as text을 표시합니다. CellTypeSTRING으로 설정하고 텍스트 형식을 "@"으로 설정해도 순서는 상관 없습니다.

최소 실행 가능한 데모 :

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

SXSSFSheet이 필드 XSSFSheet _sh 내부에있다. 그래서 이것을 사용하고 그것을 사용하기 위해 리플렉션을 사용할 수 있습니다.

다음 예는

<ignoredErrors> 
<ignoredError sqref="A1:A100" numberStoredAsText="true"/> 
</ignoredErrors> 
/xl/worksheets/sheet1.xml

그래서 ExcelA1: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(); 
} 
} 

는 Btw는 임시 파일을 없애 SXSSFWorkbook.dispose()를 사용해야합니다 .:.