为XLSX Apache poi使用Java临时文件

为XLSX Apache poi使用Java临时文件,java,excel,apache-poi,xlsx,temporary-files,Java,Excel,Apache Poi,Xlsx,Temporary Files,.hi,我正在尝试创建一个临时的.xlsx文件,并使用apache poi对其进行写入。我在创建工作簿时遇到EmptyFileException。代码如下: public class Writer{ File file; public File Write(List<FormData> l, Class elementClass) { try {//create temp fiele here file = File.createTempFile(eleme

.hi,我正在尝试创建一个临时的.xlsx文件,并使用apache poi对其进行写入。我在创建工作簿时遇到EmptyFileException。代码如下:

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);
        }

        //...
公共类编写器{
文件;
公共文件写入(列表l,类elementClass)
{
尝试{//在此处创建临时文件
file=file.createTempFile(elementClass.getSimpleName(),“.xlsx”);
}捕获(IOEX异常){
Logger.getLogger(Writer.class.getName()).log(Level.SEVERE,null,ex);
}
XSSF工作手册;
XSSF表;
if(file.exists()){
文件输入流输入流;
试一试{
inputStream=新文件inputStream(文件);
}捕获(FileNotFoundException ex){
抛出新的AspirinException(AspirinException.Type.INTERNAL\u错误);
}
请尝试{//此行出错//
工作簿=(XSSF工作簿)WorkbookFactory.create(inputStream);
}捕获(IOException | InvalidFormatException | EncryptedDocumentException ex){
抛出新的AspirinException(AspirinException.Type.INTERNAL\u错误);
}
//...

如果我使用真实的文件,它可以正常工作。但是对于临时文件,它不起作用。请帮助我完成此操作。谢谢

WorkbookFactory。创建
API需要一个支持标记或重置的
InputStream
。 您应该尝试使用
BufferedInputStream

请注意,建议使用
WorkbookFactory.create(java.io.File
文件,因为它的内存占用较小。

创建新文件时,您不需要先创建文件,只需从新工作簿开始即可:

Workbook wb = new XSSFWorkbook();
然后使用API来填充它。最后,您可以通过

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

哪个错误,在哪里/在哪一行?您认为您的
文件
会是一个空文件吗?
WorkbookFactory.create(inputStream)
尝试创建一个
工作簿
对象,其中包含从
inputStream
读取的数据。如果没有数据可读取,此操作将失败。WorkbookFactory.create()用于现有/已填充的Excel文件。从头开始创建XSSF工作簿,然后将()写入临时文件我认为这行不通,问题是代码正在从空文件读取,并且基于文件的读取仍然会失败。