Подтвердить что ты не робот

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

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

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

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

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

Полное раскрытие. Я работаю в компании Extentech, компании ExtenXLS.

Ответ 2

Это старый вопрос, но если кому-то еще это нужно -

Создайте защищенный паролем файл 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());     

              } 
        }       

    }
}

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

Ответ 3

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

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

Подробнее см. руководство разработчика по занятостям.