我有一个问题.我是对的,如果我有一个通过xssf构造函数创建的工作簿,那么将构造函数更改为sxssf工作簿(将xssf wb作为参数传递)就足以使其在流模式下工作了吗?谢谢你的答案.
解决方案:这完全取决于您用于流式传输的类.如果你的类收集的流缓冲区比它能容纳的多,那么这个东西就不行了.否则它会
解决方法
你是对的.这两个实现之间的区别在于流版本将数据直接写入流并在内存中存储最多指定行数(默认值为100,并且存储在SXSSFWorkbook.DEFAULT_WINDOW_SIZE中).因此,在写入输出流之后,您将无法获得某些行数据.使用流实现的巨大好处是减少内存使用.如果您需要导出大量数据,请使用SXSSFWorkbook.
例:
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; } } }
输出:
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
如您所见,在使用SXSSFWorkbook写入输出流后,无法再访问第1行.