2010-04-09 98 views
5

Tengo una hoja de cálculo de Excel que está protegida por contraseña. Necesito abrir esta hoja de cálculo y leer sus datos. He intentado utilizar la API de POI sin ningún resultado. Sería preferible una solución Java, pero cualquier idea sería útil.Archivo de Excel con contraseña protegida

Editar: Sí, tengo la contraseña. El archivo está protegido con contraseña en excel; se debe ingresar una contraseña para ver la hoja de cálculo.

Edit2: No puedo abrirlo con POI con la contraseña, estoy buscando una solución alternativa.

+1

No está claro por su pregunta si realmente tiene la contraseña y simplemente tiene problemas para transmitirla a POI. También parece un duplicado de http://stackoverflow.com/questions/1204382/how-can-we-read-protected-password-excel-file-xls-with-poi-api – Uri

+0

Excel tiene varios mecanismos de protección donde contraseña es usada ¿Se refiere a la protección de archivos, permitiendo que el archivo se abra solo con la contraseña proporcionada? –

+0

Ver ediciones con respecto a preguntas. – dhorn

Respuesta

0

Puede usar JExcelApi.

Ha pasado un tiempo desde que hice esto, por lo que puede que no te esté diciendo cómo hacerlo correctamente, pero definitivamente hay una manera de hacerlo con JExcelApi. Pruebe la fuente a continuación:

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(); 

Por supuesto, tendrá que importar clases necesarias y capturar las excepciones necesarias.

+0

Impresionante, voy a dar una oportunidad. – dhorn

+0

¿Hay algún método para establecer la contraseña en Excel? – happy

+0

Intenté esto pero no puedo establecer la contraseña. Vea http://stackoverflow.com/questions/11256259/how-to-set-password-on-workbook-worksheet-of-excel-in-java- using-jexcel-api – happy

1

addthe archivo de Excel en Fuentes ODBC (de panel de control-> Herramientas administrativas) y luego ejecutar el código:

// 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

Esta solución única de Windows no puede recomendarse. –

7

PDI debe ser capaz de abrir ambos archivos xls protegidas (utilizando org.apache.poi .hssf.record.crypt) y archivos xlsx protegidos (usando org.apache.poi.poifs.crypt). ¿Has probado esto?

Si está utilizando HSSF (para un archivo xls), debe establecer la contraseña antes de abrir el archivo. Haga esto con una llamada a:

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

Después de eso, HSSF debería poder abrir su archivo.

Para XSSF, usted quiere algo como:

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)); 

Todos los detalles se dan en el POI Encryption documentation page

+0

Esto parece más correcto para POI. EncryptionInfo se introdujo en POI en v3.7 o v3.8 –

+0

cómo configurar la contraseña en el archivo de Excel sin protección? ¿Hay algún método en este paquete org.apache.poi.hssf.record.crypto.Biff8EncryptionKey – happy

+0

Creo que necesitas usar 'Decryptor d = Decryptor.getInstance (info);' en su lugar en la línea # 3 – Yar

1

traté de establecer una contraseña para el archivo de Excel desde Java Script, este script sólo funcionará en IE y Excel get debe instalarse en el sistema del cliente.

<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> 
Cuestiones relacionadas