1.


はじめに

このチュートリアルでは、Excelスプレッドシートを扱うための** Apache POIおよびJExcel APIの使用方法を説明します。

どちらのライブラリも、Excelスプレッドシートの内容の動的な読み取り、書き込み、および変更に使用でき、Microsoft ExcelをJavaアプリケーションに統合する効果的な方法を提供します。


2 Mavenの依存関係

まず、

pom.xml

ファイルに次の依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.15</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.15</version>
</dependency>


poi-ooxml

の最新バージョン]とhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.jxls%22%20AND%20a%3A%22jxls-jexcel%22[jxls-jexcel]をダウンロードできますMaven Centralから。

** 3アパッチPOI

**

  • Apache POIライブラリは、

    .xls

    ファイルと

    .xlsx

    ファイルの両方をサポートしており、Excelファイルを操作するための他のJavaライブラリよりも複雑なライブラリです。


Excel

ファイルをモデル化するための

Workbook

インターフェイス、およびExcelファイルの要素をモデル化する

Sheet



Row

、および

Cell

インターフェイス、ならびに両方のファイル形式の各インターフェイスの実装を提供します。

新しい

.xlsx

ファイル形式で作業するときは、

XSSFWorkbook、XSSFSheet、XSSFRow、およびXSSFCell

クラス

__.

__を使用します。

古い

.xls

形式を扱うには、

HSSFWorkbook、HSSFSheet、HSSFRow、

、および

HSSFCell

の各クラスを使用します。


3.1. Excelからの読み取り


.xlsx

ファイルを開き、ファイルの最初のシートからコンテンツを読み取るメソッドを作成しましょう。

セルの内容を読み取る方法は、セル内のデータの種類によって異なります。セルコンテンツのタイプは、

Cell

インターフェースの__getCellTypeEnum()メソッドを使用して判別できます。

まず、特定の場所からファイルを開きましょう。

FileInputStream file = new FileInputStream(new File(fileLocation));
Workbook workbook = new XSSFWorkbook(file);

次に、ファイルの最初のシートを取得して各行を繰り返します。

Sheet sheet = workbook.getSheetAt(0);

Map<Integer, List<String>> data = new HashMap<>();
int i = 0;
for (Row row : sheet) {
    data.put(i, new ArrayList<String>());
    for (Cell cell : row) {
        switch (cell.getCellTypeEnum()) {
            case STRING: ... break;
            case NUMERIC: ... break;
            case BOOLEAN: ... break;
            case FORMULA: ... break;
            default: data.get(new Integer(i)).add(" ");
        }
    }
    i++;
}

  • Apache POIはそれぞれの種類のデータを読み込む方法が異なります。** 上記の各スイッチケースの内容を詳しく見てみましょう。

セルタイプのenum値が

STRING

の場合、コンテンツは

Cell

インターフェースの

getRichStringCellValue()

メソッドを使用して読み込まれます。

data.get(new Integer(i)).add(cell.getRichStringCellValue().getString());


NUMERIC

コンテンツタイプを持つセルは、日付または数値のいずれかを含むことができ、以下の方法で読み込まれます。

if (DateUtil.isCellDateFormatted(cell)) {
    data.get(i).add(cell.getDateCellValue() + "");
} else {
    data.get(i).add(cell.getNumericCellValue() + "");
}


BOOLEAN

値には、

getBooleanCellValue()

メソッドがあります。

data.get(i).add(cell.getBooleanCellValue() + "");

そして、セルタイプが

FORMULA

の場合、

getCellFormula()

メソッドを使用できます。

data.get(i).add(cell.getCellFormula() + "");

** 3.2. Excelへの書き込み

**

Apache POIは、前のセクションで説明したのと同じインターフェースを使用してExcelファイルに書き込みを行い、JExcelよりもスタイルのサポートが優れています。


“ Persons”

という名前のシートに人物のリストを書き込むメソッドを作成しましょう。まず、

“Name”



“Age”

のセルを含むヘッダー行を作成してスタイルを設定します。

Workbook workbook = new XSSFWorkbook();

Sheet sheet = workbook.createSheet("Persons");
sheet.setColumnWidth(0, 6000);
sheet.setColumnWidth(1, 4000);

Row header = sheet.createRow(0);

CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.LIGHT__BLUE.getIndex());
headerStyle.setFillPattern(FillPatternType.SOLID__FOREGROUND);

XSSFFont font = ((XSSFWorkbook) workbook).createFont();
font.setFontName("Arial");
font.setFontHeightInPoints((short) 16);
font.setBold(true);
headerStyle.setFont(font);

Cell headerCell = header.createCell(0);
headerCell.setCellValue("Name");
headerCell.setCellStyle(headerStyle);

headerCell = header.createCell(1);
headerCell.setCellValue("Age");
headerCell.setCellStyle(headerStyle);

次に、テーブルの内容を異なるスタイルで書きましょう。

CellStyle style = workbook.createCellStyle();
style.setWrapText(true);

Row row = sheet.createRow(2);
Cell cell = row.createCell(0);
cell.setCellValue("John Smith");
cell.setCellStyle(style);

cell = row.createCell(1);
cell.setCellValue(20);
cell.setCellStyle(style);

最後に、現在のディレクトリの__temp.xlsxファイルにコンテンツを書き込み、ワークブックを閉じます。

File currDir = new File(".");
String path = currDir.getAbsolutePath();
String fileLocation = path.substring(0, path.length() - 1) + "temp.xlsx";

FileOutputStream outputStream = new FileOutputStream(fileLocation);
workbook.write(outputStream);
workbook.close();

内容を

temp.xlsx

ファイルに書き込み、次に同じファイルを読み取り、作成したテキストが含まれていることを確認する

JUnit

テストで上記のメソッドをテストしましょう。

public class ExcelTest {

    private ExcelPOIHelper excelPOIHelper;
    private static String FILE__NAME = "temp.xlsx";
    private String fileLocation;

    @Before
    public void generateExcelFile() throws IOException {
        File currDir = new File(".");
        String path = currDir.getAbsolutePath();
        fileLocation = path.substring(0, path.length() - 1) + FILE__NAME;

        excelPOIHelper = new ExcelPOIHelper();
        excelPOIHelper.writeExcel();
    }

    @Test
    public void whenParsingPOIExcelFile__thenCorrect() throws IOException {
        Map<Integer, List<String>> data
          = excelPOIHelper.readExcel(fileLocation);

        assertEquals("Name", data.get(0).get(0));
        assertEquals("Age", data.get(0).get(1));

        assertEquals("John Smith", data.get(1).get(0));
        assertEquals("20", data.get(1).get(1));
    }
}

** 4 JExcel

**

JExcelライブラリは、Apache POIよりも使いやすいという利点がありますが、

.xls

(1997-2003)形式のExcelファイルの処理しかサポートされていないという欠点があります。

  • 現時点では、

    .xlsx

    ファイルはサポートされていません。


4.1. Excelからの読み取り

Excelファイルを扱うために、このライブラリはExcelファイルのさまざまな部分を表す一連のクラスを提供します。


Workbook

クラスはシートのコレクション全体を表します


Sheet

クラスは単一のシートを表し、

Cell

クラスはスプレッドシートの単一のセルを表します。

指定したExcelファイルからワークブックを作成し、ファイルの最初のシートを取得してから、その内容を調べて各行を

HashMap

に追加するメソッドを作成します。

public class JExcelHelper {

    public Map<Integer, List<String>> readJExcel(String fileLocation)
      throws IOException, BiffException {

        Map<Integer, List<String>> data = new HashMap<>();

        Workbook workbook = Workbook.getWorkbook(new File(fileLocation));
        Sheet sheet = workbook.getSheet(0);
        int rows = sheet.getRows();
        int columns = sheet.getColumns();

        for (int i = 0; i < rows; i++) {
            data.put(i, new ArrayList<String>());
            for (int j = 0; j < columns; j++) {
                data.get(i)
                  .add(sheet.getCell(j, i)
                  .getContents());
            }
        }
        return data;
    }
}

** 4.2. Excelへの書き込み

**

Excelファイルに書き込むために、JExcelライブラリはスプレッドシートファイルをモデル化する上記で使用されたものと同様のクラスを提供します。


WritableWorkbook



WritableSheet

、および

WritableCell


  • WritableCell

    クラスには、記述可能なさまざまな種類のコンテンツに対応するサブクラスがあります。**

    Label



    DateTime



    Number



    Boolean



    Blank

    、および

    Formula

このライブラリは、フォント、色、セル幅の制御など、基本的なフォーマットもサポートしています。

現在のディレクトリに__temp.xlsというワークブックを作成し、次にApache POIセクションで書いたのと同じコンテンツを書き込むメソッドを書きましょう。

まず、ワークブックを作成しましょう。

File currDir = new File(".");
String path = currDir.getAbsolutePath();
String fileLocation = path.substring(0, path.length() - 1) + "temp.xls";

WritableWorkbook workbook = Workbook.createWorkbook(new File(fileLocation));

次に、最初のシートを作成し、

“Name”



“Age”

のセルを含むExcelファイルのヘッダーを書きましょう。

WritableSheet sheet = workbook.createSheet("Sheet 1", 0);

WritableCellFormat headerFormat = new WritableCellFormat();
WritableFont font
  = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD);
headerFormat.setFont(font);
headerFormat.setBackground(Colour.LIGHT__BLUE);
headerFormat.setWrap(true);

Label headerLabel = new Label(0, 0, "Name", headerFormat);
sheet.setColumnView(0, 60);
sheet.addCell(headerLabel);

headerLabel = new Label(1, 0, "Age", headerFormat);
sheet.setColumnView(0, 40);
sheet.addCell(headerLabel);

新しいスタイルで、作成したテーブルの内容を書きましょう。

WritableCellFormat cellFormat = new WritableCellFormat();
cellFormat.setWrap(true);

Label cellLabel = new Label(0, 2, "John Smith", cellFormat);
sheet.addCell(cellLabel);
Number cellNumber = new Number(1, 2, 20, cellFormat);
sheet.addCell(cellNumber);


Workbook

クラスの

write()

メソッドおよび

close()

メソッドを使用して、他のプロセスでも使用できるように、ファイルに書き込んで最後に閉じることを忘れないでください。

workbook.write();
workbook.close();


5.


結論

このチュートリアルでは、

Apache POI

APIと

JExcel

APIを使用してJavaプログラムからExcelファイルを読み書きする方法を説明しました。

この記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/apache-poi[GitHubプロジェクト]にあります。