「付加行」機能 実装(いちおう)完了。
[nucalgen] / nucalgen / src / main / java / jp / satomichan / nucalgen / Nucalgen.java
index ba760ccef079074e2b5eb751194d9d078fde8dd3..2cf039ed8b4619afadd7093d4c9785f84c8c3d10 100644 (file)
@@ -1,12 +1,14 @@
 package jp.satomichan.nucalgen;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
 
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
@@ -21,6 +23,11 @@ import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellReference;
 
+import jp.satomichan.nucalgen.addition.AcCell;
+import jp.satomichan.nucalgen.addition.AcRow;
+import jp.satomichan.nucalgen.addition.AdditionConfig;
+import jp.satomichan.nucalgen.addition.AdditionUtil;
+
 public class Nucalgen {
        private static final int COL_INDEX_START = 4;
 
@@ -31,12 +38,10 @@ public class Nucalgen {
                options.addOption(Option.builder("c").required().hasArg().longOpt("columns").build());
                options.addOption(Option.builder("o").required().hasArg().longOpt("output").build());
                options.addOption(Option.builder("l").required().hasArg().longOpt("lines").build());
-               options.addOption(Option.builder("p").longOpt("use-processed-table").build());
-               options.addOption(Option.builder("pfc").longOpt("with-pfc-balance").build());
-               options.addOption(Option.builder("groupsum").longOpt("with-group-sum").build());
+               options.addOption(Option.builder("add").hasArgs().longOpt("addition").build());
                options.addOption(Option.builder("bright").hasArg().longOpt("bright-colored-vegetables-list").build());
                options.addOption(Option.builder("protect").longOpt("set-protect").build());
-               options.addOption(Option.builder("r").longOpt("-use-processed-table").build());
+               options.addOption(Option.builder("processed").longOpt("use-processed-table").build());
 
                Map<String, String> namedAreaMap = new HashMap<String, String>();
 
@@ -118,9 +123,7 @@ public class Nucalgen {
                                                        String cell = new CellReference(rowIndex, 4 + nch.indexOf(aAlias)).formatAsString();
                                                        formula = formula.replaceAll("([^A-Za-z0-9_])" + aAlias + "([^A-Za-z0-9_])", "$1" + cell + "$2");
                                                }
-                                               //System.out.println(formula);
                                                thisCell.setCellFormula(formula);
-                                               //thisCell.setCellValue(formula);
 
 
                                        } else {
@@ -157,7 +160,6 @@ public class Nucalgen {
                                        if(aColumn.isUseSum()) {
                                                String sumArea = new CellReference(rowIndex, colIndex, true, true).formatAsString();
                                                namedAreaMap.put("SUM_" + aColumn.getAlias(), sumArea);
-                                               //System.out.println("SUM_" + aColumn.getAlias() + " --- " +  sumArea);
                                        }
                                }
 
@@ -168,19 +170,14 @@ public class Nucalgen {
                                colIndex++;
                        }
 
-
-                       //「PFCバランス」出力
-                       if(cmd.hasOption("with-pfc-balance")) {
-                               rowIndex += 3;
-                               rowIndex = generatePfcBalance(calcSheet, csPool, rowIndex, namedAreaMap);
-                               rowIndex += 1;
-                               rowIndex = generatePfcBalance8(calcSheet, csPool, rowIndex, namedAreaMap);
-                       }
-
-                       //「食品群別摂取量」出力
-                       if(cmd.hasOption("with-group-sum")) {
-                               rowIndex += 3;
-                               rowIndex = generateGroupSum(calcSheet, csPool, rowIndex, namedAreaMap);
+                       
+                       //「付加行」出力
+                       String[] additionOptionValues = cmd.getOptionValues("addition");
+                       if(additionOptionValues != null) {
+                               for(String aAdditionFileName : additionOptionValues) {
+                                       rowIndex += 3;
+                                       rowIndex = generateAddition(aAdditionFileName, calcSheet, csPool, rowIndex, namedAreaMap);
+                               }
                        }
 
 
@@ -214,102 +211,55 @@ public class Nucalgen {
 
 
 
-       //PFCバランス
-       private static int generatePfcBalance(Sheet calcSheet, CellStylePool csPool, int rowIndex, Map<String,String> _namedAreaMap) {
-               Row pfbBalanceRow1 = calcSheet.createRow(rowIndex);
-               pfbBalanceRow1.createCell(1).setCellValue("PFCバランス (%) 七訂の方法で計算したエネルギー量で計算");
-               calcSheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 1, 2));
-               pfbBalanceRow1.createCell(3).setCellValue("P");
-               pfbBalanceRow1.createCell(4).setCellValue("F");
-               pfbBalanceRow1.createCell(5).setCellValue("C");
-
-               final String sumKiloCalorieCell = _namedAreaMap.get("SUM_KCAL");
-
-               rowIndex++;
-               Row pfbBalanceRow2 = calcSheet.createRow(rowIndex);
-               Cell pCell = pfbBalanceRow2.createCell(3);
-               pCell.setCellStyle(csPool.getCellStyle("0"));
-               pCell.setCellFormula("ROUND(" + _namedAreaMap.get("SUM_P") + "*4*100/" + sumKiloCalorieCell + ",0)");
-
-               Cell fCell = pfbBalanceRow2.createCell(4);
-               fCell.setCellStyle(csPool.getCellStyle("0"));
-               fCell.setCellFormula("ROUND(" + _namedAreaMap.get("SUM_F") + "*9*100/" + sumKiloCalorieCell + ",0)");
-
-               Cell cCell = pfbBalanceRow2.createCell(5);
-               cCell.setCellStyle(csPool.getCellStyle("0"));
-               cCell.setCellFormula("100 - (" + new CellReference(cCell.getRowIndex(), 3).formatAsString() + " + "
-                                             + new CellReference(cCell.getRowIndex(), 4).formatAsString() + ")");
-
-               return rowIndex;
-       }
-
-
-       //PFCバランス(八訂)
-       private static int generatePfcBalance8(Sheet calcSheet, CellStylePool csPool, int rowIndex, Map<String,String> _namedAreaMap) {
-               Row pfbBalanceRow1 = calcSheet.createRow(rowIndex);
-               pfbBalanceRow1.createCell(1).setCellValue("PFCバランス (%) 八訂のエネルギー量で計算");
-               calcSheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 1, 2));
-               pfbBalanceRow1.createCell(3).setCellValue("P");
-               pfbBalanceRow1.createCell(4).setCellValue("F");
-               pfbBalanceRow1.createCell(5).setCellValue("C");
-
-               final String sumKiloCalorieCell = _namedAreaMap.get("SUM_KCAL");
-
-               rowIndex++;
-               Row pfbBalanceRow2 = calcSheet.createRow(rowIndex);
-               Cell pCell = pfbBalanceRow2.createCell(3);
-               pCell.setCellStyle(csPool.getCellStyle("0"));
-               pCell.setCellFormula("ROUND(" + _namedAreaMap.get("SUM_P_ENG") + "*4*100/" + sumKiloCalorieCell + ",0)");
-
-               Cell fCell = pfbBalanceRow2.createCell(4);
-               fCell.setCellStyle(csPool.getCellStyle("0"));
-               fCell.setCellFormula("ROUND(" + _namedAreaMap.get("SUM_F_ENG") + "*9*100/" + sumKiloCalorieCell + ",0)");
-
-               Cell cCell = pfbBalanceRow2.createCell(5);
-               cCell.setCellStyle(csPool.getCellStyle("0"));
-               cCell.setCellFormula("100 - (" + new CellReference(cCell.getRowIndex(), 3).formatAsString() + " + "
-                                             + new CellReference(cCell.getRowIndex(), 4).formatAsString() + ")");
-
-               return rowIndex;
-       }
-
-
-        //群別摂取量
-       private static int generateGroupSum(Sheet calcSheet, CellStylePool csPool, int rowIndex, Map<String,String> _namedAreaMap) {
-
-               List<String> groupName = Arrays.asList("0", "穀類", "いも及びでん粉類", "砂糖及び甘味類", "豆類",
-                               "種実類", "野菜類", "果実類", "きのこ類", "藻類", "魚介類", "肉類", "卵類", "乳類",
-                               "油脂類", "菓子類", "し好飲料類", "調味料及び香辛料類", "調理加工食品類");
-
 
+       //「付加行」生成
+       private static int generateAddition(String fileName, Sheet calcSheet, CellStylePool csPool, int rowIndex,
+                                                                                                                                                               Map<String,String> _namedAreaMap) {
 
-               Row groupRow = calcSheet.createRow(rowIndex);
-               groupRow.createCell(1).setCellValue("食品群");
-               groupRow.createCell(3).setCellValue("摂取量(g)");
-               rowIndex++;
-
-               for(int i = 1; i <= 18; i++,rowIndex++) {
+               AdditionConfig ac = AdditionUtil.additionFileReader(new File(fileName));
+               for(AcRow acRow : ac.getRows()) { //行ごとのループ
                        Row thisRow = calcSheet.createRow(rowIndex);
-                       thisRow.createCell(1).setCellValue(i);
-                       thisRow.createCell(2).setCellValue(groupName.get(i));
-                       Cell cCell = thisRow.createCell(3);
-                       cCell.setCellStyle(csPool.getCellStyle(""));
-                       //cCell.setCellFormula("SUMIF(AREA_GROUP, " + i + ", AREA_INTAKE)");
-                       cCell.setCellFormula("SUMIF(" + _namedAreaMap.get("AREA_GROUP") + ", " + i + ", " + _namedAreaMap.get("AREA_INTAKE") + ")");
-
-                       if(i == 6) {
-                               rowIndex++;
-                               thisRow = calcSheet.createRow(rowIndex);
-                               thisRow.createCell(2).setCellValue("うち 緑黄色野菜");
-                               Cell bcvCell = thisRow.createCell(3);
-                               bcvCell.setCellStyle(csPool.getCellStyle("0"));
-                               //bcvCell.setCellFormula("SUMIF(AREA_BRIGHT_COLORED_VEGETABLE, 1, AREA_INTAKE)");
-                               bcvCell.setCellFormula("SUMIF(" + _namedAreaMap.get("AREA_BRIGHT_COLORED_VEGETABLE") + ", 1, " + _namedAreaMap.get("AREA_INTAKE") + ")");
-                       }
+                       int colIndex = 0;
+                       
+                       for(AcCell acCell : acRow.getCells()) { //セルごとのループ
+                               Cell thisCell = thisRow.createCell(colIndex);
+                               
+                               //alias 「付加行」内の別名定義(制約:右方・下方のセルからしか参照できない)
+                               if(acCell.getAlias() != null) {
+                                       _namedAreaMap.put(acCell.getAlias(), new CellReference(rowIndex, colIndex, true, true).formatAsString());
+                               }
+                               
+                               //formula 計算式
+                               if(acCell.getFormula() != null){
+                                       String formula = "<" + acCell.getFormula() + ">";
+                                       for(Entry<String, String> keyValue : _namedAreaMap.entrySet()) {
+                                               String k = keyValue.getKey();
+                                               String v = keyValue.getValue();
+                                               v = Matcher.quoteReplacement(v);
+                                               formula = formula.replaceAll("([^A-Za-z0-9_])" + k + "([^A-Za-z0-9_])", "$1" + v + "$2");
+                                               formula = formula.replaceAll("^<", "");
+                                               formula = formula.replaceAll(">$", "");
+                                       }
+                                       thisCell.setCellFormula(formula);
+                               
+                               //value そのままの値
+                               } else if(acCell.getValue() != null) {
+                                       thisCell.setCellValue(acCell.getValue());
+                               
+                               //formula でも value でもない
+                               } else {
+                                       //
+                               }
+                       
+                               
+                               colIndex++;
+                       } //セルごとのループ
+                       
+                       rowIndex++;
+               } //行ごとのループ
+               
 
 
-               }
-
                return rowIndex;
        }
 
@@ -319,7 +269,4 @@ public class Nucalgen {
 
 
 
-
-
-
 }