0
1

More than 1 year has passed since last update.

パスワード付きのExcelファイル作成ツール(JAVA)

Last updated at Posted at 2023-04-26

概要

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/
※必要なライブラリは以下のものです。
image.png

ソースコード

以下のソースを作成します。

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();
        }
    }
}

■下記の画面でプロジェクト名およびメインクラスを指定
image.png

■依存関係のライブラリを確認
image.png

JARファイル作成

以下の手順でJARファイルを作成します。

①エクスポートメニューを押下
image.png

②実行可能JARファイルを選択と「次へ」ボタンを押下
image.png

③起動構成を選択とエクスポート先を指定
image.png

④完了ボタンを押下
JARファイルが作成されます。
※起動構成及びメインクラスが正しく指定がされていない場合、JARファイルが正常に実行されないです。
image.png

image.png

警告は表示されますが、一旦これで完了です。
image.png

JARファイル

以下のディレクトリを確認します。JARファイルが作成されています。
image.png

Excelファイルを作成

適当にExcelファイルにコメントを入れてファイルを保存します。
image.png

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

①下記の画面で実行構成を押下
image.png

②新規構成を押下
image.png

③名前、プロジェクト、メインクラスを選択
image.png
image.png

④もう一度エクスポートメニューを押下して再度JARファイルを作成
image.png

■正しく実行された場合

C:\workspace>java -jar SetPassword.jar 20230426.xlsx 20230426_pwd.xlsx Passw0rd
Protected Excel(.xlsx) file has been created successfully.

■パスワード付きのファイルを確認
①下記のパスに作成されたファイルを開きます。
image.png

②次のようにパスワードを聞かれる画面が表示されます。
image.png

③コマンドで指定したパスワードを指定しますと内容が正しく表示されます。
image.png

その他

今回のソースには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でパスワード付きのファイル作成はできないかと思ってネットのものを参考して作成ができました。
元々参照していたサイトのメモができなかったですが、後で追記致します。
ではまた!!!!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1