Создайте защищенный паролем файл excel с помощью apache poi?
Я разрабатываю простую программу Java для создания файла excel с использованием (Apache POI) API.
Я использую oracle 10g в качестве базы данных и использую банку ojdbc14.
У меня есть таблица под названием USERINFO, имеющая 3 столбца, а именно USERNAME,PASSWORD , NAME.
Теперь, используя APACHE POI
, я смог поместить все строки в файл excel.
Поскольку файл содержит конфиденциальные данные, такие как имя пользователя и пароль, я хочу сделать его защищенным паролем.
На форумах я нашел, как читать файлы с защитой паролем, но не как их создавать.
Итак, как я могу это достичь?
Спасибо заранее.
Ответы
Ответ 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 обычно поддерживает функции электронной таблицы и добавляет данные.
Я не пробовал это для паролей, но я подозреваю, что это стоит эксперимента.
Подробнее см. руководство разработчика по занятостям.