繁体   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