1.概要

このチュートリアルでは、Excelスプレッドシートを操作するためのApachePOIおよびJExcelAPIの使用方法を示します。

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

2. Mavenの依存関係

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

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

poi-ooxmlおよびjxls-jexcelの最新バージョンはMavenCentralからダウンロードできます。

3. Apache POI

Apache POIライブラリは.xlsファイルと.xlsxファイルの両方をサポートし、Excelファイルを操作するための他のJavaライブラリよりも複雑なライブラリです。

Excelファイルをモデル化するためのWorkbookインターフェイスと、 Sheet Row Cellインターフェイスを提供します。 Excelファイルの要素と、両方のファイル形式の各インターフェイスの実装をモデル化します。

新しい.xlsxファイル形式で作業する場合は、 XSSFWorkbook XSSFSheet XSSFRowおよびXSSFCellクラスを使用します。

古い.xls形式を使用するには、 HSSFWorkbook HSSFSheet HSSFRow 、およびHSSFCellクラスを使用します。

3.1. Excelから読む

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

セルの内容を読み取る方法は、セル内のデータの種類によって異なります。 セルコンテンツのタイプは、 CellインターフェイスのgetCellType()メソッドを使用して決定できます。

まず、指定された場所からファイルを開きます。

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.getCellType()) {
            case STRING: ... break;
            case NUMERIC: ... break;
            case BOOLEAN: ... break;
            case FORMULA: ... break;
            default: data.get(new Integer(i)).add(" ");
        }
    }
    i++;
}

Apache POIには、各タイプのデータを読み取るためのさまざまな方法があります。上記の各スイッチケースの内容を拡張してみましょう。

セルタイプの列挙値が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();

JUnit テストで上記のメソッドをテストしてみましょう。このテストでは、コンテンツを temp.xlsx ファイルに書き込み、同じファイルを読み取って、書き込んだテキストが含まれていることを確認します。

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 ブール値空白および数式

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

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

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

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

次に、最初のシートを作成し、「名前」および「年齢」セルを含む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);

write()および close()メソッドを使用して、他のプロセスで使用できるように、ファイルに書き込み、最後に閉じることを忘れないでください。 ]ワークブッククラス:

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

5. 結論

この記事では、 Apache POIAPIおよびJExcel APIを使用して、JavaプログラムからExcelファイルを読み書きする方法について説明しました。

この記事の完全なソースコードは、GitHubプロジェクトにあります。