Создание электронной таблицы Excel с информацией из двух хранилищ
Я хочу создать отчет, который включает все лицензии и страховки из их отдельных репозиториев в таблицу Excel. Есть ли способ сделать это так:
@RequestMapping(value="/report/expirationReport")
public void getExpirationReport(Model model,HttpServletResponse response){
List<License> licenses;
List<Insurance> insurances;
licenses = licenseRepository.findAll();
insurances = insuranceRepository.findAll();
List<String> headers=Arrays.asList("Legal Name","Principle Name","Type","State","Expiration");
response.addHeader("Content-disposition", "attachment; filename=ExpirationReport.xls");
response.setContentType("application/vnd.ms-excel");
try {
new SimpleExporter().gridExport(headers, licenses, insurances,"client.legalName, client.principleName,type,state,expiration", response.getOutputStream());
response.flushBuffer();
}catch (IOException e) {
e.printStackTrace();
}
}
Оба репозитория уже существуют, но я не могу просто добавить страховки (как я это делал выше), потому что SimpleExporter, кажется, принимает только два объекта, а затем объект подпирает. Есть идеи, как заставить его принять все три объекта? Или есть идеи, как наилучшим образом объединить / сохранить результаты двух функций findAll репо в один объект данных?
Изменить: я смог заставить это работать, пройдя через таблицу клиента, так как у лицензии и страховки были внешние ключи к клиенту. Вот код:
@RequestMapping(value="/report/expirationReport")
public void expirationReport(HttpServletResponse response){
List<Client> clients=clientRepository.findAll();
try {
response.addHeader("Content-disposition", "attachment; filename=expirationReport.xlsx");
response.setContentType("application/vnd.ms-excel");
InputStream is= new ClassPathResource("static/reports/expirationReport.xlsx").getInputStream();
Context context= new Context();
context.putVar("clients", clients);
JxlsHelper.getInstance().processTemplate(is,response.getOutputStream(),context);
response.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
}
1 ответ
licenses
а также insurances
два отдельных списка, которые программно не имеют ничего общего. Размер может быть разным, так что JXLS не будет знать, в какой строке его следует использовать.
Поэтому JXLS поддерживает только один Iterable
в gridExport()
, Лучше всего объединить свои списки. Вам решать, следует ли присоединить их к хранилищу или отдельному сервису (или взломать внутри контроллера), но это определенно должна быть одна коллекция.