Почему Apache poi возвращает пустой файл Excel при запуске проекта на сервере? - PullRequest
0 голосов
/ 23 мая 2019

В моем проекте я использую apache-poi, чтобы позволить пользователю загружать в Excel представление некоторых данных, хранящихся в базе данных (вид отчета). При локальном тестировании все работает нормально. При работе на сервере файл Excel содержит только заголовки и вообще никаких данных. В то же время некоторые отчеты возвращают правильно файлы Excel с данными в них, но некоторые из них возвращают пустые файлы только со строкой заголовка.

В отчете о проекте предусмотрено два способа представления данных: веб-интерфейс и загружаемый файл Excel. Веб-представление работает правильно и позволяет мне знать, что отчет возвращает данные. Так странно, что файл excel пуст.

Проблема в том, что журналы пустые, а код ответа 200 при работе на сервере - поэтому я не получаю никаких сообщений об ошибках, которые могли бы помочь мне решить проблему. С другой стороны, выполнение одного и того же кода локально возвращает меня к Excel с данными в нем - так что, опять же, я не получаю никаких ошибок и не могу отлаживать.

Ниже приведен класс, который я использую для создания файла Excel.

ExcelUtils.java

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import team.alabs.hcms.model.Header;
import team.alabs.hcms.model.Report;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExcelUtils {

    public static Workbook createWorkbook(Report report, List<Map<String, Object>> reportData, List<Header> headers) {
        Workbook reportBook = new XSSFWorkbook();
        String empty = new String("");
        Sheet sheet = reportBook.createSheet("report");
        Row headerRow = sheet.createRow(0);
        for (int i = 0; i < headers.size(); i++) {
            headerRow.createCell(i).setCellValue(headers.get(i).getTitle());
        }
        for (int i = 0; i < reportData.size(); i++) {
            Row row = sheet.createRow(i + 1);
            HashMap<String, Object> tmprow = (HashMap<String, Object>) reportData.get(i);
            for (int j = 0; j < headers.size(); j++) {
                Object value = tmprow.get(headers.get(j).getCode()) != null ? tmprow.get(headers.get(j).getCode()) : empty;
                row.createCell(j).setCellValue(value.toString());
            }
        }
        return reportBook;

    }

    public static byte[] getBytes(Workbook workbook) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            workbook.write(bos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            bos.close();
        }
        byte[] bytes = bos.toByteArray();
        return bytes;
    }

}

Я ожидаю, что запущенный проект на сервере вернет Excel с данными внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...