Создать защищенный паролем файл Excel, используя Apache POI? - PullRequest
13 голосов
/ 11 января 2012

Я занимаюсь разработкой простой Java-программы для создания файла Excel с использованием API (Apache POI). Я использую Oracle 10g в качестве базы данных и использую JAR-файл ojdbc14.

У меня есть таблица с именем USERINFO, имеющая три столбца, а именно USERNAME, PASSWORD и NAME. Теперь, используя Apache POI, я смог поместить все строки в файл Excel.

Поскольку файл содержит конфиденциальные данные, такие как имя пользователя и пароль, я хочу защитить его паролем. На форумах я нашел, как читать защищенные паролем файлы, но не как их создавать. Так как же мне этого добиться?

Ответы [ 3 ]

15 голосов
/ 24 января 2012

Обновлено: Начиная с версии 3.10 POI поддерживает шифрование, а также дешифрование файлов XLSX.См. страницу «Поддержка шифрования» на веб-сайте POI .Ниже все еще актуально для двоичных книг XLS.

Согласно странице «Поддержка шифрования» на сайте POI POI поддерживает чтение зашифрованных файлов XLS и XLSX.Шифрование не упоминается на этой странице, что означает, что оно не поддерживается.Это подтверждается поиском на сайте POI слова «encrypt» , которое возвращает лишь несколько результатов, все из которых касаются дешифрования.Я также взглянул на источники для их криптографической реализации, которая, кажется, обрабатывает только дешифрование.Это не удивительно;POI предназначен для извлечения данных и индексации поиска, а не для создания новых электронных таблиц.

Как уже предлагали другие, часто можно обойти отсутствующие функции в POI, создав шаблон в Excel, а затем используя POI для его заполнения.с данными.К сожалению, это не сработает для шифрования, потому что формат файлов зашифрованных электронных таблиц радикально отличается.

Если вы готовы платить за коммерческое программное обеспечение, последняя версия ExtenXLS имеет полную поддержку чтения и записи для всех форматов шифрования, поддерживаемых Excel.Просто создайте EncryptedWorkBookHandle вместо обычного WorkBookHandle.При этом будет использоваться максимально надежный шифр, поддерживаемый неизмененным JRE, RC4 для XLS и 128-битный AES для XLSX.Если вы хотите использовать 256-битный AES с OOXML и установили неограниченную политику JCE , вы можете сделать это с классом MSOfficeEncrypter.

JExcelAPI популярный API Java-таблиц с открытым исходным кодом вообще не поддерживает шифрование. Aspose.Cells , коммерческое предложение, поддерживает шифрование Stong .Документация для электронной таблицы Actuate, кажется, исчезла из сети, поэтому я не могу сказать, поддерживает ли она шифрование или нет.

Поскольку ни один из свободно доступных API Java-таблиц, кажется, не поддерживает написание зашифрованных электронных таблицЕсли вы не хотите использовать коммерческое программное обеспечение, вам нужно найти обходной путь.Вы можете, например, записать электронную таблицу в зашифрованный ZIP-файл.java.util.zip не поддерживает шифрование, но похоже, что Zip4j поддерживает.

Полное раскрытие информации : Я работаю в Extentech, компании, стоящей за ExtenXLS.

8 голосов
/ 13 ноября 2012

Создайте защищенный паролем файл Excel или используйте существующий шаблон и сделайте его защищенным паролем. Это даст пользователям доступ только для чтения. Вот пример, где у меня есть файл Excel с паролем «secret»:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;

public class ProtectedExcelFile {

    public static void main(final String... args) throws Exception {

        String fname = "C:\\Documents and Settings\\sadutta\\Desktop\\sample.xls";

        FileInputStream fileInput = null;
        BufferedInputStream bufferInput = null;
        POIFSFileSystem poiFileSystem = null;
        FileOutputStream fileOut = null;

        try {
            fileInput = new FileInputStream(fname);
            bufferInput = new BufferedInputStream(fileInput);
            poiFileSystem = new POIFSFileSystem(bufferInput);

            Biff8EncryptionKey.setCurrentUserPassword("secret");
            HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem, true);
            HSSFSheet sheet = workbook.getSheetAt(0);

            HSSFRow row = sheet.createRow(0);
            Cell cell = row.createCell(0);

            cell.setCellValue("THIS WORKS!");

            fileOut = new FileOutputStream(fname);
            workbook.writeProtectWorkbook(Biff8EncryptionKey.getCurrentUserPassword(), "");
            workbook.write(fileOut);
        }
        catch (Exception ex) {

            System.out.println(ex.getMessage());
        }
        finally {
            try {

                bufferInput.close();
            }
            catch (IOException ex) {

                System.out.println(ex.getMessage());
            }

            try {

                fileOut.close();
            }
            catch (IOException ex) {

                System.out.println(ex.getMessage());
            }
        }
    }
}

Точно так же вы сможете написать или изменить имеющийся шаблон. После того, как вы закончите, перезапишите шаблон. Если ваш шаблон должен использоваться много раз, вы можете скопировать шаблон в другое место, а затем использовать код для его изменения.

4 голосов
/ 11 января 2012

Я часто сталкиваюсь с POI, что для более сложной работы полезен подход к созданию электронной таблицы в Excel с расширенными функциями (например, макросами), а затем с помощью POI для чтения электронной таблицы, ее заполнения и записи.,POI обычно поддерживает функции электронной таблицы и добавляет данные.

Я не пробовал это для паролей, но подозреваю, что это стоит эксперимента.

См. занятое руководство разработчика для получения дополнительной информации.

...