一. 问题背景

在我的项目中,Java基于Easyexcel读取到Excel的值全都是String类型的(没有使用数据结构类),尽管Excel中数字为数值类型,Easyexcel也会读取为String类型返回。当我想将读取到的数据另存为另一个Excel文件时,它写入Excel文件的数值依然是字符串形式的,这将导致我在Excel中没办法对数据进行数值相关函数的计算。

因此,我需要在程序中将所有String类型的数字转化为Double类型,同时原本就为字符串的类型保持不变。

下面我将以这个List为例,来模拟我读入的数据类型:

List<Map<Integer,Object>> list = new ArrayList<Map<Integer,Object>>();
Map<Integer,Object> map1 = new HashMap<Integer, Object>();
map1.put(0, "apple");
map1.put(1, "1");
map1.put(2, "2");
list.add(map1);
Map<Integer,Object> map2 = new HashMap<Integer, Object>();
map2.put(0, "banana");
map2.put(1, "6");
map2.put(2, "7");
list.add(map2);
System.out.println(list);

输出为:

[{0=apple, 1=1, 2=2}, {0=banana, 1=6, 2=7}]

我读入的Excel格式与上面这个格式类似,其中List中每一组Map代表Excel中每一行数据,Map中每一个元素代表每一个单元格的数据,例如上面这个格式的数据在Excel中为:

关于Java读取Excel数据的方法可以参考:【亲测可用】Java基于EasyExcel读取一维及二维Excel数据并存入数组

二. 判断字符串中是否为数字

这里用正则化的方法判断String类型的元素中是否为数字,使用方法如下:

String value = "123";
Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]*");
System.out.println(pattern.matcher(value).matches());

输出为:

true

value = 数字时,pattern.matcher(value).matches()返回true;否则返回false。这里的数字包括整数、小数、正数和负数

三. 循环判断List中数据类型并修改

遍历List和Map,判断Map中每个元素的数据,若为数字则修改数据类型:

Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]*");
for(int i=0;i<list.size();i++)
{
    Map<Integer, Object> map = list.get(i);
    for(int j=0;j<map.size();j++)
    {
        String value = map.get(j).toString();
        if(pattern.matcher(value).matches())
        {
            map.put(j, Double.parseDouble(value));
        }
        else
        {
            map.put(j, value);
        }
    }
    list.set(i, map);
}

四. 完整代码

List<Map<Integer,Object>> list = new ArrayList<Map<Integer,Object>>();
Map<Integer,Object> map1 = new HashMap<Integer, Object>();
map1.put(0, "apple");
map1.put(1, "1");
map1.put(2, "2.090");
list.add(map1);
Map<Integer,Object> map2 = new HashMap<Integer, Object>();
map2.put(0, "banana");
map2.put(1, "6.8979");
map2.put(2, "7");
list.add(map2);
System.out.println("原始:"+list);

Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]*");
for(int i=0;i<list.size();i++)
{
    Map<Integer, Object> map = list.get(i);
    for(int j=0;j<map.size();j++)
    {
        String value = map.get(j).toString();
        if(pattern.matcher(value).matches())
        {
              map.put(j, Double.parseDouble(value));
          }
          else
          {
              map.put(j, value);
          }
    }
    list.set(i, map);
}
System.out.println("处理后:"+list);

输出为:

原始:[{0=apple, 1=1, 2=2}, {0=banana, 1=6, 2=7}]
处理后:[{0=apple, 1=1.0, 2=2.0}, {0=banana, 1=6.0, 2=7.0}]