使用Apache POI导出到Java中的Excel

时间:2014-10-13 09:01:22

标签: java excel jsf apache-poi

我使用Apache POI以excel格式导出数据。导入进展顺利,但是当我尝试打开文档时,我收到了此消息" Excel在文档中遇到了不可读的内容" toto.xls"。您想要恢复此工作簿的内容吗?如果此工作簿的来源可靠,请单击“是”。 "

以下是export excel的java代码

    public void exportExcel() throws IOException {

    // Creation workbook vide
    XSSFWorkbook workbook = new XSSFWorkbook();

    // Creation d'une feuille vierge
    XSSFSheet sheet = workbook.createSheet("Participant");
    List<toto> totoList = this.getAllToto;
    int indiceMap = 2;
    Map<String, Object[]> data = new TreeMap<String, Object[]>();
    data.put("1", new Object[] { "name", "surname" });

    for (TotoBean l : totoList) {
        data.put(Integer.toString(indiceMap),
                new Object[] { l.getName(), l.getSurname() });
        indiceMap++;
    }
    // Iteration sur la map data et ecriture dans dans la feuille excel
    Set<String> keyset = data.keySet();
    int rownum = 0;
    for (String key : keyset) {
        Row row = sheet.createRow(rownum++);
        Object[] objArr = data.get(key);
        int cellnum = 0;
        for (Object obj : objArr) {
            Cell cell = row.createCell(cellnum++);
            if (obj instanceof String)
                cell.setCellValue((String) obj);
            else if (obj instanceof Integer)
                cell.setCellValue((Integer) obj);
        }
    }

    DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
    String dateToday = dateFormat.format(new Date());

    // Ecriture du fichier excel comme attachement
    ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
    workbook.write(outByteStream);
    byte[] outArray = outByteStream.toByteArray();
    String fileOut = "Liste-toto[" + this.getCity() + "]"
            + dateToday + ".xlsx";
    HttpServletResponse response = (HttpServletResponse) FacesContext
            .getCurrentInstance().getExternalContext().getResponse();

    response.setContentType("application/vnd.ms-excel");
    response.setContentLength(outArray.length);
    response.setHeader("Content-Disposition", "attachment; filename=\""
            + fileOut + "\"");

    OutputStream outStream = response.getOutputStream();
    outStream.write(outArray);

    outStream.flush();
    outStream.close();
}

2 个答案:

答案 0 :(得分:4)

你的问题是这两行不匹配

XSSFWorkbook workbook = new XSSFWorkbook();

response.setContentType("application/vnd.ms-excel");

如果您确实要生成.xls旧式Excel工作簿,则需要将第一行更改为HSSFWorkbook而不是XSSFWorkbook

如果您的意思是生成.xlsx Excel工作簿,那么第二行的内容类型必须是正确的.xlsx,即:

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

答案 1 :(得分:0)

您可以考虑将其作为“管理员”打开。根据这个(https://superuser.com/questions/401714/how-do-i-resolve-the-error-excel-found-unreadable-content-in-filename)来解决它。