用户提问
读一个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日
没看明白是什么问题