在我的项目中,我使用apache-poi让用户下载存储在数据库中的一些数据的excel表示(一种报告)。在本地测试时,一切工作正常。当在服务器上运行时,excel文件只包含头部而不包含任何数据。同时,有些报表会正确返回包含数据的excel文件,但有些报表只会返回包含标题行的空文件。
在项目报告中有两种数据表现方式:基于web的和excel可下载的文件。基于Web的视图工作正常,并让我知道报告确实返回了数据。所以奇怪的是,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。
发布于 2021-02-25 19:54:41
我有一个类似的问题,在我的本地系统中创建具有完整数据的excel文件,但当它在服务器上运行时,它创建了一个0(零)字节大小的excel。这是因为执行永远不会到达-
workbook.write(bos); // From your code above原因是-在我的例子中,它是在多线程环境中(使用ThreadPoolTaskExecutor)。所以这就是问题所在--异步线程被uncaughtexception终止,这些异常在FutureTask中被捕获,但从未被抛回,因此应用程序没有意识到任何故障,该线程停止(结束)。有几种方法可以为这类异常启用处理程序。另一种方式是-
Future<?> future = taskExecutor.submit(runnableTask);
future.get(); // This will throw an exception if the thread has thrown an uncaughtexception.参考链接- Java FutureTask completion check
根据结果,人们可以很容易地找到根本原因。
希望这能有所帮助!
https://stackoverflow.com/questions/56268763
复制相似问题