2017-02-22 37 views
1

我有要求將上傳的電子表格存儲到磁盤。我正在使用下面的代碼來執行相同的操作,並且接收文件是從Excel中損壞的錯誤。使用java將電子表格保存到磁盤

byte[] bytes = null; 
    File uploadedFile = new File("D://xlsxTest//BNG Issue.xlsx"); 
    File file = new File("D://xlsxTest//sample1.xlsx"); 

    FileOutputStream outStream = null; 

    InputStream inputStream = null; 

    try{ 
    if(!file.exists()){ 
     file.createNewFile(); 
    } 
    outStream = new FileOutputStream(file); 

    if (uploadedFile != null) { 

     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     inputStream = new FileInputStream(uploadedFile);; 

     int c = 0; 
     while (c != -1) { 
      c = inputStream.read(); 
      byteArrayOutputStream.write((char) c); 

     } 
     bytes = byteArrayOutputStream.toByteArray(); 

    } 

    outStream.write(bytes); 
      }catch(Exception e){ 
     e.printStackTrace(); 
    }finally{ 
     try{ 
     outStream.close(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

我試過使用一個83KB大小的文件,結果文件是82.5KB。 任何幫助,將不勝感激。 謝謝。

+0

看起來像你保存正確,不能讀取裏面的文本? –

+0

嘗試在關閉它之前添加'outStream.flush()'。 – Berger

+0

無法重現。您的代碼只是在文件末尾添加一個額外的字節(-1),因爲在寫入之後,文件結尾的測試發生**。但它不應該導致較短的副本。您是否可以確認使用上面的代碼「D://xlsxTest//sample1.xlsx」短於「D:// xlsxTest // BNG Issue.xlsx」? –

回答

1

嘗試使用Apace POI,使用以下代碼使用OPCPackage和XSSFWorkbook將.xls或.xlsx文件轉換爲字節數組。

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    OPCPackage pkg = OPCPackage.open(new File(fullFileName)); 
    XSSFWorkbook wb = new XSSFWorkbook(pkg); 
    wb.write(baos); 
    byte[] fileContent = baos.toByteArray(); 

Apache POI在轉換爲字節數組時提取excel文件的所有信息。

+0

如果我按照上面的方式編寫代碼,問題就解決了。但我可能有一個非常大的文件和XSSFWorkbook wb = new XSSFWorkbook(pkg);導致了內存不足的問題。所以想避免相同。 – Vasantha

+0

在excel文件中是否有公式單元格?如果有任何循環引用或者如果有無效的公式,則會出現StackOverflow錯誤。 –

+0

我沒有收到StackOverflow錯誤。該文件正在保存,但在打開Excel表示文件已損壞。 – Vasantha