0

我有一个资产 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,但我不确定细节。

4

1 回答 1

1

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

于 2013-09-25T18:28:24.027 回答