2016-10-05 38 views
0

私はApache POIを使用してExcelファイルを作成および修正しています。ディレクトリに存在しない場合は、指定した名前の新しい.xlsファイルを作成するようにプログラムを設定します。しかし、存在すれば、私のプログラムはその.xlsファイルを開いて変更するだけです。存在しない場合は新しい.xlsファイルを作成し、それを修正します[Apache POI]

私のプログラムは新しい.xlsファイルを作成することができますが、HSSFWorkbookとしてファイルを開こうとすると、プログラムは "無効なヘッダーシグネチャを読み込みます。0x0000000000000000、0xE11AB1A1E011CFD0を読み込みました。その名前の.xlsファイルが既にディレクトリ内に存在し、私はちょうど使用している場合ことに注意してください

  File excelFile = new File("Test.xls"); 
     excelFile.createNewFile(); 
     wb = new HSSFWorkbook(new FileInputStream(excelFile.getName())); // Throws the error right here [wb is an HSSFWorkbook object from the Apache POI Library] 

:私は新しいファイルを作成するために使用していたコードがある

「有効なOLE2文書でありますFileOutputStreamオブジェクトは、必要なすべてのデータをファイルに正常に書き込みます。私はExcelファイルに書き込むために使用しています

コードは次のとおりです。

 FileOutputStream fileout = new FileOutputStream("Test.xls", true); 
     wb.write(fileout); 
     fileout.close(); 
     wb.close(); // wb is an HSSFWorkbook object from the Apache POI Library 

完全なスタックトレースとエラーメッセージは次のとおりです。

org.apache.poi.poifs.filesystem .NotOLE2FileException:無効なヘッダー
署名; 0x0000000000000000を読んで、0xE11AB1A1E011CFD0を期待 - あなたの ファイルは org.apache.poi.poifs.storage.HeaderBlockで有効OLE2ドキュメントではないと思われる(HeaderBlock.java:162) を org.apache.poi.poifs.storageで。 .HeaderBlock。(HeaderBlock.java:112) org.apache.poi.poifs.filesystem.NPOIFSFileSystemで。(NPOIFSFileSystem.java:302) org.apache.poi.hssf.usermodel.HSSFWorkbookで(HSSFWorkbook。 Javaの:393) org.apache.poi.hssf.usermodel.HSSFWorkbookでprototpye_2.FrameJScraperTool.runで prototpye_2.FrameJScraperTool.processWorkbook(FrameJScraperTool.java:224で(HSSFWorkbook.java:374) ) (フレーム。 javax.swing.AbstractButton $ Handler.actionPerformed(不明なソース)で javax.swing.AbstractButton.fireActionPerformed(不明なソース)で prototpye_2.JFrameTest $ Open.actionPerformed(JFrameTest.java:123)でJScraperTool.java:54) javax.swing.plaf.basic.BasicMenuItemUIで javax.swing.AbstractButton.doClick(不明なソース)で javax.swing.DefaultButtonModel.setPressed(不明なソース)で javax.swing.DefaultButtonModel.fireActionPerformed(不明なソース)で、 .doClick(不明なソース) でjavax.swing.plaf.basic.BasicMenuItemUI $ Handler.mouseReleased(不明な ソース)java.awt.AWTEventMulticaster.mouseReleased(不明なソース) at java.awt.Component.processMouseEvent(不明なソース)aトン java.awt.Component.dispatchEventImplで java.awt.Container.processEvent(不明なソース)で java.awt.Component.processEvent(不明なソース)でjavax.swing.JComponent.processMouseEvent(不明なソース)(不明 java.awt.LightweightDispatcher.processMouseEventで java.awt.LightweightDispatcher.retargetMouseEvent(不明なソース)で java.awt.Component.dispatchEvent(不明なソース)で java.awt.Container.dispatchEventImpl(不明なソース)のソース) (不明な情報源) のjava.awt.LightweightDispatcher.dispatchEvent(不明な情報源) のjava.awt。 のjavaで java.awt.EventQueue.dispatchEventImpl(不明なソース)で java.awt.Component.dispatchEvent(不明なソース)で java.awt.Window.dispatchEventImpl(不明なソース)でContainer.dispatchEventImpl(不明なソース)。のawt.EventQueue.access $ 500(不明なソース) のjava.awt.EventQueue $ 3.run(不明なソース) のjava.awt.EventQueue $ 3.run(不明なソース)java.security.AccessController.doPrivileged(ネイティブメソッド)java.awt.EventQueue $ 4.run(不明Sourcで すべてjava.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(不明 出典)で すべてjava.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(不明 ソース)で、 E) java.awt.EventQueue $ 4.run(不明なソース)でjava.awtでの すべてjava.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(不明 出典)で java.security.AccessController.doPrivileged(ネイティブメソッド)で。 EventQueue.dispatchEvent java.awt.EventDispatchThread.pumpOneEventForFilters(不明なソース)は、Javaでjava.awt.EventDispatchThread.pumpEventsForHierarchyでjava.awt.EventDispatchThread.pumpEventsForFilter(不明なソース) (不明 出典)で で(不明なソース)。 awt.EventDispatchThread.pumpEvents(不明なソース) at java.awt.EventDispatchThread.pumpEvents(不明なソース) java.awt.EventDispatchThread.run(不明なソース)

また、このエラーが発生すると、ディレクトリに作成される.xlsファイルがありますが、サイズは0 KBです。ファイルを開こうとすると、ファイルが破損していると文句を言います。次のプロンプトは、Excelで起動します:

Prompt That comes up in excel when you try to open the generated .xls

書き、その後、私は.xlsファイルが存在しない場合、すなわちを行うにしようとしています何を達成するためのより良い方法があれば、私に教えてください、それを作成し、それが存在する場合は、アクセスしてその中にデータを書き込むだけです。

ヘルプの任意の種類は

おかげ

を高く評価している
+1

https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#exists-java.nio.file.Path-java.nio。 file.LinkOption ...-? – assylias

+0

私もそれを試みます。しかし、createNewFile()関数は、ファイルを作成する前にそのファイルがディレクトリに存在するかどうかをチェックする必要がありますか? @assylias –

+0

使用しているpoiのバージョンは? –

答えて

0

新しいExcel .xlsファイルを作成します。

import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
//.. 
HSSFWorkbook workbook = new HSSFWorkbook(); 
HSSFSheet sheet = workbook.createSheet("FuSsA sheet"); 
//Create a new row in current sheet 
Row row = sheet.createRow(0); 
//Create a new cell in current row 
Cell cell = row.createCell(0); 
//Set value to new value 
cell.setCellValue("Slim Shady"); 
    try { 
     FileOutputStream out = 
       new FileOutputStream(new File("C:\\new.xls")); 
     workbook.write(out); 
     out.close(); 
     System.out.println("Excel written successfully.."); 

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

更新Excelは多くのため(.xlsまたは.xlsx

try { 
      File file = new File"C:\\update.xls"); 
      Workbook workbook = WorkbookFactory.create(file); 
      Sheet sheet = workbook.getSheetAt(0); 
      Cell cell = null; 

      //Update the value of cell 
      cell = sheet.getRow(1).getCell(2); 
      cell.setCellValue(cell.getNumericCellValue() * 2); 
      cell = sheet.getRow(2).getCell(2); 
      cell.setCellValue(cell.getNumericCellValue() * 2); 
      cell = sheet.getRow(3).getCell(2); 
      cell.setCellValue(cell.getNumericCellValue() * 2); 

      file.close(); 

      FileOutputStream outFile =new FileOutputStream(new File("C:\\update.xls")); 
      workbook.write(outFile); 
      outFile.close(); 

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

ファイルの既存の詳細cheこの疑問を解決する:Read/Write different Microsoft Office file formats using Apache POI

+0

[Apache POI docsに従って、ファイルがあるときはInputStreamを使用しない](http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream)! – Gagravarr

+0

この例は私のために働いています。もしそれを改善できるなら(y).. – FuSsA

関連する問題