簡體   English   中英

為什么Apache poi在服務器上運行項目時返回空的excel文件?

[英]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

原因是 - 在我的情況下,它處於多線程環境中(使用 ThreadPoolTask​​Executor)。 所以這就是問題所在 - 異步線程因未捕獲的異常而終止,該異常在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM