JavaでMicrosoft Excelを操作する

JavaでMicrosoft Excelを操作する

1. 前書き

このチュートリアルでは、Apache POI and JExcel APIs for working with Excel spreadsheetsの使用法を示します。

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

2. Mavenの依存関係

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


    org.apache.poi
    poi
    3.15


    org.apache.poi
    poi-ooxml
    3.15

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

3. アパッチPOI

Apache POI library supports both .xls and .xlsx filesは、Excelファイルを操作するための他のJavaライブラリよりも複雑なライブラリです。

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

新しい.xlsxファイル形式で作業する場合は、XSSFWorkbook, XSSFSheet, XSSFRow, and 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> data = new HashMap<>();
int i = 0;
for (Row row : sheet) {
    data.put(i, new ArrayList());
    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 has different methods for reading each type of data.上記の各switchケースの内容を拡張してみましょう。

セルタイプの列挙値が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> 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ファイルのさまざまな部分を表す一連のクラスを提供します。 The Workbook class represents the entire collection of sheets.Sheetクラスは単一のシートを表し、Cellクラスはスプレッドシートの単一のセルを表します。

指定されたExcelファイルからブックを作成し、ファイルの最初のシートを取得してから、そのコンテンツをトラバースし、各行をHashMapに追加するメソッドを作成してみましょう。

public class JExcelHelper {

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

        Map> 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());
            for (int j = 0; j < columns; j++) {
                data.get(i)
                  .add(sheet.getCell(j, i)
                  .getContents());
            }
        }
        return data;
    }
}

4.2. Excelへの書き込み

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

書き込むことができるThe WritableCell class has subclasses corresponding to the different types of contentLabelDateTimeNumberBooleanBlank、およびFormula

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

現在のディレクトリに‘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));

次に、最初のシートを作成し、“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ファイルを読み書きする方法を説明しました。

この記事の完全なソースコードは、GitHub projectにあります。