0

我有这种导出excel文档的方法,但是当我打开excel时,我得到了这种带有奇怪字符和符号的文件,没有格式;有人可以指导我如何解决这个问题吗?

在此处输入图像描述

这是我的方法,谢谢帮助;我仍在努力。

 public void CrearExcel() throws SQLException {
        //Map param = new HashMap();


        try {
            Connection conn = Conexion.getConnTest();
            PreparedStatement ps = null;
            ResultSet rs = null;
            String sql =
                "SELECT NUM_FICHA, ASPIRANTE.AP_PATERNO, ASPIRANTE.AP_MATERNO, ASPIRANTE.NOMBRE FROM REFERENCIA INNER JOIN ASPIRANTE ON REFERENCIA.FK_ASPIRANTE_ID_ASPIRANTE = ASPIRANTE.ID_USUARIO WHERE NUM_FICHA IS NOT NULL";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();


            HSSFWorkbook hwb = new HSSFWorkbook();
            HSSFSheet sheet = hwb.createSheet("new sheet");

            Row rowhead = sheet.createRow(0);

            rowhead.createCell(0).setCellValue("NUMFICHA");
            rowhead.createCell(1).setCellValue("APELLIDO PATERNO");
            rowhead.createCell(2).setCellValue("APELLIDO MATERNO");
            rowhead.createCell(3).setCellValue("NOMBRE");
            rowhead.createCell(4).setCellValue("EXAMEN1");
            rowhead.createCell(5).setCellValue("EXAMEN2");

            int index = 1;
            while (rs.next()) {
                Row row = sheet.createRow(index);

                row.createCell(0).setCellValue(rs.getInt(1));
                row.createCell(1).setCellValue(rs.getString(2));
                row.createCell(2).setCellValue(rs.getString(3));
                row.createCell(3).setCellValue(rs.getString(4));
                row.createCell(4).setCellValue("");
                row.createCell(5).setCellValue("");
                index++;

            }


            ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
            hwb.write(outByteStream);
            byte[] outArray = outByteStream.toByteArray();

            response.setHeader("Content-Disposition",
                               "attachment; filename=testxls.xls");
            response.setContentType("application/vnd.ms-excel");
            response.flushBuffer();
            OutputStream outStream = response.getOutputStream();
            outStream.write(outArray);
            outStream.flush();


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
4

3 回答 3

2

为什么不直接从工作簿写入响应输出流:

HSSFWorkbook hwb = new HSSFWorkbook();
...
OutputStream outStream = response.getOutputStream();
hwb.write(outputStream);
....

因此,请尝试跳过字节数组(输出流)部分,因为这可能会导致您的问题。

这里有一些可能会有所帮助的更多信息

希望这能让你摆脱困境(或至少在摆脱困境的道路上)。

于 2012-12-15T09:13:45.577 回答
1

由于 Excel 文件可以接收文本内容,所以不要打印出二进制数据,而是尝试打印出文本数据。如果这不能解决问题,它至少应该能够为您指明比打印二进制数据更好的方向。

于 2012-12-14T22:11:03.067 回答
0

如果您使用某些服务器,这是一个常见的错误。您必须在写入响应之前重置响应:

...
response.reset(); 
response.setHeader("Content-Disposition",
                               "attachment; filename=testxls.xls");
...
于 2015-04-28T11:13:03.903 回答