Создание электронной таблицы 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(), Лучше всего объединить свои списки. Вам решать, следует ли присоединить их к хранилищу или отдельному сервису (или взломать внутри контроллера), но это определенно должна быть одна коллекция.

Другие вопросы по тегам