一般的な Excel の例では、ヘッダーをフォーマットにしてリスト データを Excel に書き込み、内容は List コレクションを使用して埋められます。今日の要望は少し違っていて、これもエクセルに書く必要があるのですが、最初の内容が一覧表ではなく、概要のような部分があり、その後に表が続いています。一般的な構造は次のとおりです。
この要件に対して、一般的な Excel 操作を使用する方法はありません。解決策は、テンプレートを使用してデータを入力することです。Excel テンプレート ファイルを作成し、変更された部分にプレースホルダーを使用する必要があります。
以下に示すように、テンプレート ファイルを作成します。
テンプレートでは、先頭部分に地図データを入力できるため、プレースホルダーは {checkTime} になります。ループ リストの次の部分は、{.name}、{.result}、{.desc} で埋められます。
上記のコード:
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel-core</artifactId>
<version>3.2.1</version>
</dependency>
リストエンティティクラス:
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class CheckRecord {
private String name;
private String result;
private String desc;
}
テストクラス:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class RecordExportTest {
private static final String RECORD_TEMPLATE = "conf/record-template.xlsx";
public static void main(String[] args) {
String filePath = "e:\\record-" + System.currentTimeMillis() + ".xlsx";
Map<String, Object> summary = new HashMap<>();
summary.put("checkTime", "2023-04-18");
summary.put("checkResult", "success");
summary.put("versionInfo", "v1.0.0");
List<CheckRecord> list = new ArrayList<>();
list.add(new CheckRecord("disk status", "success", "磁盘状态"));
list.add(new CheckRecord("network status", "success", "网络状态"));
boolean isOk = saveData(filePath, summary, list);
System.out.println("write excel : " + isOk);
}
private static boolean saveData(String filePath, Map<String, Object> summary, List<CheckRecord> list) {
try (ExcelWriter excelWriter = EasyExcel.write(filePath).withTemplate(RECORD_TEMPLATE).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
excelWriter.fill(list, fillConfig, writeSheet);
excelWriter.fill(summary, writeSheet);
excelWriter.finish();
}
return true;
}
}
コード要件に従って、前に準備した Record-template.xlsx ファイルをプロジェクトの conf ディレクトリに配置し、サンプルを実行すると、生成される Excel ファイルは次のとおりです。
このようなテンプレートの入力により、Excel をより複雑にすることができます。