java poi 读取excel数据 存入hashMap中
读一个excel表,表中有两纵(两个竖行)一纵为key一纵为value因为我要用这个map向另一个excel中写这些value但是要通过key获取含有key的话才写入,怎...
读一个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<String, String> getEnglishName (String path){
HashMap<String, String> hm = new HashMap<String, String>();
ArrayList<String> chinese = new ArrayList<String>();
ArrayList<String> english = new ArrayList<String>();
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<chinese.size();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中 能实现吗? 不能实现的话也请大家告诉我下.... 展开
hm1(1,a);
hm2(2,b);
hm3(3,c);
.......
我在网上找到一种 但是 返回的hm.size()=0;循环可能有问题 但我想不出其他的方法了还希望大侠们 帮帮忙..分不多 谢谢了..
代码如下
public static HashMap<String, String> getEnglishName (String path){
HashMap<String, String> hm = new HashMap<String, String>();
ArrayList<String> chinese = new ArrayList<String>();
ArrayList<String> english = new ArrayList<String>();
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<chinese.size();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了。
如果没明白,我再给你写代码。
你的代码是弄了两个for循环,第一次是循环第一列,第二次循环第二列。
既然你是要放入map,干嘛去弄两个list一个放key,一个放value,然后在遍历这两个list把数据分别置为map的key和value呢?这样是不是有点多余呀?
建议你改成双重for循环,一次就可以将数据放入map了。
如果没明白,我再给你写代码。
追问
其实我写的是对的,只是刚刚没弄明白 循环单元格是没用的...我改了代码 好像也不是你说的那种.
不过还是很感谢...
追答
按照你的代码意思,我只改了你的try...catch...里的代码:
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;
}
// 循环列Cell 获取key
for (int hang = 0; hang <= hssfSheet.getLastRowNum(); hang ++) {
// 获取 value
HSSFRow hssfRow = hssfSheet.getRow(hang);
for (int lie = 0; lie < hssfRow.getLastCellNum(); lie+=2) {
String key = String.valueOf(hssfRow.getCell(lie));
String value = getValue(hssfRow.getCell(lie+1));
hm.put(key, value);
}
}
}
然后把那个chineselist和englishlist删掉就OK了。。
展开全部
没看明白是什么问题
追问
读一个excel 把数据装入map中 ,这个excel 中就两纵 就像那个图,,第一纵为map中的key 第二纵为value 没一行就是一个map
能实现吗 我看没人回答啊..
追答
...
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;
}
// 循环列Cell 获取key ,只有两列 简单 直接使用 0 和1
for(int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++){
HSSFRow hssfRow = hssfSheet.getRow( rowNum);
if(hssfRow == null){
continue;
}
hm.put(getValue(hssfRow.getCell((short)0)),hssfRow.getCell((short)1)));
}
}...
return hm;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
// 循环列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<String, String> map = getEnglishName("D:\\test.xls");
System.out.println(map.size());
}
public static HashMap<String, String> getEnglishName(String path) {
HashMap<String, String> hm = new HashMap<String, String>();
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());
}
}
}
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<String, String> map = getEnglishName("D:\\test.xls");
System.out.println(map.size());
}
public static HashMap<String, String> getEnglishName(String path) {
HashMap<String, String> hm = new HashMap<String, String>();
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());
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询