JavaでExcelをWordに変換する方法

Microsoft Excelは大量のデータを保存するために、Microsoft Wordはリッチテキスト文書を作成するために広く使用されています。あなたがWord文書に書式付きテキスト、画像、および他の要素を挿入するために、Word文書にExcelワークブックの情報を追加する必要があることがありますオケージョン。この記事では、無料の [Free Spire.Office for Java](https://www.e-iceblue.cn/Introduce/Free-Spire-Office-JAVA.html) の助けを借りて、Javaアプリケーションで**ExcelワークブックをWord文書形式に変換する方法**を学びます。

- **[ExcelをPDFに変換し、そのPDFをWordに変換する](#excelをpdfに変換しそのpdfをwordに変換する)**
- **[ExcelをHTMLに変換し、そのHTMLをWordに変換する](#excelをhtmlに変換しそのhtmlをwordに変換する)**
- **[Excelのワークシート上のすべてのデータを抽出し、それらをWordに追加する](#excelのワークシート上のすべてのデータを抽出しそれらをwordに追加する)**

## 【依存関係の追加】

> **この方法は、無料のFree Spire.Office 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.office.free</artifactId>
        <version>5.3.1</version>
    </dependency>
</dependencies>
```

### 2. 公式サイトよりJarファイルをダウンロード
まず、[Free Spire.Doc for Java](https://www.e-iceblue.cn/Downloads/Free-Spire-Office-JAVA.html) の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Doc.jarファイルを依存関係としてプロジェクトにインポートしてください。

## ExcelをPDFに変換し、そのPDFをWordに変換する
Spire.Officeを使って、Excelワークブック全体をPDFに変換し、そのPDFをWord文書として保存することができます。このように、ExcelからWordへの変換は数行のコードで済みます。

> **詳細な手順は以下の通りです。**

- **Workbook** クラスオブジェクトを作成し、**Workbook.loadFromFile()** メソッドでExcelドキュメントを読み込みます。
- **Workbook.getConverterSetting()** メソッドが返す **ConverterSetting** クラスの下のメソッドを使用して、ExcelワークブックをPDFに変換するオプションを設定します。
- **Workbook.saveToFile()** メソッドを使用して、Excelワークブック全体をPDFに変換します。
- **PdfDocument** クラスのオブジェクトを作成し、**PdfDocument.loadFromFile()** メソッドを使って変換されたPDFファイルを読み込みます。
- **PdfDocument.saveToFile()** メソッドを使用して、PDFファイルをWordドキュメントに変換します。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.xls.*;

import java.nio.file.Files;
import java.nio.file.Path;

public class convertExcelToWord {

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

        //Workbookクラスのインスタンスを作成し、Excelワークブックを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("在庫・受注情報.xlsx");

        //ExcelからPDFへの変換オプションを設定する
        workbook.getConverterSetting().setSheetFitToPage(true);

        //ExcelワークブックをPDF文書に保存する
        String path = "PDF.pdf";
        workbook.saveToFile(path, com.spire.xls.FileFormat.PDF);

        //PdfDocumentクラスのインスタンスを作成し、変換されたPDF文書を読み込む
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile(path);

        //PDF文書をWord文書に保存する
        pdf.saveToFile("ExcelからWordへの変換.docx", com.spire.pdf.FileFormat.DOCX);
        Files.delete(Path.of(path));
    }
}
```

### 【変換されたWord文書】

![ExcelをPDFに変換し、そのPDFをWordに変換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b1c04021-2fd7-7a92-a6bc-824c176d4ea8.png)

## ExcelをHTMLに変換し、そのHTMLをWordに変換する
また、Spire.Officeを使用して、特定のExcelワークシートをHTMLファイルに変換し、このHTMLファイルをWord文書として保存することも可能です。

> **以下は、その詳細な手順です。**

- **Workbook** クラスのオブジェクトを作成し、**Workbook.loadFromFile()** メソッドでExcelファイルを読み込む。
- **Workbook.getWorksheets().get()** メソッドで、特定のワークシートを取得します。
- ExcelからHTMLへの変換オプションを設定します。
- **Worksheet.saveToHtml()** メソッドを使用して、ExcelファイルをHTMLファイルに保存します。
- **Document** クラスのインスタンスを作成し、**Document.loadFromFile()** メソッドで変換されたHTMLを読み込みます。
- **Document.saveToFile()** メソッドを使用してWord文書を保存します。

**Java**

```Java
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.documents.XHTMLValidationType;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

import java.nio.file.Files;
import java.nio.file.Path;

public class convertExcelToWord {

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

        //Workbookクラスのインスタンスを作成し、Excelワークブックを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("在庫・受注情報.xlsx");

        //最初のワークシートを取得する
        Worksheet worksheet = workbook.getWorksheets().get(0);

        //ExcelからHTMLへの変換オプションを設定する
        worksheet.getAllocatedRange().autoFitColumns();
        worksheet.getAllocatedRange().autoFitRows();

        //ExcelワークシートをHTMLに保存する
        String path = "HTML.html";
        worksheet.saveToHtml(path);

        //Documentクラスのインスタンスを作成し、変換されたHTMLファイルを読み込む
        Document document = new Document();
        document.loadFromFile(path, FileFormat.Html, XHTMLValidationType.None);

        //HTMLファイルをWordドキュメントに保存する
        document.saveToFile("ExcelからWordへの変換2.docx",FileFormat.Docx_2013);
        Files.delete(Path.of(path));
    }
}
```

### 【変換されたWord文書】

![ExcelをHTMLに変換し、そのHTMLをWordに変換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/cda269a0-c68b-df3c-b38d-f8f366192cea.png)

## Excelのワークシート上のすべてのデータを抽出し、それらをWordに追加する
Spire.Officeを使用して、Excelワークブック上のデータ、画像、スタイルをすべてExtractし、すべての要素をワードテーブルに追加することができます。

> 詳細は以下の通りです。

- **Workbook** クラスオブジェクトを作成し、**Workbook.loadFromFile()** メソッドでExcelファイルを読み込みます。
- **Workbook.getWorksheets().get()** メソッドで特定のワークシートを取得する。
- **Document** オブジェクトを作成し、それにセクションを追加します。
- **Section.addTable()** メソッドで表を追加します。
- **ExcelPicture.getPicture()** メソッドでExcelから画像を取り出し、画像の高さと幅を取得します。
- Wordの表のセルに画像を追加し、画像の幅と高さを設定します。
- ワークシート内のマージされたセルを検出し、カスタムメソッド **mergeCells()** を使用してワードテールの対応するセルをマージします。
- **CellRange.getValue()** メソッドを使用して特定のExcelセルの値を取得し、**TableCell.addParagraph().appendText()** メソッドを使用してWordの表のセルにそれを追加します。
- カスタムメソッド **copyStyle()** を使用して、ExcelからWordの表にフォントスタイルとセルスタイルをコピーします。
- **Document.saveToFile()** メソッドでドキュメントを保存します。

**Java**

```Java
import com.spire.doc.*;
import com.spire.doc.FileFormat;
import com.spire.doc.documents.HorizontalAlignment;
import com.spire.doc.documents.PageOrientation;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.VerticalAlignment;
import com.spire.doc.fields.DocPicture;
import com.spire.doc.fields.TextRange;
import com.spire.xls.*;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;

public class convertExcelToWord {

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

        //Workbookクラスのインスタンスを作成し、Excelワークブックを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("在庫・受注情報1.xlsx");

        //最初のワークシートを取得する
        Worksheet sheet = workbook.getWorksheets().get(0);

        //Documentクラスのインスタンスを作成し、それにセクションを追加する
        Document doc = new Document();
        Section section = doc.addSection();
        section.getPageSetup().setOrientation(PageOrientation.Landscape);

        //文書に表を追加する
        Table table = section.addTable(true);
        table.resetCells(sheet.getLastRow(), sheet.getLastColumn());

        //セルをマージする
        mergeCells(sheet, table);

        for (int r = 1; r <= sheet.getLastRow(); r++) {

            //行の高さを設定する
            table.getRows().get(r - 1).setHeight((float) sheet.getRowHeight(r));

            for (int c = 1; c <= sheet.getLastColumn(); c++) {
                CellRange xCell = sheet.getCellRange(r, c);
                TableCell wCell = table.get(r - 1, c - 1);

                //ワークシートセルの値を取得し、Wordの表のセルに追加する
                TextRange textRange = wCell.addParagraph().appendText(xCell.getValue());

                //ExcelからWordへフォントとセルスタイルをコピーする
                copyStyle(textRange, xCell, wCell);
            }
        }

        //Excelから画像を抽出する
        ExcelPicture pic = sheet.getPictures().get(0);
        BufferedImage loImage = pic.getPicture();
        ImageIO.write(loImage,"png",new File("画像.png"));

        //画像を読み込み、その幅と高さを取得する
        File file = new File("画像.png");
        FileInputStream inputStream = new FileInputStream(file);
        BufferedImage image = ImageIO.read(file);
        int width= image.getWidth();
        int height = image.getHeight();

        //ワードテーブルのセルに画像を追加し、幅と高さを設定する
        Paragraph paragraph = table.getRows().get(0).getCells().get(0).getParagraphs().get(0);
        DocPicture picture = paragraph.appendPicture(inputStream);
        picture.setWidth(width);
        picture.setHeight(height);

        //ドキュメントを保存する
        doc.saveToFile("ExcelからWordへの変換3.docx", FileFormat.Docx);
    }

    //セルをマージするカスタムメソッドを作成する
    private static void mergeCells(Worksheet sheet, Table table) {
        if (sheet.hasMergedCells()) {

            //Excelからマージされたセル範囲を取得する
            CellRange[] ranges = sheet.getMergedCells();
            for (int i = 0; i < ranges.length; i++) {
                int startRow = ranges[i].getRow();
                int startColumn = ranges[i].getColumn();
                int rowCount = ranges[i].getRowCount();
                int columnCount = ranges[i].getColumnCount();

                //Wordの表で対応するセルを結合する
                if (rowCount > 1 && columnCount > 1) {
                    for (int j = startRow; j <= startRow + rowCount ; j++) {
                        table.applyHorizontalMerge(j - 1, startColumn - 1, startColumn - 1 + columnCount - 1);
                    }
                    table.applyVerticalMerge(startColumn - 1, startRow - 1, startRow - 1 + rowCount - 1 );
                }
                if (rowCount > 1 && columnCount == 1 ) {
                    table.applyVerticalMerge(startColumn - 1, startRow - 1, startRow - 1 + rowCount - 1);
                }
                if (columnCount > 1 && rowCount == 1 ) {
                    table.applyHorizontalMerge(startRow - 1, startColumn - 1,  startColumn - 1 + columnCount-1);
                }
            }
        }
    }

    //ExcelのセルスタイルをWordの表にコピーするカスタムメソッドを作成する
    private static void copyStyle(TextRange wTextRange, CellRange xCell, TableCell wCell) {

        //フォントスタイルをコピーする
        wTextRange.getCharacterFormat().setTextColor(xCell.getStyle().getFont().getColor());
        wTextRange.getCharacterFormat().setFontSize((float) xCell.getStyle().getFont().getSize());
        wTextRange.getCharacterFormat().setFontName(xCell.getStyle().getFont().getFontName());
        wTextRange.getCharacterFormat().setBold(xCell.getStyle().getFont().isBold());
        wTextRange.getCharacterFormat().setItalic(xCell.getStyle().getFont().isItalic());

        //背景色をコピーする
        wCell.getCellFormat().setBackColor(xCell.getStyle().getColor());

        //水平方向の配置をコピーする
        switch (xCell.getHorizontalAlignment()) {
            case Left:
                wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Left);
                break;
            case Center:
                wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
                break;
            case Right:
                wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Right);
                break;
        }

        //垂直方向の配置をコピーする
        switch (xCell.getVerticalAlignment()) {
            case Bottom:
                wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Bottom);
                break;
            case Center:
                wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
                break;
            case Top:
                wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Top);
                break;
        }
    }
}
```

### 【変換されたWord文書】

![Excelのワークシート上のすべてのデータを抽出し、それらをWordに追加する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/dfb59687-e34e-2180-bfd6-2307f36defa7.png)

> **この記事を読むと、ExcelワークブックをWord文書に変換する方法を知ることができます。あなたはまだいくつかの問題があるか、またはExcelのワークブックを変換する方法についてもっと知りたい場合は、[Spire.XLS Forum](https://www.e-iceblue.com/forum/spire-xls-f4.html)に移動してください。**