【Java】スプレッドシートの表をHTML化する【株式会社ライトコード】
概要
Googleスプレッドシートに記載されている表をHTMLとして生成することができるツールの開発について記事にしました。
前提
言語はJavaです。そしてスプレッドシートの内容を読み込み、JavaクラスにマッピングするツールとしてXlsMapperというライブラリを使用します。詳細な前提条件はリンク先に記載あるのでそちらを確認してください。
[完成イメージ]
スプレッドシート
↓
HTML
ちなみにプロジェクトのディレクトリ構成は以下になります。
解説
スプレッドシートの内容をJavaに読み込ませるには手元のPCにxlsxファイルをダウンロードしてくる必要があります。今回は以下のようなスプレッドシートを sample.xlsxとして"com.sample"直下に配置します。
そしてsample.xlsxからデータを読み込み、取得したデータを元にHTMLを生成するメインの処理を記述したコードが以下になります。(packageやimportの記載は省略)
SampleConverter.java
public class SampleConverter {
public static void main(String[] args) {
var xlsMapper = new XlsMapper();
// 配置したSample.xlsxからデータを取得
try {
var sheet = xlsMapper.load(
new FileInputStream("src/main/java/com/sample/sample.xlsx"),
SampleSheet.class
);
// 取得したデータをもとにhtmlを生成
convertToHtml(sheet);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* Excelから取得したデータを元にHTMLを生成
*
* @param sheet sample.xlsxから取得したデータ
*/
private static void convertToHtml(SampleSheet sheet) {
// テンプレートエンジンの初期化
var engine = initializeTemplateEngine();
// テンプレートに渡すコンテキストを作成
var context = new Context();
// 表データを1行分ずつ格納したリストを作成
var recordList = new ArrayList<LinkedHashMap>();
for (SampleRecord record : sheet.getRecords()) {
createRecordList(recordList, record);
}
// 表データをcontextに設定
context.setVariable("recordList", recordList);
// templateからhtmlを生成
try {
var writer = new FileWriter("result/sample.html");
engine.process("sample-template", context, writer);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* テンプレートエンジンを初期化
*
* @return テンプレートエンジン
*/
private static TemplateEngine initializeTemplateEngine() {
var templateEngine = new TemplateEngine();
var resolver = new ClassLoaderTemplateResolver();
resolver.setTemplateMode("HTML");
resolver.setSuffix(".html");
templateEngine.setTemplateResolver(resolver);
return templateEngine;
}
/**
* 1行ごとの表データを格納したリストを作成
*
* @param recordList 1行ごとの表データを格納するリスト
* @param record 1行分の表データ
* @return 1行ごとの表データを格納したリスト
*/
private static void createRecordList(
ArrayList<LinkedHashMap> recordList, SampleRecord record) {
var columnDataMap = new LinkedHashMap();
// SampleRecordクラスのフィールド情報を取得
var fields = record.getClass().getDeclaredFields();
// 各フィールド名と値の組み合わせをMapにつめる
for (Field field : fields) {
field.setAccessible(true);
try {
columnDataMap.put(field.getName(), field.get(record));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
// 作成したMapをListにつめる
recordList.add(columnDataMap);
}
}
}
SampleSheet.java
@XlsSheet(name = "sample")
@Data
public class SampleSheet {
@XlsHorizontalRecords(headerAddress = "A1")
List records;
}
見慣れないアノテーションが2つありますね。
@XlsSheetはxlsxファイルの指定されたシートを読み込んでJavaクラスにマッピングしてくれます。今回はsampleシートを読み込むため、nameプロパティの値が sampleとなっています。
…
記事の続きは下のリンクをクリック!
https://rightcode.co.jp/blog/information-technology/java-spreadsheet-html
エンジニア積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
エンジニア、デザイナー、営業など積極採用中です!
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「スマホアプリエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「エンジニアリングマネージャー」「営業」などを積極採用中です!
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
【コーポレートサイト】https://rightcode.co.jp/
【採用募集】https://rightcode.co.jp/recruit(こちらからの応募がスムーズ)
【wantedlyぺージ】https://www.wantedly.com/companies/rightcode