首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Apache poi在服务器上运行项目时返回空的excel文件?

为什么Apache poi在服务器上运行项目时返回空的excel文件?
EN

Stack Overflow用户
提问于 2019-05-23 13:48:22
回答 1查看 433关注 0票数 0

在我的项目中,我使用apache-poi让用户下载存储在数据库中的一些数据的excel表示(一种报告)。在本地测试时,一切工作正常。当在服务器上运行时,excel文件只包含头部而不包含任何数据。同时,有些报表会正确返回包含数据的excel文件,但有些报表只会返回包含标题行的空文件。

在项目报告中有两种数据表现方式:基于web的和excel可下载的文件。基于Web的视图工作正常,并让我知道报告确实返回了数据。所以奇怪的是,excel文件是空的。

问题是当在服务器中运行时,日志是空的,响应代码是200 -所以我没有得到任何可以帮助我解决问题的错误消息。另一方面,在本地运行相同的代码会返回一个包含数据的excel -因此,我再一次没有得到任何错误,也不能调试。

下面是我用来创建excel文件的类。

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2021-02-25 19:54:41

我有一个类似的问题,在我的本地系统中创建具有完整数据的excel文件,但当它在服务器上运行时,它创建了一个0(零)字节大小的excel。这是因为执行永远不会到达-

代码语言:javascript
复制
workbook.write(bos); // From your code above

原因是-在我的例子中,它是在多线程环境中(使用ThreadPoolTaskExecutor)。所以这就是问题所在--异步线程被uncaughtexception终止,这些异常在FutureTask中被捕获,但从未被抛回,因此应用程序没有意识到任何故障,该线程停止(结束)。有几种方法可以为这类异常启用处理程序。另一种方式是-

代码语言:javascript
复制
Future<?> future = taskExecutor.submit(runnableTask);
future.get(); // This will throw an exception if the thread has thrown an uncaughtexception.

参考链接- Java FutureTask completion check

根据结果,人们可以很容易地找到根本原因。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56268763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档