POI HSSF读写Excel问题

hchzju 2009-09-17 09:26:57
附件中是个Excel2003可以打开的文件(https://issues.apache.org/bugzilla/attachment.cgi?id=24273),但是用POI HSSF读取该文件不作任何操作然后保存为另一个文件,则新生成的文件用Excel2003打开会有以下错误:

POI版为3.2final,并且在最新的3.5dev以及3.8beta版都试过,都是不行

"Excel found unreadable content in "testUnreadablenew.xls". Do you want to recover the contents of this workbook?..."

然后实际恢复之后,文件中丢失了数据。下面是代码:


FileInputStream fis = null;
HSSFWorkbook wb = null;
try{
File f = new File("testUnreadable.xls");
if (f.exists()){
fis = new FileInputStream(f);
wb = new HSSFWorkbook(fis);
}
}catch (Throwable th){}
finally{
if (fis != null){
fis.close();
}
}
FileOutputStream stream = null;
try{
stream = new FileOutputStream("New.xls");
wb.write(stream);
}catch (Exception e){}
finally{
if (stream != null)
{
stream.close();
}
}


有谁碰到过类似问题么,谢谢~
...全文
267 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
myloveyoyo1314 2009-10-09
  • 打赏
  • 举报
回复
估计和 poi没关系吧 况且 你也没有用到啊
zhanghua4109 2009-10-09
  • 打赏
  • 举报
回复
String excelfile = Util.null2String(req.getParameter("excelfile"));
ExcelFile ef = null;
ExcelSheet sheetvalues = null;
ExcelRow rowvalues = null;
HSSFWorkbook wb = null;
HSSFSheet sheets = null;
HSSFRow rows = null;
HSSFCell cells = null;
HSSFCellStyle cellStyle = null;
if(excelfile.equals(""))
ef = (ExcelFile)req.getSession(true).getAttribute("ExcelFile");
else
ef = (ExcelFile)req.getSession(true).getAttribute(excelfile);
if(ef == null)
return;
wb = new HSSFWorkbook();
initStyle(ef, wb);
int sheetindex = 0;
while(ef.next())
{
String sheetname = ef.getSheetname();
sheetvalues = ef.getSheet();
if(sheetvalues != null)
{
sheets = wb.createSheet();
wb.setSheetName(sheetindex, Util.fromScreen(sheetname), (short)1);
sheetindex++;
for(int i = 0; i < sheetvalues.size(); i++)
{
rowvalues = sheetvalues.getExcelRow(i);
if(rowvalues != null)
{
short rowheight = rowvalues.getHight();
rows = sheets.createRow((short)i);
if(rowheight != 255)
rows.setHeightInPoints(rowheight);
int rowcellindex = 0;
boolean hasstyle = false;
boolean hasspan = false;
if(rowvalues.stylesize() == rowvalues.size())
hasstyle = true;
if(rowvalues.spansize() == rowvalues.size())
hasspan = true;
for(int j = 0; j < rowvalues.size(); j++)
{
cells = rows.createCell((short)rowcellindex);
String cellvalues = Util.null2String(rowvalues.getValue(j));
String cellvalueh = cellvalues.substring(0, 2);
String cellvaluev = cellvalues.substring(2);
if(cellvalueh.indexOf("s_") == 0)
{
cells.setEncoding((short)1);
cells.setCellValue(Util.fromHtmlToEdit(cellvaluev));
} else
if(cellvalueh.indexOf("i_") == 0)
{
int tempvalue = Util.getIntValue(cellvaluev);
if(tempvalue != 0)
cells.setCellValue(tempvalue);
} else
if(cellvalueh.indexOf("f_") == 0)
{
float tempvalue = Util.getFloatValue(cellvaluev);
if((double)tempvalue != 0.0D)
cells.setCellValue(tempvalue);
} else
if(cellvalueh.indexOf("d_") == 0)
{
double tempvalue = Util.getDoubleValue(cellvaluev);
if(tempvalue != 0.0D)
cells.setCellValue(tempvalue);
} else
if(cellvalueh.indexOf("o_") == 0)
cells.setCellFormula(cellvaluev);
else
if(cellvalueh.indexOf("n_") == 0)
if(Util.getDoubleValue(cellvaluev, -9999.9899999999998D) == -9999.9899999999998D)
{
cells.setEncoding((short)1);
cells.setCellValue(Util.fromHtmlToEdit(cellvaluev));
} else
{
double tempvalue = Util.getDoubleValue(cellvaluev);
if(tempvalue != 0.0D)
cells.setCellValue(tempvalue);
}
if(hasstyle)
{
String stylename = Util.null2String(rowvalues.getStyle(j));
if(!stylename.equals(""))
{
cellStyle = getStyle(stylename);
if(cellStyle != null)
cells.setCellStyle(cellStyle);
}
}
if(hasspan)
{
int rowspan = rowvalues.getSpan(j);
if(rowspan > 1)
{
for(int k = 0; k < rowspan - 1; k++)
{
rowcellindex++;
cells = rows.createCell((short)rowcellindex);
cells.setCellValue("");
if(hasstyle && cellStyle != null)
cells.setCellStyle(cellStyle);
}

sheets.addMergedRegion(new Region(i, (short)((rowcellindex + 1) - rowspan), i, (short)rowcellindex));
}
}
rowcellindex++;
}

}
}

for(int i = 0; i < sheetvalues.columnsize(); i++)
sheets.setColumnWidth((short)i, sheetvalues.getColumnwidth(i));

}
}
String filename = ef.getFilename();
res.setHeader("content-disposition", "attachment; filename=" + filename);
ServletOutputStream out = res.getOutputStream();
res.setContentType("application/octet-stream");
wb.write(out);
out.flush();
out.close();
shiyiwan 2009-09-18
  • 打赏
  • 举报
回复
应该是xls文件太复杂了,我测试也是同样的结果

但是换成一个不带格式的简单xls文件用同样的代码测试通过了。


POI 3.2 FINAL
luxiaoshuai 2009-09-18
  • 打赏
  • 举报
回复
没用过这个...Mark一个...
凡员外 2009-09-18
  • 打赏
  • 举报
回复
POI版为3.2final

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧