public static void main(String[] args) throws Exception {

    // クラスの場所から読み込むファイルのパスを取得
    String filename = "勤務表.xls";
    URL url = WorkFactReportReader.class.getResource(filename);
    String filepath = URLDecoder.decode(url.getFile(), "UTF-8");

    ///// パース処理 /////
    BookController controller = new BookController(filepath);

    // 標準パーサの追加
    controller.addTagParser(new ListParser("@List"));
    controller.addTagParser(new MapParser("@Map"));
    controller.addTagParser(new ArraysParser("@Arrays"));
    controller.addTagParser(new ObjectsParser("@Objects"));
    controller.addTagParser(new MapsParser("@Maps"));

    // コンソール出力用エクスポータの設定
    controller.addBookExporter(new ConsoleExporter());

    // デバッグ用エラーハンドラの設定(エラー時はエラーファイルを作成)
    controller.setErrorHandler(new DebugErrorHandler());

    // パースの実行
    controller.parseBook();

    // パース結果の取得
    BookData bookData = controller.getBookData();

    // パース結果の操作
    List<String> sheetNames = bookData.getSheetNames();
    for (String sheetName : sheetNames) {
      bookData.getSheetData(sheetName);
    }
  }
  /**
   * ワークブックの変換処理を実行する。
   *
   * @param reportBook ワークブックの置換情報
   */
  private void processBook(ReportBook reportBook) {

    if (reportBook == null) {
      return;
    }

    Workbook workbook = getTemplateWorkbook(reportBook.getInputStream());

    for (ReportProcessListener listener : listeners) {
      listener.preBookParse(workbook, reportBook);
    }

    checkReportBook(reportBook);

    // テンプレート展開
    Set<Integer> delTemplateIndexs = expandTemplate(workbook, reportBook);

    // 出力ファイル取得
    BookController controller = new BookController(workbook);

    // Parserの設定
    for (ReportsTagParser<?> tagParser : parsers.values()) {
      controller.addTagParser(tagParser);
    }
    // リスナーの設定
    controller.addSheetParseListener(new RemoveAdapter());
    for (ReportProcessListener listener : listeners) {
      controller.addSheetParseListener(listener);
    }

    // Exporterの設定
    for (ConvertConfiguration configuration : reportBook.getConfigurations()) {
      if (configuration == null) {
        continue;
      }
      for (ReportBookExporter reportExporter : exporters.values()) {
        if (configuration.getFormatType().equals(reportExporter.getFormatType())) {
          reportExporter.setConfiguration(configuration);
          reportExporter.setOutputStream(reportBook.getOutputStream());
          controller.addBookExporter(reportExporter);
        }
      }
    }

    ReportsParserInfo reportsParserInfo = new ReportsParserInfo();
    reportsParserInfo.setReportParsers(new ArrayList<ReportsTagParser<?>>(parsers.values()));
    reportsParserInfo.setReportBook(reportBook);

    BookData bookData = controller.getBookData();
    bookData.clear();
    for (String sheetName : controller.getSheetNames()) {
      if (sheetName.startsWith(BookController.COMMENT_PREFIX)) {
        continue;
      }
      ReportSheet reportSheet = ReportsUtil.getReportSheet(sheetName, reportBook);
      if (reportSheet != null) {

        reportsParserInfo.setParamInfo(reportSheet.getParamInfo());
        // 解析の実行
        SheetData sheetData = controller.parseSheet(sheetName, reportsParserInfo);
        // 結果の追加
        controller.getBookData().putSheetData(sheetName, sheetData);
      }
    }

    // 不要テンプレート削除
    for (Integer deleteSheetIndex : delTemplateIndexs) {
      workbook.removeSheetAt(deleteSheetIndex);
    }

    // 出力処理前にリスナー呼び出し
    for (ReportProcessListener listener : listeners) {
      listener.postBookParse(workbook, reportBook);
    }

    // 出力処理の実行
    for (BookExporter exporter : controller.getExporter()) {
      if (exporter != null) {
        exporter.setup();
        try {
          exporter.export(workbook, bookData);
        } finally {
          exporter.tearDown();
        }
      }
    }
  }