Exporting to Excel in Java using Apache POI

时间:2021-08-08 20:24:48

I use Apache POI to export data in excel format. The import goes well, but when I try to open the document I have this message "Excel has encountered an unreadable content in the document "toto.xls". Would you want to recover the contents of this workbook? If the source of this workbook is reliable click yes. "

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

Below is the java code of export excel

以下是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 个解决方案

#1


3  

Your problem is the mis-match of these two lines

你的问题是这两行不匹配

XSSFWorkbook workbook = new XSSFWorkbook();

and

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

If you really want to generate a .xls older-style Excel workbook, you need to change the first line to be HSSFWorkbook rather than XSSFWorkbook

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

If you do mean to generate a .xlsx Excel workbook, then the content type on the second line needs to be the correct .xlsx one, which would be:

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

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

#2


0  

You might consider opening it "As Adminstrator". According to this ( https://superuser.com/questions/401714/how-do-i-resolve-the-error-excel-found-unreadable-content-in-filename ) its a work around.

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

#1


3  

Your problem is the mis-match of these two lines

你的问题是这两行不匹配

XSSFWorkbook workbook = new XSSFWorkbook();

and

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

If you really want to generate a .xls older-style Excel workbook, you need to change the first line to be HSSFWorkbook rather than XSSFWorkbook

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

If you do mean to generate a .xlsx Excel workbook, then the content type on the second line needs to be the correct .xlsx one, which would be:

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

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

#2


0  

You might consider opening it "As Adminstrator". According to this ( https://superuser.com/questions/401714/how-do-i-resolve-the-error-excel-found-unreadable-content-in-filename ) its a work around.

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