2015-12-04 5 views
1

У меня есть метод, чтобы создать и написать .xlsx файл, который работает отлично:апача пои: не может вновь открыть книгу: InvalidOperationException

public static void createFileAndwriteResult(String path) { 
    f = new File(path); 
    try { 
     f.createNewFile(); 
    } catch (IOException e1) { 
     Message.showMessage("", "Permission to result folder denied", false); 

    } 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(f); 
     XSSFWorkbook wb = new XSSFWorkbook(); 
     Sheet resultSheet = wb.createSheet(); 
     //do stuff 
     wb.write(fos); 
     wb.close(); 
     fos.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

И еще один метод, добавляемый материал для этого формата XLSX:

public static void appendToFile() { 
    File f = new File(path); 
    XSSFWorkbook wb = null; 
    Sheet resultSheet = null; 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(f); 
     try { 
      wb = new XSSFWorkbook(new FileInputStream(f)); // <--- This is where the exception happens 
      resultSheet = wb.getSheetAt(0); 
      //do stuff 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

    } 

} 

Однако, если я хочу, чтобы вновь открыть эту книгу, я получаю InvalidOperationException, говоря: не удается открыть указанный файл: «PathToFile \ file.xlsx». Файл существует в этой папке. Однако при этом исключается размер 0kB. Я пробовал различные методы, в том числе:

OPCPackage pkg = OPCPackage.open(f); 
wb = new XSSFWorkbook(pkg); 

и:

Workbook wb = WorkbookFactory.create(new File(f)); 

Любая идея, как это исправить/способ вновь открыть книгу, которая была написана/использовался ранее в той же программе?

+2

Хотя вы закроете книгу в программе Java, вы, возможно, процесс первенствовать все еще работает на вашем компьютере, который будет DISALLOW другой процесс нить будет запущен, если вам попытайтесь снова открыть книгу. Может потребоваться руководство 'taskkill/pid' – andrewdleach

+0

Вы пробовали WorkbookFactory? WorkbookFactory.create (новый FileInputStream (f)) – andrucz

+0

@andrucz да пробовал это, тот же результат ... – neza

ответ

0

fos = new FileOutputStream(f); создать выходной поток с опцией «добавить» равным false. Таким образом, контент очищается.

Вы должны определить true для append аргумента:

fos = new FileOutputStream(f, true); 
+0

Бинарные файлы Excel не являются добавочными, их необходимо перезаписать – Gagravarr

+0

Это сделало трюк, спасибо! – neza

+0

Ницца! Пожалуйста. – andrucz

1

Вы пытаетесь открыть файл для чтения , что вы уже открыли для записи - это не будет работать. Оба раза вы ссылаетесь Файлом е

//You open an OUTPUT stream into File f here 
fos = new FileOutputStream(f); 
    try { 
     //And here you try to read again 
     wb = new XSSFWorkbook(new FileInputStream(f)); 

Вы можете создать новый файл для вывода, а затем заменить «старый» вход с «новым» выходным файлом.

 Смежные вопросы

  • Нет связанных вопросов^_^