poi不能读取excel

rvenric 2010-05-26 12:04:47
我的代码是这样
	
public static void main(String[] args) throws Exception{

String excelText = TestPoi.extractTextFromXLS("D:\\desk\\company\\文档\\AAAA.xls");
System.out.println(excelText);
}


private static String extractTextFromXLS(String path)
throws IOException,Exception {

StringBuffer content = new StringBuffer();
try{
InputStream is = new FileInputStream(path);
HSSFWorkbook workbook = new HSSFWorkbook(is); //创建对Excel工作簿文件的引用

for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
if (null != workbook.getSheetAt(numSheets)) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets); //获得一个sheet

for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {
if (null != aSheet.getRow(rowNumOfSheet)) {
HSSFRow aRow = aSheet.getRow(rowNumOfSheet); //获得一行

for (short cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++) {
if (null != aRow.getCell(cellNumOfRow)) {
HSSFCell aCell = aRow.getCell(cellNumOfRow); //获得列值

if(aCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
content.append(aCell.getNumericCellValue());
}else if(aCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
content.append(aCell.getBooleanCellValue());
}else {
content.append(aCell.getStringCellValue());
}
}
}
}
}
}
}
}catch(org.apache.poi.poifs.filesystem.OfficeXmlFileException e){
content.append(extractTextFromXLS2007(path));
}catch(Exception e){
e.printStackTrace();
}

return content.toString();
}

但是workbook.getNumberOfSheets(); 这里就出错了,也就是HSSFWorkbook workbook = new HSSFWorkbook(is); 这里出不数据来,我把AAAA.xls这个文档另存为另一个文档或者随便修改一点东西,然后程序又正确了,这个是怎么回事啊。我有很多文档啊,不能一个个的另存为啊。
...全文
508 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
caomeiliang 2010-05-27
  • 打赏
  • 举报
回复
断点啊
看在哪一行报的错
我估计是在

HSSFSheet aSheet = workbook.getSheetAt(numSheets); //获得一个sheet
这一行的错误
rvenric 2010-05-27
  • 打赏
  • 举报
回复
我写了一个VBS的批处理去重新另存为那些excel文件了,希望给碰到我这个问题的朋友有个参考
Dim fso, f, f1, fc
Dim startPath,endPath
startPath = inputbox("请输入你要转换EXCEL文件的文件夹位置")
endPath = InputBox("请输入你要保存的文件夹位置")

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(startPath)
Set fc = f.Files
For Each f1 In fc

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open(startPath&f1.name)
objExcel.DisplayAlerts = FALSE
objExcel.Visible = TRUE

Set objWorksheet = objWorkbook.Worksheets("Sheet1")
objWorksheet.SaveAs endPath&f1.name

objExcel.Quit

Next
rvenric 2010-05-26
  • 打赏
  • 举报
回复
但是有很多excel文件,不可能一个个都打开保存一下或另存为一下。
rvenric 2010-05-26
  • 打赏
  • 举报
回复
报这个错。java.lang.IllegalArgumentException: Sheet index (0) is out of range (0..-1),没有开着的。不知道是不是之前生成的这个excel有问题,然后用POI打不开。当把这个excel文件重新保存一下或另存为一下,格式可能就转回正确的了。因此用POI读也就正确了
wj63558595 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shine333 的回复:]

报什么错,是不是office开着,没关?
[/Quote]

应该是这个问题,因为实在想不通还有什么其它问题了
shine333 2010-05-26
  • 打赏
  • 举报
回复
报什么错,是不是office开着,没关?
rvenric 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shine333 的回复:]
你用文本编辑器打开excel看看,是不是xml格式的excel?
[/Quote]

打开看了,是乱码的格式
shine333 2010-05-26
  • 打赏
  • 举报
回复
你用文本编辑器打开excel看看,是不是xml格式的excel?
rvenric 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wj63558595 的回复:]
你试着把 InputStream 流关闭看有用没
[/Quote]
	        InputStream is = new FileInputStream(path);
HSSFWorkbook workbook = new HSSFWorkbook(is); //创建对Excel工作簿文件的引用
is.close();


改成这样了。也不可以的
x_pengcheng 2010-05-26
  • 打赏
  • 举报
回复
帮顶。
wj63558595 2010-05-26
  • 打赏
  • 举报
回复
你试着把 InputStream 流关闭看有用没
ycnanevol 2010-05-26
  • 打赏
  • 举报
回复
HSSF,正如其名

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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