![](/img/trans.png)
[英]Apache poi XSSF Creating Excel Files - Create returns empty file with format or file extension not valid?
[英]Why Apache poi returns empty excel file when running project on server?
在我的項目中,我使用 apache-poi 讓用戶下載存儲在數據庫中的某些數據的 excel 表示(一種報告)。 在本地測試時一切正常。 在服務器上運行時,excel 文件只包含標題,根本沒有數據。 同時,一些報告正確返回包含數據的 excel 文件,但其中一些報告僅返回帶有標題行的空文件。
在項目報告中有兩種數據表示方式:基於網絡和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。
我有一個類似的問題,即在我的本地系統中使用整個數據創建了 excel 文件,但是當它在服務器中運行時,它正在創建一個 0(零)字節大小的 excel。 這是因為執行永遠不會到達 -
workbook.write(bos); // From your code above
原因是 - 在我的情況下,它處於多線程環境中(使用 ThreadPoolTaskExecutor)。 所以這就是問題所在 - 異步線程因未捕獲的異常而終止,該異常在 FutureTask 中被捕獲但從未被拋出,因此應用程序不知道任何失敗並且該線程在那里停止(結束)。 我們可以通過多種方式為此類異常啟用處理程序。 另一種方式是——
Future<?> future = taskExecutor.submit(runnableTask);
future.get(); // This will throw an exception if the thread has thrown an uncaughtexception.
參考鏈接 - Java FutureTask 完成檢查
根據結果,很容易找到根本原因。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.