Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

JavaでExcelを操作する【Apache POI】

この記事では、JavaでExcelファイルを操作する方法について解説します。

JavaでExcelファイルを操作するには、「Apache POI」というライブラリを使用しましょう。

Apache POIとは、Javaプログラムが Excel や Word など「Microsoft Officeのファイル」を読み書きできるようにするライブラリです。

まずは、Apache POIをダウンロード・インストールしましょう。

Apache POIのサイトにアクセスし、「Binary Distribution」からリンクをクリックします。

https://poi.apache.org/download.html#POI-4.1.2

JavaでExcelを操作する【Apache POI】

2020年12月の最新バージョンは、4.1.2です。

遷移先のページから「HTTP」のリンクをクリックすると、ダウンロードを開始します。

JavaでExcelを操作する【Apache POI】

ダウンロードが完了したら、zipファイルを展開しましょう。

中身を確認してみると、次のようなファイル群が格納されています。

展開したディレクトリはどこに格納してもOKですが、Javaファイルと同じ場所に格納しておくと便利です。

ここでは、デスクトップに置いておきました。

これで準備は完了です!

Excelファイルの読み込み

まずは、Excelファイルの読み込みを行ってみましょう。

サンプルとして、「User.xlsx」というファイルを用意し、次のようにデータを入力しました。

1行目にユーザーの名前、性別、年齢を入れている状態ですね。

各ファイル・フォルダの構成は次の通りです。

デスクトップにすべて置いています。

デスクトップ
    ∟Main.java
    ∟poi-4.1.2
    ∟User.xlsx

そして、Main.javaには以下のように記述します。

■記述例
import java.io.*;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class Main {
  public static void main(String[] args) throws EncryptedDocumentException, IOException{
    // Excelファイルへアクセス
    Workbook excel = WorkbookFactory.create(new File("User.xlsx"));

    // シート名を取得
    Sheet sheet = excel.getSheet("user_data");

    // 0行目を取得
    Row row = sheet.getRow(0);

    // 0番目のセルの値を取得
    Cell cell_name = row.getCell(0);
    // 1番目のセルの値を取得
    Cell cell_sex = row.getCell(1);
    // 2番目のセルの値を取得
    Cell cell_age = row.getCell(2);

    // セルの値を文字列として取得
    String value_name = cell_name.getStringCellValue();
    String value_sex = cell_sex.getStringCellValue();
    String value_age = cell_age.getStringCellValue();

    // 文字列を結果として表示
    System.out.println("value_name : " + value_name);
    System.out.println("value_sex : " + value_sex);
    System.out.println("value_age : " + value_age);
  }
}

セルの値を取得する部分は、for文を使っても良いですが、ここではわかりやすくするために1つずつ取得しています。

このファイルをコンパイルするには、次のように指定します。

javac -classpath poi-4.1.2/*:poi-4.1.2/lib/*:poi-4.1.2/ooxml-lib/* Main.java
java -classpath .:poi-4.1.2/*:poi-4.1.2/lib/*:poi-4.1.2/ooxml-lib/* Main

デスクトップにある「poi-4.1.2」をクラスパスとして通しています。

クラスパスの通し方は、ディレクトリやファイルが置いてある場所によって異なるので注意してください。

なお、クラスパスについては、以下の記事で詳しく解説しています。

もし不明点があれば、ぜひ参考にしてみてください!

【関連記事】

▶︎【Java】classpathの意味や指定方法を解説!(Windows/Mac)

上記のファイルを実行すると、次のような結果を取得できます。

■実行結果
mbp:Desktop potepan$ java -classpath .:poi-4.1.2/*:poi-4.1.2/lib/*:poi-4.1.2/ooxml-lib/* Main
value_name : 田中太郎
value_sex : 男性
value_age : 26歳

このように、Excelファイルにある値を取得できました!

それぞれの処理は、コメントに書いてある通りです。

WorkbookFactory.create」でExcelファイルへアクセスし、読み込めるようにしています。

そして「excel.getSheet」でシート名を取得しました。

後は、「getRow」「getCell」で、該当の行・列にある値を取得して、表示している仕組みです。

情報量が多い場合は、for文などを使ってデータをまとめて取得・表示すると良いでしょう。

Excelファイルを作成・出力

では、今度はJavaでExcelファイルを作成して、出力してみましょう。

一度、作成していた「User.xlsx」を削除し、同じものをJavaで作成してみます。

記述例は以下の通りです。

■記述例
import java.io.*;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Main {
  public static void main(String[] args) throws EncryptedDocumentException, IOException{
    // Excelファイルを作成
    Workbook outputWorkbook = new XSSFWorkbook();

    // シートを作成
    Sheet outputSheet = outputWorkbook.createSheet("user_data");

    // 行を作成
    Row outputRow = outputSheet.createRow(0);

    // セルを作成
    Cell outputCell_name = outputRow.createCell(0);
    Cell outputCell_sex = outputRow.createCell(1);
    Cell outputCell_age = outputRow.createCell(2);

    // セルに値を設定
    outputCell_name.setCellValue("田中太郎");
    outputCell_sex.setCellValue("男性");
    outputCell_age.setCellValue("26歳");

    // 出力用のストリームを用意
    FileOutputStream out = new FileOutputStream("User.xlsx");

    // ファイルへ出力
    outputWorkbook.write(out);
  }
}

少し補足すると、「new XSSFWorkbook()」でファイルフォーマットを作成しています。

Excel2003以前を使用している場合は、XSSFWorkbookではなく「HSSFWorkbook」を使ってください。

import部分も「import org.apache.poi.xssf.usermodel.XSSFWorkbook;」ではなく、「org.apache.poi.hssf.usermodel.HSSFWorkbook;」になります。

そして、「createSheet」でシートを作成しています。

ここでは、先ほど同様に「user_data」としました。

「createRow」「createCell」で、行と列を作成し、値を入力しています。

基本的な流れは、Excelファイルの読み込みと大差ありません。

使っているメソッドなどが異なるくらいでしょう。

そして最後に、「FileOutputStream」でExcelファイル名を指定し、「write(out)」でファイルを出力しました。

上記のファイルを実行すると、デスクトップに「User.xlsx」というExcelファイルが作成されているはずです。

中身も、読み込み時と同様になっています。

実行方法も、読み込み時と同じく以下のようにコンパイル・実行します。

javac -classpath poi-4.1.2/*:poi-4.1.2/lib/*:poi-4.1.2/ooxml-lib/* Main.java
java -classpath .:poi-4.1.2/*:poi-4.1.2/lib/*:poi-4.1.2/ooxml-lib/* Main

これで、Excelファイルの作成・出力が完了です!

Excelファイルに書き込みをする

ここでは、既存のExcelファイルを読み込んだ上で、書き込みする方法を紹介します。

流れとしては、Excelファイルの読み込みと作成で紹介した方法を組み合わせる形です。

以下のように記述できます。

■記述例
import java.io.*;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Main {
  public static void main(String[] args) throws EncryptedDocumentException, IOException{
    // Excelファイルへアクセス
    Workbook outputWorkbook = WorkbookFactory.create(new File("User.xlsx"));

    // シート名を取得
    Sheet outputSheet = outputWorkbook.getSheet("user_data");

    // 行を作成
    Row outputRow = outputSheet.createRow(1);

    // セルを作成
    Cell outputCell_name = outputRow.createCell(0);
    Cell outputCell_sex = outputRow.createCell(1);
    Cell outputCell_age = outputRow.createCell(2);

    // セルに値を設定
    outputCell_name.setCellValue("山田花子");
    outputCell_sex.setCellValue("女性");
    outputCell_age.setCellValue("31歳");

    // 出力用のストリームを用意
    FileOutputStream out = new FileOutputStream("User02.xlsx");

    // ファイルへ出力
    outputWorkbook.write(out);
  }
}

同じファイルに書き込もうとするとエラーになるため、「User02.xlsx」と別ファイルで上書きしています。

実行結果を見てみると、「User.xlsx」の内容を読み込んだ上で、新しいデータが書きこめています。

■実行結果

Excelファイルの列を削除する

ここでは、作成したExcelファイルの特定の列を削除する方法を紹介します。

以下は一例ですが、年齢が入力されたセル(2番目)を空白にすることで削除しています。

■記述例
import java.io.*;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Main {
  public static void main(String[] args) throws EncryptedDocumentException, IOException{
    // Excelファイルへアクセス
    Workbook excel = WorkbookFactory.create(new File("User02.xlsx"));

    // シート名を取得
    Sheet sheet = excel.getSheet("user_data");

    // 0行目・1行目を取得
    Row row0 = sheet.getRow(0);
    Row row1 = sheet.getRow(1);

    // 2番目のセルの値を取得
    Cell cell_age0 = row0.getCell(2);
    Cell cell_age1 = row1.getCell(2);

    // セルの値を削除
    cell_age0.setCellValue("");
    cell_age1.setCellValue("");

    // 出力用のストリームを用意
    FileOutputStream out = new FileOutputStream("User03.xlsx");

    // ファイルへ出力
    excel.write(out);
  }
}

出力方法などは、書き込みの部分と同様です。

実行結果の画像は省略しますが、年齢の列が削除されているはずです。

比較的、処理の仕組みも理解しやすく簡単な方法だと思います!

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。