java解析excel存入map,java poi 读取excel数据 存入hashMap中

用户提问

读一个excel表 ,表中有两纵 (两个竖行)一纵为key 一纵为value 因为我要用这个map向另一个excel中写这些value 但是要通过key获取 含有key的话才写入,怎么才能把这表里全部数据(后期维护可能会增加)都读出来 ,存入map中 第一纵为key 第二纵为value

hm1(1,a);

hm2(2,b);

hm3(3,c);

.......

我在网上找到一种 但是 返回的hm.size()=0;循环可能有问题 但我想不出其他的方法了还希望大侠们 帮帮忙..分不多 谢谢了..

代码如下

public static HashMap getEnglishName (String path){

HashMap hm = new HashMap();

ArrayList chinese = new ArrayList();

ArrayList english = new ArrayList();

try {

InputStream is = new FileInputStream(path);

HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);

for(int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++){

HSSFSheet hssfSheet = hssfWorkbook.getSheetAt( numSheet);

if(hssfSheet == null){

continue;

}

for(int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++){

HSSFRow hssfRow = hssfSheet.getRow( rowNum);

if(hssfRow == null){

continue;

}

// 循环列Cell 获取key

for(int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum+=2){

HSSFCell hssfCell = hssfRow.getCell((short)cellNum);

chinese.add(getValue(hssfCell));

if(hssfCell == null){

continue;

}

}

//获取 value

for(int cellNum = 1; cellNum <= hssfRow.getLastCellNum(); cellNum+=2){

HSSFCell hssfCell = hssfRow.getCell((short)cellNum);

english.add(getValue(hssfCell));

if(hssfCell == null){

continue;

}

}

}

}

for(int i = 0;i

hm.put(chinese.get(i), english.get(i));

}

} catch (Exception e) {

// TODO: handle exception

}

return hm;

}

@SuppressWarnings({ "static-access", "deprecation" })

private static String getValue(HSSFCell hssfCell)throws WriteException{

if(hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN){

return String.valueOf( hssfCell.getBooleanCellValue());

}else if(hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC){

return String.valueOf( hssfCell.getNumericCellValue());

}else{

return String.valueOf( hssfCell.getStringCellValue());

}

}

我写的代码不好使, 就是请大家 给我一段好使的代码 能读取excel 数据 的 像上面说的那样 装入 map中 能实现吗? 不能实现的话也请大家告诉我下....

推荐答案

大致看了一下代码,你这个可是把所有的sheet都遍历完把数据放入map里哦。

你的代码是弄了两个for循环,第一次是循环第一列,第二次循环第二列。

既然你是要放入map,干嘛去弄两个list一个放key,一个放value,然后在遍历这两个list把数据分别置为map的key和value呢?这样是不是有点多余呀?

建议你改成双重for循环,一次就可以将数据放入map了。

如果没明白,我再给你写代码。

辅助答案

用户:2306776537@qq.com

2012年10月20日

// 循环列Cell 获取key

for(int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum+=2){

HSSFCell hssfCell = hssfRow.getCell((short)cellNum);

chinese.add(getValue(hssfCell));

if(hssfCell == null){

continue;

}

}

//获取 value

for(int cellNum = 1; cellNum <= hssfRow.getLastCellNum(); cellNum+=2){

HSSFCell hssfCell = hssfRow.getCell((short)cellNum);

english.add(getValue(hssfCell));

if(hssfCell == null){

continue;

}

}

这一部分写得有问题。按你的逻辑,判断是不是为null应该在

chinese.add(getValue(hssfCell));

或是

english.add(getValue(hssfCell));

之前进行判断,你为0的原因就是出现了null没有判断出来,出现了导常。

--------------------------------------------------------------------------------------------------------------------------------

你的那两个list有些多余,下边是我给你简化以后的代码。

--------------------------------------------------------------------------------------------------------------------------------

import java.io.FileInputStream;

import java.io.InputStream;

import java.util.HashMap;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class Excel {

public static void main(String[] args) {

HashMap map = getEnglishName("D:\\test.xls");

System.out.println(map.size());

}

public static HashMap getEnglishName(String path) {

HashMap hm = new HashMap();

try {

InputStream is = new FileInputStream(path);

HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);

for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {

HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);

if (hssfSheet == null) {

continue;

}

for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {

HSSFRow hssfRow = hssfSheet.getRow(rowNum);

if (hssfRow == null) {

continue;

}

HSSFCell keyCell = hssfRow.getCell(0);

HSSFCell valCell = hssfRow.getCell(1);

hm.put(getValue(keyCell), getValue(valCell));

}

}

} catch (Exception e) {

// TODO: handle exception

System.out.println(e.getMessage());

}

return hm;

}

@SuppressWarnings( { "static-access", "deprecation" })

private static String getValue(HSSFCell hssfCell) throws Exception {

if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {

return String.valueOf(hssfCell.getBooleanCellValue());

} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {

return String.valueOf(hssfCell.getNumericCellValue());

} else {

return String.valueOf(hssfCell.getStringCellValue());

}

}

}

用户:lk712129

2012年11月23日

没看明白是什么问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值