- blogs:
- cles::blog
2013/09/19

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



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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112054)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110680)
3 . 年次の人間ドックへ(110305)
4 . 2023 年分の確定申告完了!(1つめ)(109854)
5 . 三菱鉛筆がラミーを買収(109751)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110680)
3 . 年次の人間ドックへ(110305)
4 . 2023 年分の確定申告完了!(1つめ)(109854)
5 . 三菱鉛筆がラミーを買収(109751)
cles::blogについて
Referrers