0 0

struts2 解析 excel 读取不到数据源10

import java.io.FileInputStream;
import java.io.InputStream;

import jxl.Workbook;


path = "E:\\apache-tomcat-6.0.30\\apache-tomcat-6.0.30\\webapps\\shop\\file\\blocation2.xls";
        InputStream ins = new FileInputStream(path);
    Workbook rwb = Workbook.getWorkbook(ins);


我的inputStream 就没有获取到值 -1  不知道这是为什么

我的blocation2.xls的路径是没有问题的  但是 inputStream获取不到 ,到workbook读取的时候就会报错java.lang.StringIndexOutOfBoundsException: String index out of range: 120  请大家帮忙看下  谢谢!!

问题补充:后续怎么解析 这些 暂不考虑 请大家 看好问题 我的inputStream获取不到我绝对路径对应的excel  请针对这个问题 给出解决办法 ,请不要一味的给出创建excel  等等等等  我现暂考虑解析 只想获取到我准备好的excel 然后 导入我的工作薄里 workbook !!  谢谢
2012年7月09日 14:32

6个答案 按时间排序 按投票排序

0 0

百合花[flash=200,200][/flash][url][/url]

2012年7月09日 23:38
0 0

这个不是路径的问题,是字符串索引越界了,你想要寻找到字符串中120个字符,但是实际上你的字符串没有120个字符。
这个不是取不到数据源的问题,debug一下看看。

2012年7月09日 21:04
0 0

path = "E:\\apache-tomcat-6.0.30\\apache-tomcat-6.0.30\\webapps\\shop\\file\\blocation2.xls";
        InputStream ins = new FileInputStream(path);
修改成:
   InputStream ins = new FileInputStream(new File(path));

看看能不能行

2012年7月09日 18:01
0 0

字符串索引取值超出范围

2012年7月09日 14:49
0 0

下面这个是我写的一个通用的excel读取,基于poi3.6写的,主要是read方法,注释写得很详细直接用应该就OK。

package com.dp.util;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

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.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.dp.dto.AreaMap;
import com.dp.dto.GuoJiDto;
/**
 * Excel通用处理器
 * @author jkxydp
 *
 */
public class AllPurposeExcelProcesser {
	/**
	 * 通过调用POI读Excel的较为通用的方式,其中约定:excel的第一行中每列的内容为字符串,并且与你定义的model中的字段相对应,你的类遵循JavaBean标准
	 * @param <T> 你希望读取后组装的数据结构定义
	 * @param excel	你要读取的文件
	 * @param modelType 你希望组装的数据的定义的字节码,该字节码描述中必须包含一个无参构造器
	 * @param sheetName 你要读取的文件中的工作表的名称
	 * @return	一个装载了读取后获得对象的List
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws IllegalArgumentException
	 * @throws SecurityException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public static <T> List<T> read(File excel,Class<T> modelType,String sheetName) throws FileNotFoundException, IOException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
		Method[] methods = modelType.getMethods();
		Workbook wb = getWorkBook(excel);
		if(wb == null)
			return null;
		List<T> models = new ArrayList<T>();	//创建容器,用于装置所有读取出来的model
		Sheet sheet = wb.getSheet(sheetName);	//根据提供的sheet名称拿到整张表
		int rows = sheet.getPhysicalNumberOfRows();System.out.println(rows);
		Row zeroRow = sheet.getRow(0);	//拿到第零行表格,解析列与字段之间的对应关系
		Map<Integer,Method> colMark = new HashMap<Integer, Method>();	//存储方法与字段的对应关系
		for(short i = 0; i < zeroRow.getLastCellNum(); i ++){
			Cell tip = zeroRow.getCell(i);
			if(null != tip && tip.getCellType() == Cell.CELL_TYPE_STRING) {
				String curTipName = tip.getStringCellValue();
				for(int j = 0; j < methods.length; j ++) {
					if(("set" + curTipName.toUpperCase().charAt(0) + curTipName.substring(1)).equals(methods[j].getName())) {
						colMark.put((int)i, methods[j]);
						break;
					}
				}
			}
		}
		Cell curCell = null;
		boolean flag = true;
		for(int i = 1; i < rows - 1; i ++) {
			Row aModel = sheet.getRow(i);
			if(null != aModel) {
				T model = modelType.getConstructor().newInstance();
				for(int col = 0; col < colMark.size(); col ++) {
					curCell = aModel.getCell(col);
					if(null != curCell){
						switch (curCell.getCellType()) {
						case Cell.CELL_TYPE_STRING:
						case Cell.CELL_TYPE_BLANK:
							  if(colMark.get(col).getParameterTypes()[0] == String.class) {
								  colMark.get(col).invoke(model, curCell.getStringCellValue());
							  } else {
									flag = false;
							  }
							  break;
						case Cell.CELL_TYPE_FORMULA:
							 if(colMark.get(col).getParameterTypes()[0] == String.class) {
								 colMark.get(col).invoke(model, Integer.toString((int)Math.round(curCell.getNumericCellValue())));
							  } else {
									flag = false;
							  }
							  break;
						
						case Cell.CELL_TYPE_NUMERIC:
							if(colMark.get(col).getParameterTypes()[0] == int.class || colMark.get(col).getParameterTypes()[0] == Integer.class) {
							  colMark.get(col).invoke(model, (int)Math.round(curCell.getNumericCellValue()));
							} else if (colMark.get(col).getParameterTypes()[0] == Double.class || colMark.get(col).getParameterTypes()[0] == double.class) {
								colMark.get(col).invoke(model, curCell.getNumericCellValue());
							} else if(colMark.get(col).getParameterTypes()[0] == Float.class || colMark.get(col).getParameterTypes()[0] == float.class) {
								colMark.get(col).invoke(model, (float)curCell.getNumericCellValue());
							} else if(colMark.get(col).getParameterTypes()[0] == Long.class || colMark.get(col).getParameterTypes()[0] == long.class) {
								colMark.get(col).invoke(model, Math.round(curCell.getNumericCellValue()));
							} else if(colMark.get(col).getParameterTypes()[0] == Short.class || colMark.get(col).getParameterTypes()[0] == short.class) {
								colMark.get(col).invoke(model, (short)Math.round(curCell.getNumericCellValue()));
							} else if(colMark.get(col).getParameterTypes()[0] == Byte.class || colMark.get(col).getParameterTypes()[0] == byte.class) {
								colMark.get(col).invoke(model, (byte)Math.round(curCell.getNumericCellValue()));
							} else if(colMark.get(col).getParameterTypes()[0] == Date.class) {
								colMark.get(col).invoke(model, curCell.getDateCellValue());
							} else if(colMark.get(col).getParameterTypes()[0] == String.class){
								colMark.get(col).invoke(model, Integer.toString((int)Math.round(curCell.getNumericCellValue())));
							}else {
								flag = false;
							}
						  	break;
						case Cell.CELL_TYPE_BOOLEAN:
							if(colMark.get(col).getParameterTypes()[0] == Boolean.class || colMark.get(col).getParameterTypes()[0] == boolean.class) {
							  colMark.get(col).invoke(model, curCell.getBooleanCellValue());
							} else {
								flag = false;
							}
						  	break;
						default:
							break;
						}
						if(!flag) break;
					}
				}
				if(flag) models.add(model);
				flag = true;
			}
		}
		return models;
	}
	/**
	 *	Excel处理2003与2007差异
	 */
	private static Workbook getWorkBook(File excel) throws FileNotFoundException, IOException {
		return excel.getName().endsWith("xls") ? 
				new HSSFWorkbook(new BufferedInputStream(new FileInputStream(excel))) : 
					excel.getName().endsWith("xlsx") ? 
							new XSSFWorkbook(new BufferedInputStream(new FileInputStream(excel))):null;
	}
	
	public static void main(String[] args) throws FileNotFoundException, IllegalArgumentException, SecurityException, IOException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		//下面是通过excel生成sql语句的方式
		List<GuoJiDto> areaSqlDtos = AllPurposeExcelProcesser.read(new File("D:/jkxydp/2012/03/09/国籍代码表.xls"), GuoJiDto.class, "Sheet2");
		/*StringBuilder sb = new StringBuilder();
		for(GuoJiDto gj : areaSqlDtos) {
			sb.append("|");
			sb.append(gj.toString());
		}
		System.out.println(sb.toString());*/
		JSONArray areaArray = new JSONArray();
		areaArray.addAll(areaSqlDtos);
		System.out.println(areaArray.toString());
		/*	JSONArray areaArray = new JSONArray();
		areaArray.addAll(areaSqlDtos);
		String areaJson = areaArray.toString();	//
		System.out.println(areaSqlDtos.size());
		System.out.println(areaJson);*/
		
		/*File sqlFile = new File("D:/jkxydp/2011-11/15/城市及区号.sql");
		File jsonFile = new File("D:/jkxydp/2011-11/15/城市及区号.js");
		BufferedWriter out = new BufferedWriter(new FileWriter(sqlFile));
		BufferedWriter out1 = new BufferedWriter(new FileWriter(jsonFile));
		Iterator<AreaSqlDto> it = areaSqlDtos.iterator();
		out1.append("[");
		while (it.hasNext()) {
			AreaSqlDto asd = it.next();
			out.append(asd.toInsertSql() + "\r\n");
			out1.append(asd.toJsonString()).append(",\r\n ");
		}
		out1.append("]");
		out.flush();
		out.close();
		out1.flush();
		out1.close();*/
		
		
		/*Map<String, List<String>> m = new HashMap<String, List<String>>();
		List<String> s = new ArrayList<String>();
		s.add("广州市-粤A-021");
		s.add("深圳市-粤B-xxx");
		m.put("广东", s);
		JSONObject jo = new JSONObject();
		jo.accumulateAll(m);
		System.out.println(jo.toString());
		toMapJson(areaSqlDtos);*/
	}
	
	public static void toMapJson(List<AreaMap> areaMapList) throws IOException {
		Map<String, List<String>> aMap = new HashMap<String, List<String>>();
		Iterator<AreaMap> iAreaMapList = areaMapList.iterator();
		while(iAreaMapList.hasNext()) {
			AreaMap am = iAreaMapList.next();
			String key = am.getProvince();
			List<String> values = aMap.get(key);
			if(values == null) {
				values = new ArrayList<String>();
				values.add(am.toString());
				aMap.put(key, values);
			} else {
				values.add(am.toString());
			}
		}
		JSONObject jo = new JSONObject();
		jo.accumulateAll(aMap);
		File jsonFile = new File("D:/jkxydp/2011-11/25/proviceCityJson.js");
		BufferedWriter out = new BufferedWriter(new FileWriter(jsonFile));
		out.write(jo.toString());
		out.flush();
		out.close();
	}
}

2012年7月09日 14:48
0 0

http://javabigcat.iteye.com/blog/1032577

2012年7月09日 14:40

相关推荐

    struts2+hibernate实现的网站

    这可能涉及使用Apache POI库解析Excel文件,读取数据,并通过Hibernate批量插入到数据库中。开发者需要处理Excel格式的不同版本,以及数据验证和异常处理。 视频播放功能意味着网站包含了多媒体内容的处理。这通常...

    简单的SSH三层架构+Ajax实现Google自动搜索极为相似版+直接Excel导入数据库

    1. 使用Java库如Apache POI来读取Excel文件,解析其内容。 2. 将Excel数据转换为与数据库表结构匹配的对象集合。 3. 使用Hibernate或JDBC将这些对象批量保存到数据库中,可能需要处理事务以确保数据的一致性。 **...

    使用freemarker生成word文档,源代码+jar包+说明文档及注意事项

    使用freemarker生成word ,并集成struts2 同时生成及下载文档 资料附有Java源代码和自己总结的使用说明及注意事项 大至预览如下: 1、用word编辑好模板 普通字符串替换为 ${string} 表格循环用标签 姓名:${...

    ssh三大框架整合及导入导出下载功能大全

    数据的导入功能通常涉及读取外部文件(如CSV、Excel或XML),解析数据,然后通过Hibernate的API创建或更新数据库记录。导出功能则相反,它需要从数据库中查询数据,格式化为特定的文件格式,然后提供给用户下载。 ...

    Spring API

    使用@ModelAttribute提供一个从模型到数据的链接 13.12.6. 使用@SessionAttributes指定存储在会话中的属性 13.12.7. 自定义WebDataBinder初始化 13.13. 更多资源 14. 集成视图技术 14.1. 简介 14.2. JSP和...

    Spring中文帮助文档

    使用@ModelAttribute提供一个从模型到数据的链接 13.12.6. 使用@SessionAttributes指定存储在会话中的属性 13.12.7. 自定义WebDataBinder初始化 13.13. 更多资源 14. 集成视图技术 14.1. 简介 14.2. JSP和...

    Spring-Reference_zh_CN(Spring中文参考手册)

    配置子报表数据源 14.7.5. 配置Exporter的参数 15. 集成其它Web框架 15.1. 简介 15.2. 通用配置 15.3. JavaServer Faces 15.3.1. DelegatingVariableResolver 15.3.2. FacesContextUtils 15.4. Struts 15.4.1. ...

    spring chm文档

    14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的参数 15. 集成...

    Spring 2.0 开发参考手册

    目录 前言 1. 简介 1.1. 概览 1.2. 使用场景 2. Spring 2.0 的新特性 2.1. 简介 ... 源代码级的元数据类型 20.3.5. 接口AutodetectCapableMBeanInfoAssembler 20.3.6. 用Java接口定义管理接口 ...

Global site tag (gtag.js) - Google Analytics