2017-08-24 150 views
0

.hi,我正在尝试创建一个临时的.xlsx文件并使用apache poi写入它。我得到EmptyFileException创建工作簿。这是代码:使用XLSX的Apache临时文件Apache poi

public class Writer{ 
File file; 
public File Write(List<FormData> l, Class elementClass) 
{ 

    try {//create temp fiele here 
     file = File.createTempFile(elementClass.getSimpleName(),".xlsx"); 
    } catch (IOException ex) { 
     Logger.getLogger(Writer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    XSSFWorkbook workbook; 
    XSSFSheet sheet; 
    if (file.exists()) { 
     FileInputStream inputStream; 
     try { 
      inputStream = new FileInputStream(file); 
     } catch (FileNotFoundException ex) { 
      throw new AspirinException(AspirinException.Type.INTERNAL_ERROR); 
     } 
     try {// this line gets error// 
      workbook = (XSSFWorkbook) WorkbookFactory.create(inputStream); 
     } catch (IOException | InvalidFormatException | EncryptedDocumentException ex) { 
      throw new AspirinException(AspirinException.Type.INTERNAL_ERROR); 
     } 

     //... 

它工作正常,如果我使用一个真实的文件。但对于临时文件它不起作用。请帮我解决一下这个。谢谢

+0

将其写入一个新文件哪个错误和哪个/哪一行? – Marged

+2

你认为你的'文件'不是空文件吗? 'WorkbookFactory.create(inputStream)'尝试创建一个'Workbook'对象,其中包含从'inputStream'中读取的数据。如果没有要读取的数据,则失败。 –

+2

WorkbookFactory.create()用于存在/填充的Excel文件。从头开始创建一个XSSFWorkbook,然后将其写入()到临时文件 – kiwiwings

回答

1

当你创建你不会首先需要一个文件一个新的文件,你可以开始一个新的工作簿:

Workbook wb = new XSSFWorkbook(); 

,然后使用API​​来填充它。最后,您可以通过

try (OutputStream stream = new FileOutputStream(file)) { 
    wb.write(stream); 
} 
0

WorkbookFactory.create API需要支持标记或重置的InputStream。 你应该尝试使用BufferedInputStream。 请注意,建议使用WorkbookFactory.create(java.io.File文件,因为它具有较小的内存占用空间。

+0

我不认为这会起作用,问题在于代码是从一个空文件读取的,并且它仍然会失败,并且基于文件的读取也会失败。 – centic