接到一个需求,要将用户从一个系统导出的excel进行导入相关系统,但系统要求导入的excel模板不同,只是用户导入的excel中有部分列符合导入要求。
首先就是处理用户导入的列是否符合系统模板要求所需要的列。这个首先想到遍历用户给的excel列名称对比系统要求的excel模板所要具有的列(某些列数据可以为空但不能缺少系统模板要求的列)。
这里操作excel的框架是POI3.12版本看代码:
HSSFRow row2 = sheet.getRow(5);//用户导入的模板第六行是列名称行,将此列所有列名遍历进行比较,不符合系统导入要求模板列提示缺少XX列
Iterator<Cell> cells = row2.cellIterator();
Cell cell = null;
StringBuffer stbf = new StringBuffer();
List<String> list = new ArrayList<String>();
l ist.add("xx");
list.add("xx");
list.add("xx");
list.add("xxx");
// list.add("xxxx");
list.add("xxxx"); ......//这些是系统excel模板要求具有的列名称
List<String> list1 = Collections.synchronizedList(new ArrayList<String>(list));//这里以包含所有列名的list复制另一个list用来对比有用户excel中符合要求的列的话移除剩下有元素的话就缺少系统要求的列
Map<String, String> sort = new HashMap<String, String>();
while (cells.hasNext()) {
cell = cells.next();
int column = cell.getColumnIndex();
int index = list.indexOf(cell.toString());
sort.put(String.valueOf(column), String.valueOf(index));
list1.remove(cell.toString());
}
这样就把用户导入的excel按系统所要求列顺序放进list中处理。
在读取单元格时要注意单元格值和poi中cellType对应的关系方便对某些类型数据处理:
CellType 类型 值
CELL_TYPE_NUMERIC 数值型 0
CELL_TYPE_STRING 字符串型 1
CELL_TYPE_FORMULA 公式型 2
CELL_TYPE_BLANK 空值 3
CELL_TYPE_BOOLEAN 布尔型 4
CELL_TYPE_ERROR 错误 5
其中我再判断单元格中类型是否为数值型时遇到误判,因为单元格看起来是数字,但读取但程序中他的类型确实字符串型,是因为excel单元格数据格式设置了文本类型,这时看excel单元格样式如果左上角有三角标志就是文本类型即时值为数字也读取出来是字符串类型,把那个三角样式去掉才行。