2017-11-24 12 views
0

XSSFSheetJavadoc XSSFSheet) のメソッドはaddIgnoredErrors(...)です。 SXSSFSheetJavadoc SXSSFSheet)にはこのメソッドがありません。Apache POI:SXSSFSheetのaddIgnoredErrors(...)機能の使用方法

SXSSFSheetベースのシートでエラーを無視するにはどうすればよいですか?

私は105000行があり、XSSFSheetはメモリを爆破するので、XSSFSheetを使用することはできません。

テーブルには数字だけで構成されるテキストフィールドを配置します。 Shitty Excelは、このセルの警告Number stored as textを表示します。 CellTypeSTRINGに設定し、フォーマットを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(); 
    } 
} 

答えて

1

SXSSFSheetはフィールド内部XSSFSheet _shを持っています。だから我々はこれを取得し、それを使用する反射を使用することができます。

次の例では、/xl/worksheets/sheet1.xml

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

を置くので、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()を使用する必要があります.:。

関連する問題