Создание электронной таблицы Excel с информацией из двух хранилищ - PullRequest
0 голосов
/ 07 января 2019

Я хочу создать отчет, в который будут включены все лицензии и страховки из их отдельных репозиториев в таблицу 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 репо в один объект данных?

Edit: Я смог заставить это работать, пройдя через таблицу «Клиент», так как у лицензии и страховки были внешние ключи для клиента. Вот код:

@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 Ответ

0 голосов
/ 10 января 2019

licenses и insurances - это два отдельных списка, которые программно не имеют ничего общего. Размер может быть разным, поэтому JXLS не будет знать, в какой строке его следует использовать.

Поэтому JXLS поддерживает только один Iterable в gridExport(). Лучше всего объединить свои списки. Вам решать, следует ли присоединить их к хранилищу или к отдельной службе (или взломать внутри контроллера), но это определенно должна быть одна коллекция.

...