2010-04-09 36 views
5

Ho un foglio di calcolo Excel protetto da password. Ho bisogno di aprire questo foglio di calcolo e leggere i dati da esso. Ho tentato di utilizzare l'API POI senza alcun risultato. Una soluzione Java sarebbe preferibile, ma qualsiasi idea sarebbe utile.File Excel protetto da password

Edit: Sì, ho la password. Il file è protetto da password in Excel; è necessario inserire una password per visualizzare il foglio di calcolo.

Edit2: Io sono in grado di aprirlo con POI con la password, Cerco una soluzione alternativa.

+1

Non è chiaro dalla tua domanda se hai effettivamente la password e hai solo problemi a trasmetterla al PDI. Sembra anche un duplicato di http://stackoverflow.com/questions/1204382/how-can-we-read-protected-password-excel-file-xls-with-poi-api – Uri

+0

Excel ha diversi meccanismi di protezione in cui un la password è usata Ti riferisci alla protezione dei file, consentendo l'apertura del file solo con la password fornita? –

+0

Vedere le modifiche relative alle domande. – dhorn

risposta

0

È possibile utilizzare JExcelApi.

È passato un po 'di tempo da quando l'ho fatto, quindi potrei non dirti come farlo correttamente, ma c'è sicuramente un modo per farlo usando JExcelApi. Prova la seguente sorgente:

Workbook workbook = Workbook.getWorkbook(new File("/path/to/protected.xls")); 
workbook.setProtected(false); 
WritableWorkbook copy = Workbook.createWorkbook(new File("/path/to/unprotected.xls"), workbook); 
WritableSheet[] sheets = copy.getSheets(); 

for (WritableSheet sheet : sheets){ 
    sheet.getSettings().setProtected(false); 
} 

copy.write(); 
copy.close(); 

Ovviamente, è necessario importare le classi necessarie e rilevare le eccezioni necessarie.

+0

Fantastico, darò uno scatto. – dhorn

+0

Esiste un metodo per impostare la password su excel ?? – happy

+0

Ho provato questo, ma io non sono in grado di impostare le password.Please vedono http://stackoverflow.com/questions/11256259/how-to-set-password-on-workbook-worksheet-of-excel-in-java- using-jexcel-api – happy

1

addthe eccellono file in ODBC Fonti (dal Pannello di controllo-> Strumenti di amministrazione) e quindi eseguire il codice:

// program to extract data from excel file 

import java.sql.Connection ; 
import java.sql.Statement ; 
import java.sql.ResultSet ; 
import java.sql.ResultSetMetaData ; 
import java.sql.DriverManager ; 
import java.sql.SQLException ; 

public class ExtractExcelData { 

    public static void main (String[] args) { 
     try { 
      Class.forName(DRIVER); 
      connection = DriverManager.getConnection(URL,userName,password); 
     } 
     catch (ClassNotFoundException cnfe) { 
      System.err.println("unable to load excel driver"); 
      return ; 
     } 
     catch (SQLException se) { 
      System.err.println("cannot connect to excel file"); 
      return ; 
     } 

     try { 
      statement = connection.createStatement(); 
      String select = "SELECT * FROM [Sheet1$]"; 
      resultSet = statement.executeQuery(select); 
      metaData = resultSet.getMetaData(); 

      int count = metaData.getColumnCount(); 
      while (resultSet.next()) { 

       String col1 = resultSet.getString(1) ; 
       String col2 = resultSet.getString(2) ; 
       String col3 = resultSet.getString(3) ; 

       System.out.println(col1) ; 
       System.out.println(col2) ; 
       System.out.println(col3) ; 

       System.out.println(); 
      } 
     } 
     catch (SQLException se) { 
      System.err.println("cannot execute query"); 
      return ; 
     } 

     try { 
      statement.close(); 
      resultSet.close(); 
     } 
     catch (SQLException se) { 
      System.err.println("unable to close excel file"); 
      return ; 
     } 
    } 

    private static final String userName = "" ; 
    private static final String password = "" ; 
    private static final String URL = "jdbc:odbc:testexcel" ; 
    private static final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ; 

    private static Connection connection ; 
    private static Statement statement ; 
    private static ResultSet resultSet ; 
    private static ResultSetMetaData metaData ; 
} 
+0

Questa soluzione solo per Windows non può essere raccomandata. –

7

POI dovrebbe essere in grado di aprire entrambi i file XLS protetti (usando org.apache.poi .hssf.record.crypt) e file XLSX protetti (usando org.apache.poi.poifs.crypt). Hai provato questi?

Se stai usando HSSF (per un file xls), è necessario impostare la password prima di aprire il file. Si esegue questa operazione con una chiamata a:

org.apache.poi.hssf.record.crypto.Biff8EncryptionKey.setCurrentUserPassword(password); 

Successivamente, HSSF dovrebbe essere in grado di aprire il file.

Per XSSF, si desidera qualcosa di simile:

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("protect.xlsx")); 
    EncryptionInfo info = new EncryptionInfo(fs); 
    Decryptor d = Decryptor.getInstance(info); 
    d.verifyPassword(Decryptor.DEFAULT_PASSWORD); 
    XSSFWorkbook wb = new XSSFWorkbook(d.getDataStream(fs)); 

I dettagli completi sono riportati sulla POI Encryption documentation page

+0

Questo sembra il più corretto per PDI. EncryptionInfo è stato introdotto in POI nella v3.7 o v3.8 –

+0

come impostare la password sul file excel non protetto? Esiste un metodo in questo pacchetto org.apache.poi.hssf.record.crypto.Biff8EncryptionKey – happy

+0

Penso che sia necessario utilizzare 'Decryptor d = Decryptor.getInstance (informazioni);' invece nella riga n. 3 – Yar

1

Ho cercato di impostare una password per il file Excel da java script, questo script funziona solo su IE e Get dovrebbe essere installato nel sistema client.

<script> 
function setPasswordToExcel(password,excelFileName,newFileName) 
{ 
    var Excel; 
    Excel = new ActiveXObject("Excel.Application"); 
    Excel.Visible = false; 
    var obj = Excel.Workbooks.Open(excelFileName); 
    obj.Password =password; 
    obj.SaveAs(newFileName); 
    obj.Close(); 
    Excel.Close(); 
    return 1; 
}  
setPasswordToExcel("stephen","C:/test1.xls","C:\\test2.xls"); 
</script> 
Problemi correlati