密码保护的Excel文件

时间:2010-04-09 16:52:29

标签: java excel apache-poi

我有一个受密码保护的Excel电子表格。我需要打开此电子表格并从中读取数据。我一直试图使用POI API无济于事。 Java解决方案将是首选,但任何想法都会有所帮助。

编辑:是的,我有密码。该文件在excel中受密码保护;必须输入密码才能查看电子表格。

Edit2:我无法使用POI用密码打开它,我正在寻找替代解决方案。

4 个答案:

答案 0 :(得分:7)

POI应该能够打开两个受保护的xls文件(使用 org.apache.poi.hssf.record.crypt )和受保护的xlsx文件(使用 org.apache.poi.poifs .crypt )。你试过这些吗?

如果您正在使用HSSF(对于xls文件),则需要在打开文件之前设置密码。您可以通过以下方式执行此操作:

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

之后,HSSF应该能够打开你的文件。

对于XSSF,您需要以下内容:

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

详细信息见POI Encryption documentation page

答案 1 :(得分:1)

在ODBC源中添加excel文件(从控制面板 - >管理工具),然后执行代码:

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

答案 2 :(得分:1)

我尝试从java脚本为excel文件设置密码,这个脚本只适用于IE,Excel应该安装在客户端系统中。

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

答案 3 :(得分:0)

您可以使用JExcelApi

我已经有一段时间了,所以我可能不会告诉你如何正确地做到这一点,但是肯定有一种方法可以使用JExcelApi来做到这一点。请尝试以下来源:

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

当然,您需要导入必要的类并捕获必要的异常。