Sheet index (0) is out of range (0..-1) POI操作Excel错误

BUG胡汉三
博客专家认证
2011-05-19 10:00:01
系统架构:Struts2.1.8、Spring2.5、Hibernate3.0
使用poi.jar包操作Excel报错!
poi.jar:
poi-3.7-20101029.jar
poi-examples-3.7-20101029.jar
poi-ooxml-3.7-20101029.jar
poi-ooxml-schemas-3.7-20101029.jar
poi-scratchpad-3.7-20101029.jar

导入文件页面代码:

<s:form action="userInfo" method="post" enctype="multipart/form-data">
导入Excel文件:<s:file name="excelFile"></s:file> <br/>
<s:submit value="导入"></s:submit>
</s:form>


后台Userinfo类属性跟get/set方法省略。
ExcelWorkSheet类:

package com.boxun.bean;

import java.util.ArrayList;

import java.util.List;

import org.apache.poi.hssf.record.formula.functions.T;

public class ExcelWorkSheet<T> {
private String sheetName;
private List<T> data = new ArrayList<T>(); //数据行
private List<String> columns; //列名
public String getSheetName() {
return sheetName;
}
public void setSheetName(String sheetName) {
this.sheetName = sheetName;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
public List<String> getColumns() {
return columns;
}
public void setColumns(List<String> columns) {
this.columns = columns;
}

}


UserAction:

package com.boxun.action;

import java.io.File;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.boxun.bean.ExcelWorkSheet;
import com.boxun.bean.Userinfo;
import com.boxun.biz.IUserBiz;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
private IUserBiz userBiz;
public void setUserBiz(IUserBiz userBiz) {
this.userBiz = userBiz;
}

private File excelFile; //上传的文件

private String excelFileFileName; //保存原始文件名

//将Excel文件解析完毕后信息存放到这个对象中
private ExcelWorkSheet<Userinfo> excelWorkSheet;

public File getExcelFile() {
return excelFile;
}

public void setExcelFile(File excelFile) {
this.excelFile = excelFile;
}

public String getExcelFileFileName() {
return excelFileFileName;
}

public void setExcelFileFileName(String excelFileFileName) {
this.excelFileFileName = excelFileFileName;
}

public ExcelWorkSheet<Userinfo> getExcelWorkSheet() {
return excelWorkSheet;
}

public void setExcelWorkSheet(ExcelWorkSheet<Userinfo> excelWorkSheet) {
this.excelWorkSheet = excelWorkSheet;
}



//判断文件类型
public Workbook createWorkBook(InputStream is) throws IOException{
if(excelFileFileName.toLowerCase().endsWith("xls")){
return new HSSFWorkbook();
}
if(excelFileFileName.toLowerCase().endsWith("xlsx")){
return new XSSFWorkbook();
}
return null;
}

public String execute() throws Exception{
Workbook book = createWorkBook(new FileInputStream(excelFile));
Sheet sheet = book.getSheetAt(0); //在这一行的时候报错
excelWorkSheet = new ExcelWorkSheet<Userinfo>();
//保存工作单名称
Row firstRow = sheet.getRow(0);
Iterator<Cell> iterator = firstRow.iterator();

//保存列名
List<String> cellNames = new ArrayList<String>();
while (iterator.hasNext()) {
cellNames.add(iterator.next().getStringCellValue());
}
excelWorkSheet.setColumns(cellNames);

for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row ros = sheet.getRow(i);
Userinfo user = new Userinfo();
user.setId((int)ros.getCell(0).getNumericCellValue());
user.setName(ros.getCell(1).getStringCellValue());
user.setPass(ros.getCell(2).getStringCellValue());
user.setLastname(ros.getCell(3).getStringCellValue());
user.setAddres(ros.getCell(4).getStringCellValue());
user.setRemark(ros.getCell(5).getStringCellValue());
excelWorkSheet.getData().add(user);
}
for (int i = 0; i < excelWorkSheet.getData().size(); i++) {
Userinfo info = excelWorkSheet.getData().get(i);
System.out.println(info.getLastname());
}
return SUCCESS;
}




}


Struts2配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.ui.theme" value="simple"></constant>
<package name="excelOutPut" extends="struts-default">
<action name="userInfo" class="userAction">
<result>/excel/InputExcel.jsp</result>
</action>
</package>
</struts>


打印异常:

java.lang.IllegalArgumentException: Sheet index (0) is out of range (0..-1)
org.apache.poi.hssf.usermodel.HSSFWorkbook.validateSheetIndex(HSSFWorkbook.java:403)
org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheetAt(HSSFWorkbook.java:781)
org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheetAt(HSSFWorkbook.java:88)
com.boxun.action.UserAction.execute(UserAction.java:76)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)



excel文件:

编号 用户名 密码 真实姓名 地址 备注
5 3135 123 博讯 贵阳 诗人
6 8634 456 一生 平安 好人
7 7255 245 天天 向上 学习


Debug的时候、到Sheet sheet = book.getSheetAt(0); 这行就报错。

各位给看看!感激不尽!!!

...全文
12675 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
BUG胡汉三 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 keli88 的回复:]
引用 2 楼 hzw2312 的回复:
引用 1 楼 bluesky_leon 的回复:
//判断文件类型
public Workbook createWorkBook(InputStream is) throws IOException{
if(excelFileFileName.toLowerCase().endsWith("xls")){
return new HSSFWorkbo……
[/Quote]


//判断文件类型
public Workbook createWorkBook(InputStream is) throws IOException{
if(excelFileFileName.toLowerCase().endsWith("xls")){
return new HSSFWorkbook(is);
}
if(excelFileFileName.toLowerCase().endsWith("xlsx")){
return new XSSFWorkbook(is);
}
return null;
}

return new HSSFWorkbook(is);
这个地方是忘记把流对象放进去了!
oneonepoe 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hzw2312 的回复:]
引用 1 楼 bluesky_leon 的回复:
//判断文件类型
public Workbook createWorkBook(InputStream is) throws IOException{
if(excelFileFileName.toLowerCase().endsWith("xls")){
return new HSSFWorkbook();
}
if(excelFil……
[/Quote]
这个地方是错的,怎么改啊.......
jiangweiwen0 2011-07-29
  • 打赏
  • 举报
回复
java.lang.IllegalArgumentException: Sheet index (0) is out of range (0..-1)
org.apache.poi.hssf.usermodel.HSSFWorkbook.validateSheetIndex(HSSFWorkbook.java:403)
org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheetAt(HSSFWorkbook.java:781)
org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheetAt(HSSFWorkbook.java:88)
com.boxun.action.UserAction.execute(UserAction.java:76)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)




我也爆这个错,是路径不对
Luciferoffans 2011-05-19
  • 打赏
  • 举报
回复
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("sheet1");

HSSFRow row = sheet.createRow(6);
HSSFCell cell=null;
HSSFCellStyle style = wb.createCellStyle();
String[] str={"序号","姓","名","年龄"};
for(int i=0;i<str.length;i++){
cell = row.createCell((short)i);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(str[i]);
你在构造单元格的时候,设置下celL的编码,红色文字部分。
BUG胡汉三 2011-05-19
  • 打赏
  • 举报
回复
return new HSSFWorkbook(加上is);
user.setName(ros.getCell(1).getStringCellValue());
报错是因为这一列的数据我填充的是3135这是个数字!不是字符串、所以它要报错! 真想艹一个!!!
要么改成getNumber、要么把表格中的数据加上一个字符。


BUG胡汉三 2011-05-19
  • 打赏
  • 举报
回复
单元格内容是数字、用String还取不了还!!!
无语~~~!!!
BUG胡汉三 2011-05-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bluesky_leon 的回复:]
//判断文件类型
public Workbook createWorkBook(InputStream is) throws IOException{
if(excelFileFileName.toLowerCase().endsWith("xls")){
return new HSSFWorkbook();
}
if(excelFileFileName.toLowe……
[/Quote]
汗死就是这里、我忘记把对象放进构造里面去了!!!不报错就有鬼了!!!
可是下面还有错误:java.lang.IllegalStateException: Cannot get a text value from a numeric cell

在这一句:user.setName(ros.getCell(1).getStringCellValue());
Bluesky_Leon 2011-05-19
  • 打赏
  • 举报
回复
//判断文件类型
public Workbook createWorkBook(InputStream is) throws IOException{
if(excelFileFileName.toLowerCase().endsWith("xls")){
return new HSSFWorkbook();
}
if(excelFileFileName.toLowerCase().endsWith("xlsx")){
return new XSSFWorkbook();
}
return null;
}

这个方法写的有问题,InputStream is这个参数没有使用,应该打开文件,而不是new一个workbook,具体代码不记得了,自己看下api

81,122

社区成员

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

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