我有一个受密码保护的Excel电子表格。我需要打开此电子表格并从中读取数据。我一直试图使用POI API无济于事。 Java解决方案将是首选,但任何想法都会有所帮助。
编辑:是的,我有密码。该文件在excel中受密码保护;必须输入密码才能查看电子表格。
Edit2:我无法使用POI用密码打开它,我正在寻找替代解决方案。
答案 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));
答案 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();
当然,您需要导入必要的类并捕获必要的异常。