java poi读取excel,2147483647问题

读取excel文件的时候,某些单元格是数字,但是可能超过10位,例如电话号码,读取之后会变为2147483647,改变下读取的长度就好了。例如value +=  (long) cell.getNumericCellValue() + separate;如果long改为int就会出现这个问题,因为int接收最大长度为10位数,最大长度为2147483647,所以int改为long就好了。

以下为详细代码:

package poi_import_excel;


import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;


import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


public class poi_import_excel {


public static void main(String[] args){

List<String> allExcel= readExcel("D:/Interface/interface.xls","|");

int max = allExcel.size();

System.out.println(max);

for(int i = 0 ;i < max ;i++){
System.out.println(allExcel.get(i));
}
}


public static List<String> readExcel(String filePath, String separate) {
 
List<String> person=new ArrayList<>();
 
        // 创建对Excel工作簿文件的引用
        try {
            HSSFWorkbook wookbook = new HSSFWorkbook(new FileInputStream(filePath));
            // 在Excel文档中,第一张工作表的缺省索引是0
 
            HSSFSheet sheet = wookbook.getSheetAt(0);
 
            // 获取到Excel文件中的所有行数
            int rows = sheet.getPhysicalNumberOfRows();
            int max_cells = 0;
            // 获取最长的列,在实践中发现如果列中间有空值的话,那么读到空值的地方就停止了。所以我们需要取得最长的列。<br>              //如果每个列正好都有一个空值得话,通过这种方式获得的列长会比真实的列要少一列。所以我自己会在将要倒入数据库中的EXCEL表加一个表头<br>              //防止列少了,而插入数据库中报错。
            for (int i = 0; i < rows; i++) {
                HSSFRow row = sheet.getRow(i);
                if (row != null) {
                    int cells = row.getPhysicalNumberOfCells();
                    if (max_cells < cells) {
                        max_cells = cells;
                    }
 
                }
            }
            //System.out.println(max_cells);
            // 遍历行
            for (int i = 1; i < rows; i++) {
            HashMap<String, String> map = new HashMap<String, String>();
                // 读取左上端单元格
                HSSFRow row = sheet.getRow(i);
                // 行不为空
                if (row != null) {
                    String value = "";
                    // 遍历列
                    String b_id = null;
                    for (int j = 0; j < max_cells; j++) {
                        // 获取到列的值
                        HSSFCell cell = row.getCell(j);
                        if (cell == null) {
                            value += "NULL"+separate;
                        } else {
                            switch (cell.getCellType()) {
                            case HSSFCell.CELL_TYPE_FORMULA:
                                try {
                                    value += String.valueOf(cell.getNumericCellValue())+ separate;
                                } catch (IllegalStateException e) {
                                    value += String.valueOf(cell.getRichStringCellValue())+ separate;
                                }
                                break;
                            case HSSFCell.CELL_TYPE_NUMERIC:
                                // 如果有日期的话,那么就读出日期格式
                                // 如果是数字的话,就写出数字格式
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                    SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd");
                                    Date date2 = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                                    String date1 = dff.format(date2);
                                    value +=  date1 + separate;
 
                                } else {
                                //int 的最大值为2147483647,当数字超过10位会有问题,所以此处用long。
                                    value +=  (long) cell.getNumericCellValue() + separate;
                                }
                                break;
                            case HSSFCell.CELL_TYPE_STRING:
                           
                                String ss = cell.getStringCellValue();
                                if (ss == null || "".equals(ss)) {
                                    value = "NULL"+separate;
                                } else {
                                    value += cell.getStringCellValue() + separate;
                                }
 
                                break;
                            default:
                                value += "NULL"+separate;
                                break;
                            }
                           
                        }
 
                         if (j == 0) {
                         
                         b_id = value.substring(1, value.length() - 2);
                         //b_id = b_id.replaceAll("'", "");
                         }
 
                    }
 
                    String valueresult = value.substring(0, value.length() - 1);
                    ((HashMap<String, String>) map).put(b_id, valueresult);
 
                }
                person.add(map.toString());
               
            }


            wookbook.cloneSheet(0);
        } catch (Exception e) {
            e.printStackTrace();
            person.add("error:" + e.toString());
        }
return person;
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值