【问题标题】:Apache Poi best wayApache Poi 最佳方式
【发布时间】:2021-10-02 05:41:57
【问题描述】:

您好,上次我想知道 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]
 }
}

在一种方式中,我没有 if,但如果我们想保存另一个对象,我们必须创建新的“转换器”。

两种方式是“通用的”,但我可以有很多如果。 (我认为这是不好的做法)

你有什么想法/好方法吗?

【问题讨论】:

    标签: java apache-poi universal


    【解决方案1】:

    确实没有一个很好的方法来做到这一点。您可以尝试避免重复类型检查的一件事是创建一个 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,但它可能很危险,特别是您必须小心地彻底检查每个类,或者抛出异常。

    不过,它仍然不是很好;本质上,您所做的只是移动条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      相关资源
      最近更新 更多