概要
WEB上で処理結果をExcelファイルに保存したファイルにパスワードを設定するツール作成のメモです。
事前準備
以下の開発環境を用意します。
■開発環境及びライブラリ準備
・JDK最新バージョン:java version "20" 2023-03-21
https://download.oracle.com/java/20/latest/jdk-20_windows-x64_bin.exe
・ECLIPSE
https://mergedoc.osdn.jp/
・POIライブラリ
https://archive.apache.org/dist/poi/release/bin/
※必要なライブラリは以下のものです。
ソースコード
以下のソースを作成します。
package SetPasswordExcel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SetPassword {
public static void main(String[] args) {
try {
if(args.length!=3) {
System.out.println("引数を3つ指定してください。");
System.out.println("例) java -jar SetPassword.jar [inputfile] [outputfile] [password]");
}
File inFile = new File(args[0]);
String infileName = inFile.getName();
String inext = infileName.substring(infileName.lastIndexOf(".") + 1);
File outFile = new File(args[1]);
String outfileName = outFile.getName();
String outext = outfileName.substring(outfileName.lastIndexOf(".") + 1);
if(inext.equals("xlsx")) {
try(POIFSFileSystem fs = new POIFSFileSystem()) {
EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
Encryptor encryptor = info.getEncryptor();
encryptor.confirmPassword(args[2]);
try(OPCPackage opc = OPCPackage.open(inFile, PackageAccess.READ_WRITE);
OutputStream os = encryptor.getDataStream(fs)){
opc.save(os);
}
try(FileOutputStream fos = new FileOutputStream(args[1])){
fs.writeFilesystem(fos);
}
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("Protected Excel(.xlsx) file has been created successfully.");
}
if(inext.equals("xls")) {
try {
FileInputStream fi = null;
HSSFWorkbook wb = null;
fi = new FileInputStream(args[0]);
Biff8EncryptionKey.setCurrentUserPassword(args[2]);
wb = new HSSFWorkbook(fi);
wb.writeProtectWorkbook(args[2], "");
wb.write(new FileOutputStream(args[1]));
wb.close();
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("Protected Excel(.xls) file has been created successfully.");
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
JARファイル作成
以下の手順でJARファイルを作成します。
④完了ボタンを押下
JARファイルが作成されます。
※起動構成及びメインクラスが正しく指定がされていない場合、JARファイルが正常に実行されないです。
JARファイル
以下のディレクトリを確認します。JARファイルが作成されています。
Excelファイルを作成
適当にExcelファイルにコメントを入れてファイルを保存します。
JARファイルを実行
以下のコマンドをプロンプト画面で実行します。
■コマンド
java -jar SetPassword.jar 20230426.xlsx 20230426_pwd.xlsx Passw0rd
■正しく実行されない場合
C:\workspace>java -jar SetPassword.jar 20230426.xlsx 20230426_pwd.xlsx Passw0rd
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<clinit>(POIFSFileSystem.java:68)
at SetPasswordExcel.SetPassword.main(SetPassword.java:35)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 2 more
④もう一度エクスポートメニューを押下して再度JARファイルを作成
■正しく実行された場合
C:\workspace>java -jar SetPassword.jar 20230426.xlsx 20230426_pwd.xlsx Passw0rd
Protected Excel(.xlsx) file has been created successfully.
■パスワード付きのファイルを確認
①下記のパスに作成されたファイルを開きます。
③コマンドで指定したパスワードを指定しますと内容が正しく表示されます。
その他
今回のソースにはExcel2003ファイル形式もパスワード設定が可能です。
次のコマンドを実行してみたら正常にパスワード付きのファイルが作成されます。
C:\workspace>java -jar SetPassword.jar 20230426.xls 20230426_pwd.xls Passw0rd
Protected Excel(.xls) file has been created successfully.
終わりに
元々はPythonで実現してみたかったですが、その場合は、Windows環境じゃないとダメでしたので、Linux上でのことを考えてJAVAでパスワード付きのファイル作成はできないかと思ってネットのものを参考して作成ができました。
元々参照していたサイトのメモができなかったですが、後で追記致します。
ではまた!!!!