JavaでExcelファイルを保護する方法

Excel ファイルは、個人の財務からビジネス記録まで、データの保存と整理に広く使用されています。Excelファイルの重要なデータの変更や共有を防ぐために、無料の[Free Spire.XLS for Java](https://jp.e-iceblue.com/introduce/free-spire-xls-for-java.html)はExcelファイルを保護するための多くの方法を提供しています。この記事では、Javaアプリケーションで**Excelファイルを保護する方法**を紹介します。
- **[Excelファイルを保護するためのパスワードを設定する](#excelファイルを保護するためのパスワードを設定する)**
- **[最終版としてマークする](#最終版としてマークする)**
- **[特定の保護タイプでExcelワークシートを保護する](#特定の保護タイプでexcelワークシートを保護する)**
- **[Excelに電子署名を追加する](#excelに電子署名を追加する)**
## 【依存関係の追加】
この方法は、無料のFree Spire.XLS for Javaが必要ですので、先にjarファイルをインポートしてください。
### 1. Maven
Maven を使用している場合、プロジェクトの pom.xml ファイルに以下のコードを追加することで、簡単にアプリケーションに JAR ファイルをインポートすることができます。
```XML
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```
### 2. 公式サイトよりJarファイルをダウンロード
まず、[Free Spire.XLS for Java](https://jp.e-iceblue.com/download/free-spire-excel-for-java.html)の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Xls.jarファイルを依存関係としてプロジェクトにインポートしてください。
## Excelファイルを保護するためのパスワードを設定する
Free Spire.XLS for java は、Excel ワークブックへのアクセスをパスワードで制限する **Workbook.protect()** メソッドを提供します。これにより、権限のないユーザーが正しいパスワードなしでファイルを開いたり変更したりすることを防ぎます。以下は、Free Spire.XLS for Javaを使用して、ワークブックをパスワードで保護する手順です。
- **Workbook** のオブジェクトを作成します。
- **Workbook.loadFromFile()** メソッドを使用して、Excel ファイルを読み込みます。
- **Workbook.protect()** メソッドを使用して、パスワードを使用してワークブックを保護します。
- **Workbook.saveToFile()** メソッドを使用して、ワークブックを保存します。

**Java**
```java
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;

public class passwordProtectWorkbook {
    public static void main(String[] args) throws Exception {

        //Workbookのオブジェクトを作成する
        Workbook workbook = new Workbook();

        //Excelファイルを読み込む
        workbook.loadFromFile("C:/売上請求書追跡.xlsx");

        //パスワードでワークブックを保護する
        workbook.protect("password");

        //ワークブックを保存する
        workbook.saveToFile("暗号化.xlsx", ExcelVersion.Version2016);
    }
}
```
![Excelファイルを保護するためのパスワードを設定する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6c51d131-a099-ae22-bf4f-6e2476e38b7e.png)

## 最終版としてマークする
最終版としてマークするコマンドは、Excelワークブックを読み取り専用にし、文書に変更を加えることを防ぎます。最終版としてマークされたExcelを共有すると、閲覧者にそのスプレッドシートは最終版であり、変更は不要であることを伝えることになります。
- **Workbook** のオブジェクトを作成します。
- **Workbook.loadFromFile()** メソッドを使用して、Excel ファイルを読み込みます。
- ドキュメントプロパティ**MarkAsFinal**を**true**に設定します。
- **Workbook.saveToFile()** メソッドを使用して、ワークブックを保存します。

**Java**
```java
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;

public class markAsFinal {
    public static void main(String[] args) throws Exception {

        //Workbookのオブジェクトを作成する
        Workbook workbook = new Workbook();

        //Excelファイルを読み込む
        workbook.loadFromFile("C:/売上請求書追跡.xlsx");

        //ドキュメントプロパティMarkAsFinalをtrueに設定する
        workbook.getCustomDocumentProperties().add("_MarkAsFinal", true);

        //ワークブックを保存する
        workbook.saveToFile("最終版.xlsx", ExcelVersion.Version2016);
    }
}
```
![最終版としてマークする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/9fdc2534-701f-3db5-1b58-7915983f4bf2.png)

## 特定の保護タイプでExcelワークシートを保護する
Excelファイルを読む許可は与えるが、ワークシート上で行える修正の種類は制限したい場合、特定の保護タイプでワークシートを保護することができます。以下はその手順です。
- **Workbook** のオブジェクトを作成します。
- **Workbook.loadFromFile()** メソッドを使用して、Excel ファイルを読み込みます。
- **Workbook.getWorksheets().get(index)** メソッドを使用して、特定のワークシートを取得します。
- **Worksheet.protect(String password, EnumSet.of options)** メソッドを使用して、保護タイプでワークシートを保護します。
- **Workbook.saveToFile()** メソッドを使用して、ワークブックを保存します。

**Java**
```java
import com.spire.xls.ExcelVersion;
import com.spire.xls.SheetProtectionType;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

import java.util.EnumSet;

public class protectWorksheet {
    public static void main(String[] args) throws Exception {

        //Workbookのオブジェクトを作成する
        Workbook workbook = new Workbook();
        workbook.loadFromFile("C:/売上請求書追跡.xlsx");

        //特定のワークシートを取得する
        Worksheet worksheet = workbook.getWorksheets().get(1);

        //ワークシートをパスワードで保護し、保護タイプを指定する
        worksheet.protect("psd-permission", EnumSet.of(SheetProtectionType.None));

        //ワークブックを保存する
        workbook.saveToFile("ワークシートの保護.xlsx", ExcelVersion.Version2016);
    }
}
```
![特定の保護タイプでExcelワークシートを保護する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/47c10437-8437-4e0e-0eb4-42f7e49f0ac4.png)

## Excelに電子署名を追加する
Excelファイルの真正性を確認するために、デジタル署名を追加することができます。電子署名を追加すると、ファイルは読み取り専用になり、それ以上の編集ができなくなります。誰かがファイルを変更した場合、デジタル署名は直ちに無効になります。
- **Workbook** のインスタンスを作成します。
- **Workbook.loadFromFile()** メソッドを使用して、Excelファイルを読み込みます。
- 指定された証明書（.pfx）ファイルのパスと.pfxファイルのパスワードで**CertificateAndPrivateKey**インスタンスを作成します。
- **Workbook.addDigitalSignature(CertificateAndPrivateKey, String, Date)** メソッドを使用して、ファイルに電子署名を追加します。
- **Workbook.saveToFile()** メソッドを使用して、結果ファイルを保存します。

**Java**
```java
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.digital.CertificateAndPrivateKey;
import java.util.Date;

public class addDigitalSignature {
    public static void main(String[] args) throws Exception {

        //Workbookのオブジェクトを作成する
        Workbook workbook = new Workbook();
        workbook.loadFromFile("C:/売上請求書追跡.xlsx");

        //ファイルに電子署名を付加する
        CertificateAndPrivateKey cap = new CertificateAndPrivateKey("C:/電子署名.pfx","e-iceblue");
        workbook.addDigitalSignature(cap, "e-iceblue",new Date());

        //結果ファイルを保存する
        workbook.saveToFile("電子署名の追加.xlsx", ExcelVersion.Version2013);
    }
}
```
![Excelに電子署名を追加する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6b83dafd-7c07-dbd1-7d6d-cca57013b4a5.png)

> **以上、Excelファイルを保護する方法について説明しました。より多くのExcelスキルを知りたい場合は[Spire.XLS for Java](https://www.e-iceblue.com/forum/spire-xls-f4.html)チュートリアルにアクセスしてください。**