当前位置: 首页 > 知识库问答 >
问题:

Apache Poi Excel(.xlsx)文件已损坏。(使用XSSF)

慕容齐智
2023-03-14

我正在使用ApachePOI,我创建了一个XSSF工作簿,并尝试打开一个xlsx文件。它在当地的一个地方很有效。但是,当我用Excel打开真正服务器(AWS EC2、Tomcat8、JDK 1.8)上的Excel文件时,它显示文件已损坏(.xls工作)。这是我的代码:

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 org.springframework.web.servlet.view.document.AbstractXlsxView;

protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
        @SuppressWarnings("unchecked")
        List<BoardArticleDto> list = (List<BoardArticleDto>)model.get("data");
        String filename = HttpUtils.uriEncoding("문의내역리스트.xlsx", StandardCharsets.UTF_8);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");  
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\";");
        response.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

        int cnt = 0, rowNum = 0;

        Workbook wb = new XSSFWorkbook();    
        Sheet sheet  = wb.createSheet("문의내역리스트");

        Row row = null;
        row = sheet.createRow(rowNum++);

        row.createCell(cnt++).setCellValue( "유형" );
        sheet.setColumnWidth(cnt, 30 * 256);
        row.createCell(cnt++).setCellValue( "첨부파일" );
        sheet.setColumnWidth(cnt, 40 * 256);
        row.createCell(cnt++).setCellValue( "제목" );
        sheet.setColumnWidth(cnt, 20 * 256);
        row.createCell(cnt++).setCellValue( "작성자" );
        sheet.setColumnWidth(cnt, 26 * 256);
        row.createCell(cnt++).setCellValue( "등록일자" );
        row.createCell(cnt++).setCellValue( "답변여부" );

        int rownum = 1;

        if( null != list ){
            for( BoardArticleDto bda : list ){

                cnt = 0;
                row = sheet.createRow(rownum);

                row.createCell(cnt++).setCellValue( Converter.toStr(bda.getCSC_NAME1()) );
                row.createCell(cnt++).setCellValue( Converter.toStr(bda.getBDA_FILE1()) );
                row.createCell(cnt++).setCellValue( Converter.toStr(bda.getBDA_NAME()) );
                row.createCell(cnt++).setCellValue( Converter.toStr(bda.getMB_NAME()) );
                row.createCell(cnt++).setCellValue( Converter.toStr(bda.getBDA_INDATE()).substring(0, 10) );
                row.createCell(cnt++).setCellValue( Converter.toStr(bda.getBDA_REPLYYN()) );

                rownum++;
            }

        }

        OutputStream fileOut = response.getOutputStream();
        wb.write(fileOut);
        fileOut.close();
    }

}

本地Spring4, jdk1.8, tomcat 8.0, maven

真正的AWS EC2亚马逊linux2,jdk1。8、tomcat 8.0(不含Apache Web服务器)

Apache POI版本3.10.1

共有2个答案

公良俊楚
2023-03-14

我不确定这是否能解决你的问题,但总是wb。当您不再需要工作簿时,请关闭()。

宇文曦
2023-03-14

我不能看到整个代码,但我建议检查这个response.getOutputStream()调试,看看这个返回什么,如果值不是你想要的,看看你的响应可能有什么问题。

如果是正确的,试着用正常字符(不是韩语)创建一个简单的文件。如果创建这个文件没有问题,那么这是一个编码问题。通过这种方式,你可以找到问题的根本原因。

 类似资料:
  • 我已经在中创建了工作簿/Excel。使用ApachePOIAPI成功实现了xlsx格式与Java的结合。我的代码如下,它是在D驱动器中创建的一个名为“RiponAlWasim.xlsx”的文件: 当我试图打开"RiPonAlWasim.xlsx"时,显示文件已损坏。怎么了?

  • 我正在使用apache poi,我创建了一个HSSF工作簿,并尝试打开一个xlsx文件。但当我用excel打开时,它显示文件已损坏。这是我的密码。

  • 我有一段代码,目前正在写入一个

  • Docx4J生成的Excel工作簿总是说损坏了,但我无法确定Excel不喜欢底层XML的什么,更不用说如何修复它了。 我的用例如下:我试图定期自动生成一个带有图表和图形的excel工作簿。只有原始数据会改变,但随着原始数据的改变,其他一切都会动态更新。 null null 在我的空白工作簿之前和之后 欢迎所有的想法。

  • 问题内容: 我正在使用角度$ http从服务器下载文件。文件类型可以不同。我应该设置请求标头以进行身份​​验证。下载完成后,文件已损坏!这是我在客户端保存文件的代码: 问题答案: 我最终通过将以下配置添加到ajax请求中解决了该问题: 并将Blob类型更改为 “应用程序/八位字节流”

  • 我正在尝试重命名现有XLSX文件的标题。这个想法是使用一个excel文件将数据从XML导出到excel,并在某个用户进行调整后重新导入XML。 目前,我们已经用Excel创建了一个“模板”xlsx-sheet,其中已经包含了一个可排序表(poi中的XSSFTable)和一个到XSD-Source的映射。然后通过POI进行导入,将XML数据映射到其中并保存。为了根据用户调整工作表,我们希望将现有表的