2015-03-31

【備忘録】 Java で Excel ファイルを読み込む

Apache POI (Poor Obfuscation Implementation) は Apache ソフトウェア財団のプロジェクトで Word や Excel といった Microsoft Office 形式のファイルを読み書きできる 100% Java ライブラリとして提供されています。配布ライセンスは Apache License に従っています。

Apache POI プロジェクトは、次のようなサブコンポーネントからなっています(ウィキペディア Apache POI から抜粋)。

POIFS (Poor Obfuscation Implementation File System)
Microsoft OLE 2 複合ドキュメント形式を読み書きするコンポーネント。すべての Microsoft Office ファイルは OLE 2 ファイルであるため、POIFS は他の POI 構成要素の基礎となっている。
HSSF (Horrible SpreadSheet Format)
Microsoft Excel (XLS) 形式のファイルを扱う。Excel 97以降のファイルを読み書きできる。
XSSF (XML SpreadSheet Format)
Office Open XML Workbook形式のファイルを扱う。Excel 2007で採用されたOOXML形式のファイルを読み書きできる。
HWPF (Horrible Word Processor Format)
Microsoft Word (DOC) 形式のファイルを扱う。Word 97以降のファイルを読み書きできる。Word 95以前の形式も限定的に読むことができる。
XWPF (XML Word Processor Format)
Office Open XML Document形式のファイルを扱う。Word 2007で採用されたOOXML形式のファイルを読み書きできる。
HSLF (Horrible Slide Layout Format)
Microsoft PowerPoint (PPT) 形式のファイルを扱う。PowerPoint 97以降のファイルを読み書きできる。
XSLF (XML Slide Layout Format)
Office Open XML Presentation形式のファイルを扱う。PowerPoint 2007で採用されたOOXML形式のファイルを読み書きできる。
HPSF (Horrible Property Set Format)
Microsoft Officeのドキュメントサマリーを読むコンポーネント。
HDGF (Horrible DiaGram Format)
Microsoft Visio形式のファイルを扱う。現在は読み取りのみ可能。
HPBF (Horrible PuBlisher Format)
Microsoft Publisher形式のファイルを扱う。ファイル内の一部の読み取りに限られている。
HSMF (Horrible Stupid Mail Format)
Microsoft Outlook (MSG) 形式のファイルを扱う。現在はファイルの読み取りのみ可能。

多機能なライブラリですが、今回は Excel の XLSX 形式のファイルを読み込むサンプルを紹介します。

動作環境は次の通りです。

  • OS: WIndows 8.1 (64bit)
  • Java: Java SE 1.8.0_40-b25
  • IDE: NetBeans IDE 8.0.2
  • poi-bin-3.11-20141221
リスト:XLSXReadSample.java 
package xlsxreadsample;

import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XLSXReadSample {
    public static void main(String[] args) {
        String fileName = "F:/sample_commonality.xlsx";

        try {
            XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(fileName));

            System.out.println("Data dump:\n");

            for (int k = 0; k < wb.getNumberOfSheets(); k++) {
                XSSFSheet sheet = wb.getSheetAt(k);
                int rows = sheet.getPhysicalNumberOfRows();
                System.out.println("Sheet " + k + " \"" + wb.getSheetName(k) + "\" has " + rows + " row(s).");

                for (int r = 0; r < rows; r++) {
                    XSSFRow row = sheet.getRow(r);
                    if (row == null) {
                        continue;
                    }

                    int cells = row.getPhysicalNumberOfCells();
                    System.out.println("\nROW " + row.getRowNum() + " has " + cells + " cell(s).");

                    for (int c = 0; c < cells; c++) {
                        XSSFCell cell = row.getCell(c);
                        String value = null;

                        switch (cell.getCellType()) {
                            case XSSFCell.CELL_TYPE_FORMULA:
                                value = "FORMULA value=" + cell.getCellFormula();
                                break;
                            case XSSFCell.CELL_TYPE_NUMERIC:
                                value = "NUMERIC value=" + cell.getNumericCellValue();
                                break;
                            case XSSFCell.CELL_TYPE_STRING:
                                value = "STRING value=" + cell.getStringCellValue();
                                break;
                            default:
                        }
                        System.out.println("CELL col=" + cell.getColumnIndex() + " VALUE=" + value);
                    }

                }
            }
        } catch (Exception e) {
            System.err.println("Caught Exception: " + e.getMessage());
        }
    }
    
}

実行例を以下に示します。

run:
Data dump:

Sheet 0 "sample_commonality" has 21 row(s).

ROW 0 has 8 cell(s).
CELL col=0 VALUE=STRING value=LOTID
CELL col=1 VALUE=STRING value=STAGE_A
CELL col=2 VALUE=STRING value=STAGE_B
CELL col=3 VALUE=STRING value=STAGE_C
CELL col=4 VALUE=STRING value=STAGE_D
CELL col=5 VALUE=STRING value=STAGE_E
CELL col=6 VALUE=STRING value=STAGE_F
CELL col=7 VALUE=STRING value=YIELD
...
(省略)
...
ROW 20 has 8 cell(s).
CELL col=0 VALUE=STRING value=P20
CELL col=1 VALUE=STRING value=A03
CELL col=2 VALUE=STRING value=B02
CELL col=3 VALUE=STRING value=C01
CELL col=4 VALUE=STRING value=D03
CELL col=5 VALUE=STRING value=E02
CELL col=6 VALUE=STRING value=F02
CELL col=7 VALUE=NUMERIC value=91.78
ビルド成功(合計時間: 1秒)

参考サイト

  1. Read / Write Excel file in Java using Apache POI
  2. https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/hssf/usermodel/examples/HSSFReadWrite.java
  3. Apache POIでExcelを操作

 

0 件のコメント: