Evet, haklısınız. Bu iki uygulama arasındaki fark, akış versiyonunun verileri doğrudan akışa yazması ve bellekteki en fazla sayıda satırda saklanmasıdır (varsayılan değer 100'dür ve SXSSFWorkbook.DEFAULT_WINDOW_SIZE içinde depolanır). Bu nedenle, çıktı akışına yazdıktan sonra bazı satır verileri elde edemeyeceksiniz. Akış uygulamasını kullanmanın büyük yararı, daha az bellek kullanımıdır. Çok fazla veri dışa aktarmanız gerekiyorsa SXSSFWorkbook'u kullanın.
Örnek:
public static void main(String[] args) throws IOException {
FileOutputStream inMemoryOut = new FileOutputStream(new File("inMemoryWorkbook.xlsx"));
XSSFWorkbook workbook = new XSSFWorkbook();
WorkbookExample example = new WorkbookExample(workbook, inMemoryOut);
example.export();
FileOutputStream streamOut = new FileOutputStream(new File("streamWorkbook.xlsx"));
SXSSFWorkbook streamWorkbook = new SXSSFWorkbook();
WorkbookExample streamExample = new WorkbookExample(streamWorkbook, streamOut);
streamExample.export();
}
public class WorkbookExample {
private Logger logger = Logger.getLogger(WorkbookExample.class.getName());
private Workbook workbook;
private OutputStream out;
public WorkbookExample(Workbook workbook, OutputStream out) {
this.workbook = workbook;
this.out = out;
}
public void export() throws IOException {
logger.info("export start for " + workbook.getClass().getName());
List<Person> persons = new ArrayList<Person>();
for (int i = 0; i < 1000; i++) {
persons.add(new Person(String.valueOf("user_" + i)));
}
Sheet sheet = workbook.createSheet();
for (int i = 0; i < persons.size(); i++) {
Person p = persons.get(i);
Row row = sheet.createRow(i);
Cell cell = row.createCell(0);
cell.setCellValue(p.getName());
}
workbook.write(out);
logger.info("Is row 1 accessible after writing to output stream? " + String.valueOf(sheet.getRow(1) != null));
out.close();
workbook.close();
logger.info("export finished for " + workbook.getClass().getName());
}
public static class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
Çıktı:
kwi 21, 2015 7:56:14 PM pepuch.html2pdf.WorkbookExample export
INFO: export start for org.apache.poi.xssf.usermodel.XSSFWorkbook
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
INFO: Is row 1 accessible after writing to output stream? true
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
INFO: export finished for org.apache.poi.xssf.usermodel.XSSFWorkbook
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
INFO: export start for org.apache.poi.xssf.streaming.SXSSFWorkbook
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
INFO: Is row 1 accessible after writing to output stream? false
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
INFO: export finished for org.apache.poi.xssf.streaming.SXSSFWorkbook
Eğer satır 1 SXSSFWorkbook ile çıktı akımına yazdıktan sonra artık erişilemez Gördüğünüz gibi
.
Cevabınız için teşekkür ederim ama aslında farklı bir şey soruyordum. Ben xssf dosyası yerine sxssfworkbook sınıfını kullanarak çalışma kitabı oluşturmaya başlayacaksam, xlsx dosyası oluşturmak için temel olarak çalışma kitabını kullanan mevcut uygulamamı canlandırabilir miyim diye merak ediyordum. –
Yazdığım gibi fark, çalışma kitabında saklanan satırların kullanılabilirliğindedir. Eğer yazıyı yazdıktan sonra satır yazmanız gerekmiyorsa onu kullanabilirsiniz. – pepuch
@pepuch Yalnızca 'SXSSFWorkbook', geçici dosyaları kaldırmak için kullanılan dispose() yöntemine sahiptir. Bunu 'WorkbookExample' sınıfına nasıl eklersiniz (veya eklemezsiniz)? Oyuncular? Örneği? –