5

パスワードで保護された Excel スプレッドシートがあります。このスプレッドシートを開いてデータを読み取る必要があります。POI API を使用しようとしても無駄です。Java ソリューションが望ましいですが、どんなアイデアでも役に立ちます。

編集:はい、パスワードを持っています。ファイルは Excel でパスワード保護されています。スプレッドシートを表示するには、パスワードを入力する必要があります。

Edit2:パスワードを使用して POI で開くことができません。別の解決策を探しています。

4

4 に答える 4

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 暗号化のドキュメント ページを参照してください。

于 2011-04-28T01:26:51.883 に答える
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>
于 2012-05-24T13:59:53.517 に答える
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 ;
}
于 2010-04-09T17:27:20.677 に答える
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();

もちろん、必要なクラスをインポートし、必要な例外をキャッチする必要があります。

于 2010-04-09T17:18:49.723 に答える