2013-09-09 6 views
3

Я пытаюсь написать код, который добавит данные в уже существующую таблицу Excel. Однако, когда я запускаю этот код, файл становится поврежденным.Добавление существующего файла excel с использованием XSSFWorkbook

В случае этого кода я пытаюсь добавить электронную таблицу, но я пробовал с ячейками в существующем листе без каких-либо ошибок и все той же ошибки. Я что-то упускаю, похоже, что я создаю Excel, добавляя некоторые данные, а затем пишу, закрывая его. а затем просто добавить новый лист в существующую книгу и снова записать его в поток.

public class PlayWithExcel { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    Workbook wb = new XSSFWorkbook(); 
    XSSFSheet ws = (XSSFSheet) wb.createSheet("Initial Data"); 
    XSSFSheet ws1 = (XSSFSheet) wb.createSheet("Cross Referenced"); 
    XSSFSheet ws2 = (XSSFSheet) wb.createSheet("HPD"); 

    Row row = ws.createRow(0); 
    row.createCell(0).setCellValue("Value"); 
    row = ws1.createRow(2); 
    row.createCell(3).setCellValue("Address"); 

    try { 
     String path = "C:/Users/Jenny/Desktop/Test.xlsx"; 
     FileOutputStream out = new FileOutputStream(path); 
     wb.write(out); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


    XSSFSheet ws3 = (XSSFSheet) wb.createSheet("another sheet"); 


    try { 
     String path = "C:/Users/Jenny/Desktop/Test.xlsx"; 
     FileOutputStream out = new FileOutputStream(path); 
     wb.write(out); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

ответ

1

Многие люди, с которыми сталкивается вопрос при попытке записи более чем один раз. This is a known issue в POI.

Однако я попробую перезагрузить файл с помощью fileinputstream, когда вы пишете в первый раз, и вам нужно снова перезагрузить файл.

try { 
    String path = "C:/Users/Jenny/Desktop/Test.xlsx"; 
    FileOutputStream out = new FileOutputStream(path); 
    wb.write(out); 
    out.close(); 
    wb = new XSSFWorkbook(new FileInputStream(path)); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
+1

Если у вас есть файл, вы гораздо лучше Открывание, что непосредственно, а не идти через InputStream см [документацию POI подробную информацию о том, почему] (http://poi.apache.org/ таблица/quick-guide.html # FileInputStream) – Gagravarr

+0

Sankumarsingh, thx so much !!! это действительно сработало! но я, похоже, не понимаю логики того, что я только что сделал. Как InputStream помогает мне, это для чтения файла. было бы полезно, если бы вы могли объяснить. – Jenny

+0

@ Leah-DinaCharnetskaya: Первоначально вы создали новую книгу, поэтому не нужно загружать какой-либо входной поток, но когда вы написали какую-либо книгу Excel и если хотите снова работать над этой книгой, вам нужно снова загрузить ее. Кстати, использование потока входных/выходных файлов немного медленное и память потребляет. Было бы лучше использовать файл. – Sankumarsingh