我使用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();
}
答案 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)来解决它。