2012-08-10 86 views
0

我寫了一個方法「writeData」,將apache poi將現有excel文件中的列數據寫入新的excel文件。它運作良好。但是當我嘗試再次調用此方法時,以前的數據丟失了。爲什麼?有人可以幫助我嗎?爲什麼在我再次寫入該文件後,由excel文件中的poi寫入的數據缺失?

public class ReadData { 

    /** 
    * @param args 
    */ 
    Workbook wb, wb1; 
    Sheet sheet, sheet1; 
    Row row; 
    Row row1; 
    static int cell; 
    Cell cell1; 


    static ArrayList<Cell> list1 = new ArrayList<Cell>(); 
    static ArrayList<Cell> list2 = new ArrayList<Cell>(); 



    public static ArrayList<Cell> readData(String filename, int cellNum, ArrayList array){ 

    try{   

     InputStream inp = new FileInputStream(filename); 
     Workbook wb = WorkbookFactory.create(inp); 
     Sheet sheet = wb.getSheetAt(0); 



     for (int j=sheet.getLastRowNum(); j>0; j--) { 

      Row row = sheet.getRow(j); 
      Cell cell = row.getCell(cellNum); 


      array.add(cell); 



      System.out.println(cell); 

     } 


    }catch(Exception e){ 
     System.out.println("Wrong!" + e.getMessage()); 
     e.getStackTrace(); 
     System.out.println(e.getStackTrace()); 
     } 
    return array; 
    } 


    public static void writeData(int cellNo, ArrayList<Cell> array){ 


     Workbook wb1 = new HSSFWorkbook(); 
     FileOutputStream fos = null; 

      try{ 
       fos = new FileOutputStream("3.xls"); 
       Sheet sheet1 = wb1.createSheet("Data"); 



       for(int i = 0; i < array.size(); i++){ 
       Row row1 = sheet1.createRow(i); 
       Cell cell1 = row1.createCell(cellNo); 
       cell1.setCellValue(array.get(i).getNumericCellValue()); 
       } 

       wb1.write(fos); 
       fos.close(); 

       }catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        } 



    public static void main(String[] args) { 

    readData("1.xls",0,list1); 
    writeData(0,list1); 
    readData("2.xls",0,list2); 
    writeData(1,list2); 
} 

} 
+0

你總是覆蓋以前的文件:你正在使用一個固定的文件名,並且每次運行'writeData()時重新創建一個新文件' – 2012-08-10 17:42:49

+0

那麼你知道如何解決它嗎? – 2012-08-10 19:18:35

+0

這將取決於預期的行爲。好像你應該對readData()進行所有的調用,建立你的數據集,然後把它寫在一個單獨的Excel文件中。我從來沒有使用POI,所以不能評論。 – 2012-08-10 20:01:38

回答

0

你的問題是,你從頭開始您的工作簿和FileOuputStream覆蓋您的文件。

您需要打開將其鏈接到您的文件的工作簿。爲此,構建你的Excel和InputStream。

InputStream input = new FileInputStream("3.xls"); 
wb1 = new HSSFWorkbook(input); 

對於寫作,我不完全相信,如果你真的需要使用FileOuputStream,也許正確關閉工作簿就足夠了(與XSSFWorkbooks作品)。

OutputStream將工作,但如果輸入等於輸出,則可能會出現一些錯誤。

希望它幫助。

+0

感謝您的幫助。我有另一個問題。你知道如何實現不包括在poi評估列表中的excel函數,比如斜率嗎? 「SLOPE」是excel中的常規函數​​,但我無法通過poi評估它。 – 2012-08-13 12:06:50

+0

有特定的工具來評估公式(目前只有pn HSSF工作簿)。見[這個問題](http://stackoverflow.com/questions/5747034/poi-formula-evaluation?answertab=votes#tab-top)如果沒有在列表中,唯一的方法是自己評估它..祝你好運。 – ArtiBucco 2012-08-13 12:40:22