В моем проекте я использую 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 с данными внутри.