Как я могу получить доступ к защищенной паролем книге Excel в Java с помощью API POI - PullRequest
11 голосов
/ 15 июня 2010

Я хочу читать и писать в защищенные паролем файлы Excel.Как я могу сделать это, используя Apache POI API.

Ответы [ 6 ]

14 голосов
/ 28 апреля 2011

POI должен иметь возможность открывать как защищенные файлы xls (используя org.apache.poi.hssf.record.crypt ), так и защищенные файлы xlsx (используя org.apache.poi.poifs. крипты ). Вы пробовали это?

Если вы используете 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 = new Decryptor(info);
d.verifyPassword(Decryptor.DEFAULT_PASSWORD);
XSSFWorkbook wb = new XSSFWorkbook(d.getDataStream(fs));

.

Альтернативно, в более новых версиях Apache POI WorkbookFactory поддерживает ввод пароля при открытии , поэтому вы можете просто сделать что-то вроде:

Workbook wb = WorkbookFactory.create(new File("protected.xls"), "password"));

Это будет работать как для HSSF, так и для XSSF, выбирая правильный пароль в зависимости от формата и передавая заданный пароль соответствующим образом для формата.

2 голосов
/ 11 апреля 2016

Официальная ссылка на документацию подробно описывает возможности шифрования и дешифрования f для xls, xlsx и других поддерживаемых форматов: http://poi.apache.org/encryption.html

т.е. В случае Binary Formats (xls):

// XOR/RC4 decryption for xls
Biff8EncryptionKey.setCurrentUserPassword("pass");
NPOIFSFileSystem fs = new NPOIFSFileSystem(new File("file.xls"), true);
HSSFWorkbook hwb = new HSSFWorkbook(fs.getRoot(), true);
Biff8EncryptionKey.setCurrentUserPassword(null);

Для форматов на основе XML (xlsx):

EncryptionInfo info = new EncryptionInfo(filesystem);
Decryptor d = Decryptor.getInstance(info);

try {
    if (!d.verifyPassword(password)) {
        throw new RuntimeException("Unable to process: document is encrypted");
    }

    InputStream dataStream = d.getDataStream(filesystem);

    // parse dataStream

} catch (GeneralSecurityException ex) {
    throw new RuntimeException("Unable to process encrypted document", ex);
}
2 голосов
/ 23 июня 2014

КОД:

FileInputStream fileInput = new FileInputStream("2.xls");         
BufferedInputStream bufferInput = new BufferedInputStream(fileInput);            
POIFSFileSystem poiFileSystem = new POIFSFileSystem(bufferInput);            
Biff8EncryptionKey.setCurrentUserPassword("test"); 
HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem, true); 

используемые банки:

  • commons-codec-1.5.jar
  • commons-logging-1.1.jar
  • dom4j-1.6.jar
  • jsr173_1.0_api.jar
  • junit-4.11.jar
  • log4j-1.2.13.jar
  • poi-3.10-FINAL-20140208.jar
  • poi-excelant-3.10-FINAL-20140208.jar
  • poi-ooxml-3.10-FINAL-20140208.jar
  • poi-ooxml-schemas-3.10-FINAL-20140208.jar
  • resolver.jar
  • xbean.jar
  • xbean_xpath.jar
  • xmlbeans-qname.jar
  • xmlpublic.jar
2 голосов
/ 05 января 2011

Если вся книга защищена паролем (через меню Excel Файл> Сохранить как ...> Инструменты> Общие параметры ... , затем введите пароль), тогда файл зашифрован и выне может читать и писать в книгу через POI.

Excel Save As... General Options

1 голос
/ 14 августа 2012

Apache POI - хороший API для обработки Excel.Но POI API предоставляет только возможность читать защищенные паролем файлы Excel.Нет опции для записи файла Excel с помощью pasword.

Создать защищенный паролем файл Excel с помощью apache poi?

Проверьте эту тему, чтобы узнать больше о Excel, защищенном паролем.

0 голосов
/ 03 июня 2014
try 
{
    InputStream is = new FileInputStream("myfile.xlsx"); 
    POIFSFileSystem pfs = new POIFSFileSystem(is);

    EncryptionInfo info = new EncryptionInfo(pfs);
    Decryptor d = Decryptor.getInstance(info);

    if (!d.verifyPassword("passwordForFile")) 
    {
        System.out.println("Incorrect password!");
    }
    else 
    {
        System.out.println("Correct password!");

        //InputStream dataStream = d.getDataStream(pfs);

        // parse dataStream
    }
}
catch (Exception ex) 
{
    throw new RuntimeException("Unable to process encrypted document", ex);
}
...