【问题标题】:Apache POI excel print subtotals in a particular orderApache POI excel按特定顺序打印小计
【发布时间】:2013-10-01 07:28:00
【问题描述】:

我有一个资产 POJO:

public class Asset implements Serializable {
    //serialVersionUID 
    private String quarter;
    private String assetType;
    private BigDecimal assetAttributes;
// more assetAttributes like price, etc, getters and setters
}

然后我有这个方法,它获取这个 POJO 和 Apache POI 表的列表,并将列表内容写入工作表:

public void addContent (List<Asset> listOfAsset, Sheet sheet) {
    //make a row counter and a cell counter
    SortedSet<String> quarters = new TreeSet<String>();
    for (Asset asset : listOfAsset) {
      quarters.add(asset.getQuarter());
      //write content to sheet
      row.createCell().setCellValue();
    }
    addSubtotals();
}

然后我有 addSubtotals 方法,它需要必要的信息并做一个 SUMIF 公式:

private void addSubtotals (//params) {
    for (String s : quarters) {
      Row row = sheet.createRow(rowCounter++);
      row.createCell(0).setCellValue(// quarter);
      for (int i = 2; i < cellCounter; i++) {
        row.createCell(i).setCellFormula(
        "SUMIF(// if the printed quarter equals the one in the quarters set, 
            then add all the attributes for all asset types)");
      }
   }
}

这一切都很好,除了小计都在列表的底部。每个季度后如何进行小计?我不提前知道会有多少个季度,或者每个季度会有多少种资产类型。

我想过将小计方法放在添加内容的 for 循环中,但由于季度数和资产类型未知,我无法进行 SUMIF。我可能会做一个 TreeMap,但我不确定细节。

【问题讨论】:

    标签: java excel for-loop apache-poi


    【解决方案1】:

    您可能需要提前对资产 pojo 进行分类。您需要创建一个 Map (String, Map(String, Asset)),它表示从资产类型到资产的季度映射。然后,您可以使用 3 嵌套循环遍历每个季度,然后遍历该季度内的每种资产类型,然后遍历每个资产。如果顺序很重要,请使用树形图实现。这样做可以让您在资产类型或季度结束时做一些特别的事情,您甚至可以使用循环本身中的局部变量来跟踪您的总数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多