目次
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
2020年12月の最新バージョンは、4.1.2です。
遷移先のページから「HTTP」のリンクをクリックすると、ダウンロードを開始します。
ダウンロードが完了したら、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); } }
出力方法などは、書き込みの部分と同様です。
実行結果の画像は省略しますが、年齢の列が削除されているはずです。
比較的、処理の仕組みも理解しやすく簡単な方法だと思います!