BLOGTIMES
2013/09/19

Apache POI を使ってディレクトリ内の Excel ファイルからデータを一括抽出する

  java  msoffice  apache 
このエントリーをはてなブックマークに追加

Excelで作られたアンケートファイルの集計を頼まれたのですが、ファイル数が膨大でとってもじゃないけど一つ一つ転記していられないので、シートの特定の箇所だけを抽出するプログラムを書いて対応しました。今回は xlsx 形式を扱うために Apache POI を使います。

さらに Java7 から導入されたjava.nio.file.Files#walkFileTree()*1 を使ってみます。これまで Java でディレクトリを再帰的に探索するのはいろいろと面倒でしたが、これを使うと Visitor を使ってファイルツリーを走査することができます*2

下記の例は C:\path\to\xls\dir 以下にある .xlsx の各ファイルに対して、一番最初のシートの左上のセル(つまりA0セル)を抽出して、ファイルのパスと共に出力するものです。こんな感じですっきりと書くことができます。

POITest.java

import java.io.FileInputStream; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; 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.xssf.usermodel.XSSFWorkbook; public class POITest { public static void main(String[] args) throws Exception { final Path rootPath = FileSystems.getDefault().getPath("C:\\path\\to\\xls\\dir"); Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if( file.toString().endsWith(".xlsx") ){ FileInputStream fis = new FileInputStream(file.toFile()); XSSFWorkbook book = new XSSFWorkbook(fis); fis.close(); Sheet sheet = book.getSheetAt(0); Row row = sheet.getRow(0); Cell cell = row.getCell(0); String str = cell.toString(); System.out.println(file.toString()+": "+str); } return FileVisitResult.CONTINUE; } }); } }

実際に起動してみるとこんな感じの出力になります。

C:\path\to\xls\dir\a.xlsx: あああ C:\path\to\xls\dir\b.xlsx: いいい C:\path\to\xls\dir\c.xlsx: ううう C:\path\to\xls\dir\d.xlsx: えええ C:\path\to\xls\dir\e.xlsx: おおお C:\path\to\xls\dir\f.xlsx: かかか C:\path\to\xls\dir\g.xlsx: ききき

今回はエクセルで作られたアンケート表だったので、これでめでたく一括処理できました。


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6150
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン