Apache Poi 最好的方法
Apache Poi best way
你好,上次我想知道 Apche Poi 保存对象的好方法。
方式一
List<Something> list = ....;
cell.setValue(obj.getName) etc
方式二
将列表转换为对象[]
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]
}
}
在一种方式中我没有 if,但是如果我们想保存另一个对象,我们必须创建新的“转换器”。
2 种方式是“通用的”,但我可以有很多假设。 (我认为这是不好的做法)
你有什么想法/好方法吗?
确实没有很好的方法可以做到这一点。您可以尝试避免重复类型检查的一件事是创建一个 setter 映射,如下所示:
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);
}
}
这有避免 instanceof
的重复 RTTI 的优点,但它可能很危险,特别是你必须小心彻底检查每个 class,否则会抛出异常。
不过还是不太好;从本质上讲,您所做的只是移动条件。
你好,上次我想知道 Apche Poi 保存对象的好方法。
方式一
List<Something> list = ....;
cell.setValue(obj.getName) etc
方式二 将列表转换为对象[]
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]
}
}
在一种方式中我没有 if,但是如果我们想保存另一个对象,我们必须创建新的“转换器”。
2 种方式是“通用的”,但我可以有很多假设。 (我认为这是不好的做法)
你有什么想法/好方法吗?
确实没有很好的方法可以做到这一点。您可以尝试避免重复类型检查的一件事是创建一个 setter 映射,如下所示:
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);
}
}
这有避免 instanceof
的重复 RTTI 的优点,但它可能很危险,特别是你必须小心彻底检查每个 class,否则会抛出异常。
不过还是不太好;从本质上讲,您所做的只是移动条件。