Java Apache POI生成损坏的Excel文件

Java Apache POI生成损坏的Excel文件,java,excel,apache-poi,jxl,Java,Excel,Apache Poi,Jxl,我正在使用ApachePOI在数据库的帮助下创建一个excel文件。我试着用不同的代码搜索了很多东西,结果得到的只是一次又一次损坏的excel表格。到目前为止,我使用的代码如下: public void generateExcel(ResultSet rs, String excelFilename, String newDesc){ try { Workbook wb = new XSSFWorkbook(); Cell c = null;

我正在使用ApachePOI在数据库的帮助下创建一个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;

}
我以前使用JXL生成excel文件,但最近它也给了我同样的东西,因此我选择切换到apachepoi


提前感谢。

您的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

您在generateExcel中传递给wriiten的文件扩展名是什么?我使用xlsx extensionOk。您可以尝试工作簿=WorkbookFactory.create(文件),而不是工作簿=new XSSFWorkbook(fis);我看这里没有使用任何
FileInputStream
。正在正确创建工作簿@你能试着从代码中删除所有格式吗?这还包括列宽等。如果这根本没有帮助,那么尝试删除数据(创建一个包含1张工作表、1行和1个单元格的简单内容的空工作簿)。通过这种方式,我们可以看到问题究竟出在哪里,因为您有一个JSP,可以从中下载新生成的excel文件?在这种情况下,将excel文件保存在服务器上或运行JSP并从那里访问它的任何位置。也许只是你的下载方法没有正确实现,我使用的是xlsx扩展。另外,我没有使用HttpServletResponse。在这种情况下,我只调用一个java对象,方法generateExcel传递参数。我想知道如果我使用xls格式,getWorkBook会有什么功能。您可以使用工作簿或HSSFWorkbook作为.xls格式。工作簿是通用接口,适用于HSSF(.xls)和XSSF(.xlsx)。HSSF工作簿是.xls格式工作簿的实现。有关更多详细信息->
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();