【问题标题】:Apache POI generates corrupted Excel FileApache POI 生成损坏的 Excel 文件
【发布时间】:2019-02-02 20:24:59
【问题描述】:

我正在使用 Apache POI 在数据库的帮助下创建一个 excel 文件。我尝试使用不同的代码进行大量搜索,但我得到的只是一遍又一遍损坏的 Excel 表。截至目前,这是我正在使用的代码:

    public void  generateExcel(ResultSet rs, String excelFilename, String newDesc){

    try {
        Workbook wb = new XSSFWorkbook();
        Cell c = null;
        //Cell style for header row
        CellStyle cs = wb.createCellStyle();
        cs.setFillForegroundColor(IndexedColors.LIME.getIndex());
        cs.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
        Font f = wb.createFont();
        f.setBoldweight(Font.BOLDWEIGHT_BOLD);
        f.setFontHeightInPoints((short) 12);
        cs.setFont(f);

        //New Sheet
        Sheet sheet1 = null;
        sheet1 = wb.createSheet(newDesc);


        ResultSetMetaData metaData = rs.getMetaData();
        int colCount = metaData.getColumnCount();

        //Create Hash Map of Field Definitions
        LinkedHashMap<Integer, MyTableInfo> hashMap = new LinkedHashMap<Integer, MyTableInfo>(colCount);

        for (int i = 0; i < colCount; i++) {
            MyTableInfo db2TableInfo = new MyTableInfo(); 
            db2TableInfo.setFieldName(metaData.getColumnName(i + 1).trim());
            db2TableInfo.setFieldText(metaData.getColumnLabel(i + 1));
            db2TableInfo.setFieldSize(metaData.getPrecision(i + 1));
            db2TableInfo.setFieldDecimal(metaData.getScale(i + 1));
            db2TableInfo.setFieldType(metaData.getColumnType(i + 1));
            db2TableInfo.setCellStyle(getCellAttributes(wb, c, db2TableInfo));
            hashMap.put(i, db2TableInfo);
        }

        // Row and column indexes
        int idx = 0;
        int idy = 0;

        // Generate column headings
        Row row = sheet1.createRow(idx);
        MyTableInfo db2TableInfo = new MyTableInfo();

        Iterator<Integer> iterator = hashMap.keySet().iterator();
        while (iterator.hasNext()) {
            Integer key = (Integer) iterator.next();
            db2TableInfo = hashMap.get(key); 
            c = row.createCell(idy);
            c.setCellValue(db2TableInfo.getFieldText());
            c.setCellStyle(cs);
            if(db2TableInfo.getFieldSize() > db2TableInfo.getFieldText().trim().length()){
                sheet1.setColumnWidth(idy, (db2TableInfo.getFieldSize()* 500));
            }
            else {
                sheet1.setColumnWidth(idy, (db2TableInfo.getFieldText().trim().length() * 500));
            }
            idy++;
        }

        while (rs.next()) {

            idx++;
            row = sheet1.createRow(idx);
            System.out.println(idx);
            for (int i = 0; i < colCount; i++) {

                c = row.createCell(i);
                db2TableInfo = hashMap.get(i);

                switch (db2TableInfo.getFieldType()) {
                case 1:
                    c.setCellValue(rs.getString(i+1));
                    break;
                case 2:
                    c.setCellValue(rs.getDouble(i+1));
                    break;
                case 3:
                    c.setCellValue(rs.getDouble(i+1));
                    break;
                default:
                    c.setCellValue(rs.getString(i+1));
                    break;
                }
                c.setCellStyle(db2TableInfo.getCellStyle());
            }

        }

        rs.close();


        FileOutputStream fileOut = new FileOutputStream(excelFilename);

        wb.write(fileOut);
        fileOut.close();

    }
    catch (Exception e) {
        System.out.println(e);
    }

}


private static CellStyle getCellAttributes (Workbook wb, Cell c, MyTableInfo db2TableInfo){

    CellStyle cs= wb.createCellStyle();
    DataFormat df = wb.createDataFormat();
    Font f = wb.createFont();

    switch (db2TableInfo.getFieldDecimal()) {
    case 1:
        cs.setDataFormat(df.getFormat("#,##0.0"));
        break;
    case 2:
        cs.setDataFormat(df.getFormat("#,##0.00"));
        break;
    case 3:
        cs.setDataFormat(df.getFormat("#,##0.000"));
        break;
    case 4:
        cs.setDataFormat(df.getFormat("#,##0.0000"));
        break;
    case 5:
        cs.setDataFormat(df.getFormat("#,##0.00000"));
        break;
    default:
        break;
    }

    cs.setFont(f);

    return cs;

}

我收到以下消息:

"Excel cannot open the file "filename" because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file."

我以前使用 JXL 生成 excel 文件,但最近它也开始给我同样的东西,因此我选择切换到 Apache POI。

提前致谢。

【问题讨论】:

  • 你在 generateExcel 中传递的文件扩展名是什么?
  • 我使用 xlsx 扩展名
  • 好的。您可以尝试 Workbook workbook = WorkbookFactory.create(file) 而不是 workbook = new XSSFWorkbook(fis);
  • 我没有看到这里使用了任何FileInputStream。正在正确创建工作簿。 @JazzzzOut 您可以尝试从代码中删除所有格式吗?这也将包括列宽等。如果这根本没有帮助,那么也尝试删除数据(创建一个空工作簿,其中包含 1 张工作表、1 行和 1 个包含简单内容的单元格)。这样我们就可以看到问题到底出在哪里
  • 那么您有一个 JSP 可以从中下载新生成的 excel 文件?在这种情况下,将 excel 文件保存在服务器上或运行 JSP 的任何地方并从那里访问它。可能只是你的下载方法没有正确实现

标签: java excel apache-poi jxl


【解决方案1】:

您的 HttpServletResponse 设置是否正确? 您使用的是什么文件扩展名?

试试这个:

ServletOutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"example.xls\"");

workbook = getWorkbook(....)

workbook.write(os);
workbook.close();
os.flush();

response.flushBuffer(); 

其中 'response' 是来自控制器方法的 HttpServletResponse

【讨论】:

  • 我正在使用 xlsx 扩展。我也没有使用 HttpServletResponse。在这种情况下,我只是用方法 generateExcel 传递参数调用了一个 java 对象。
  • 如果我使用 xls 格式,我可以知道 getWorkBook 有什么吗?
  • 您可以将 Workbook 或 HSSFWorkbook 用于 .xls 格式。 Workbook 是通用接口,适用于 HSSF (.xls) 和 XSSF (.xlsx) HSSFWorkbook 是 .xls 格式的 Workbook 的实现。更多详情 -> poi.apache.org/apidocs/org/apache/poi/ss/usermodel/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
相关资源
最近更新 更多