ApachePOI最佳方式

s6fujrry  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(324)

嗨,上次我想知道通过apche poi保存对象的好方法。
方式1

List<Something> list = ....;
cell.setValue(obj.getName) etc

方式2将列表转换为对象[]

for(int i=0; i<objectsToSave.size;i++){
 for(int y=0; y<object.size;y++){
  if(obj instance of Integer)
   cell.setValue((Integer) obj[i]
  if(obj instance of RichTextString)
   cell.setValue((RichTextString) obj[i]
 }
}

在1种情况下,我没有if,但如果我们想保存另一个对象,我们必须创建新的“转换器”。
在2路是“普遍的”,但我可以有很多如果的(我认为这是不好的做法)
你有什么好办法吗?

voase2hg

voase2hg1#

做这件事真的没有什么好办法。可以尝试避免重复类型检查的一件事是创建setterMap,如下所示:

private static Map<Class<?>,BiConsumer<Cell,Object>> typeMap = new HashMap<Class<?>, BiConsumer<Cell,Object>>();

static {
   typeMap.put(Integer.class, obj -> cell.setValue((Integer)obj);
   typeMap.put(String.class, obj -> cell.setValue((RichTextString)obj);
//....and so on
}

public void setCell(Cell cell, Object obj) {
   typeMap.get(obj.getClass()).apply(cell, obj);
}

那么您的代码将变成:

for(int i=0; i<objectsToSave.size;i++){
 for(int y=0; y<object.size;y++){
  setCell(cell, object);
 }
}

这样做的优点是避免了重复的rtti instanceof 但这可能是危险的,尤其是您必须仔细检查每个类,或者抛出异常。
尽管如此,它仍然不太好;你所做的一切,本质上,就是移动条件。

相关问题