From: satomichan <...@...>
Date: Fri, 25 Jun 2021 13:41:34 +0000 (+0900)
Subject: 「付加行」機能の実装中。
X-Git-Tag: JAR_2021-06-26_2349_BUILD~2
X-Git-Url: https://satomichan.jp/gitweb/?a=commitdiff_plain;h=b044ded26417f6c8bba39a781f34aadc93a00d42;p=nucalgen
「付加行」機能の実装中。
いままで「PFCバランス計算」&「食品群別摂取量集計」機能をベタな Java のコードで書いていたが、
これを外部ファイル(XML)で記述できるようにする。
とりあえず「PFCバランス計算」は置き換えた(当該 Java コードは削除した)。
---
diff --git a/nucalgen/bright-colored-vegetables.xml b/nucalgen/bright-colored-vegetables.xml
new file mode 100644
index 0000000..6bbf9d4
--- /dev/null
+++ b/nucalgen/bright-colored-vegetables.xml
@@ -0,0 +1,95 @@
+
+
+
+ ããã¤ã
+ ãããã°
+ ã¢ã¹ãã©ã¬ã¹
+ ããããã¾ã
+ ãããããã
+ ã¨ã³ãã¤ã
+ ãã¦ãã§ã¦
+ ãããããããª
+ ããããã©ã
+ ããã²ãã
+ ãªã¯ã©
+ ãã¶ãè
+ æ¥æ¬ãã¼ã¡ã
+ 西æ´ãã¼ã¡ã
+ ããããª
+ ãããããã«ãã«ã
+ ã¿ããª
+ ãã³ãµã¤
+ ã¯ã¬ã½ã³
+ ã±ã¼ã«
+ ããã¿
+ ãã¾ã¤ãª
+ ããã¨ããã
+ ããã¨ã
+ ããã
+ ãã
ãããããã
+ ãã
ããã
+ ããããªãè
+ ãã
+ ã¿ã¢ãµã¤
+ ããããã ããã
+ èã ããã
+ ã ããããè
+ ã¤ã¾ã¿ãª
+ ãããã
+ ãããª
+ ããã®ã
+ ãã³ã²ã³ãµã¤
+ ã¤ãã
+ ã¤ããª
+ ã¤ããããã
+ ã¨ãããã
+ ããã
+ ããããã
+ ã¨ãã¶ã
+ ãªãããã¯ããã
+ ãªããª
+ å種ãªã°ãª
+ æ´ç¨®ãªã°ãª
+ ã«ã
+ è±ã«ã
+ èã«ããã
+ ã«ããã
+ ããã¨ã
+ ãããã£ããã
+ èã«ãã«ã
+ èãã
+ ããã
+ ã®ãããª
+ ã®ã³ã
+ ãã¯ãã§ã¤
+ ãã¸ã«
+ ãã»ãª
+ éãã¼ãã³
+ 赤ãã¼ãã³
+ ãããã¼
+ ã²ã®ãª
+ ã²ããã¾ãª
+ ãµã ããã
+ ãããã³ãªã¼
+ ã»ããããã
+ ã¿ããããª
+ åãã¿ã¤ã°
+ æ ¹ã¿ã¤ã°
+ 糸ã¿ã¤ã°
+ ããã£ãã
+ ããã§
+ ã¢ããã¤ã¤
+ ãããã
+ ãããª
+ ããã
+ ãµã©ããª
+ ãªã¼ãã¬ã¿ã¹
+ ãµãã¼ã¬ã¿ã¹
+ ã¬ã¿ã¹ãæ°´èæ ½å¹
+ ãµã³ãã¥
+ ã«ãã³ã©
+ ããã
+ èãã¾ãã
+ ã¿ã¶ãª
+
+
diff --git a/nucalgen/pfc-balance.xml b/nucalgen/pfc-balance.xml
new file mode 100644
index 0000000..5ed29f0
--- /dev/null
+++ b/nucalgen/pfc-balance.xml
@@ -0,0 +1,48 @@
+
+
+
+ | string |
+ stringPFCãã©ã³ã¹ (%) ä¸è¨ã®æ¹æ³ã§è¨ç®ããã¨ãã«ã®ã¼éã§è¨ç® |
+
+
+ | string |
+ string |
+ string |
+ stringP |
+ stringF |
+ stringC |
+
+
+ | string |
+ string |
+ string |
+ formulaROUND(SUM_P*4*100/SUM_KCAL,0)PFC_BALANCE_P_7 |
+ formulaROUND(SUM_F*9*100/SUM_KCAL,0)PFC_BALANCE_F_7 |
+ formula100-(PFC_BALANCE_P_7+PFC_BALANCE_F_7) |
+
+
+
+
+
+ | string |
+ stringPFCãã©ã³ã¹ (%) å
«è¨ã®ã¨ãã«ã®ã¼éã§è¨ç® |
+
+
+ | string |
+ string |
+ string |
+ stringP |
+ stringF |
+ stringC |
+
+
+ | string |
+ string |
+ string |
+ formulaROUND(SUM_P_ENG*4*100/SUM_KCAL,0)PFC_BALANCE_P_8 |
+ formulaROUND(SUM_F_ENG*9*100/SUM_KCAL,0)PFC_BALANCE_F_8 |
+ formula100-(PFC_BALANCE_P_8+PFC_BALANCE_F_8) |
+
+
+
+
diff --git a/nucalgen/pom.xml b/nucalgen/pom.xml
index 7a36375..7bf56ff 100644
--- a/nucalgen/pom.xml
+++ b/nucalgen/pom.xml
@@ -31,6 +31,14 @@
1.4
+
+
+ commons-digester
+ commons-digester
+ 2.1
+
+
+
\ No newline at end of file
diff --git a/nucalgen/src/main/java/jp/satomichan/nucalgen/Nucalgen.java b/nucalgen/src/main/java/jp/satomichan/nucalgen/Nucalgen.java
index ba760cc..b6065c9 100644
--- a/nucalgen/src/main/java/jp/satomichan/nucalgen/Nucalgen.java
+++ b/nucalgen/src/main/java/jp/satomichan/nucalgen/Nucalgen.java
@@ -1,5 +1,6 @@
package jp.satomichan.nucalgen;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
@@ -7,6 +8,8 @@ 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 +24,12 @@ 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.AcCellType;
+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 +40,12 @@ 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("add").hasArgs().longOpt("addition").build());
+
options.addOption(Option.builder("groupsum").longOpt("with-group-sum").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 namedAreaMap = new HashMap();
@@ -118,9 +127,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 {
@@ -168,13 +175,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);
+
+ //ãä»å è¡ãåºå
+ String[] additionOptionValues = cmd.getOptionValues("addition");
+ if(additionOptionValues != null) {
+ for(String aAdditionFileName : additionOptionValues) {
+ rowIndex += 3;
+ rowIndex = generateAddition(aAdditionFileName, calcSheet, csPool, rowIndex, namedAreaMap);
+ }
}
//ãé£åç¾¤å¥æåéãåºå
@@ -213,67 +221,6 @@ public class Nucalgen {
}
-
- //PFCãã©ã³ã¹
- private static int generatePfcBalance(Sheet calcSheet, CellStylePool csPool, int rowIndex, Map _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 _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 _namedAreaMap) {
@@ -314,7 +261,51 @@ public class Nucalgen {
}
+ //ãä»å è¡ãçæ
+ private static int generateAddition(String fileName, Sheet calcSheet, CellStylePool csPool, int rowIndex,
+ Map _namedAreaMap) {
+
+ System.out.println("ADDITION : " + fileName);
+ AdditionConfig ac = AdditionUtil.additionFileReader(new File(fileName));
+ for(AcRow acRow : ac.getRows()) { //è¡ãã¨ã®ã«ã¼ã
+ Row thisRow = calcSheet.createRow(rowIndex);
+ 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());
+ }
+
+ if(acCell.getCellType() == AcCellType.FORMULA) {
+ String formula = "<" + acCell.getValue() + ">";
+ for(Entry 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);
+ } else {
+ thisCell.setCellValue(acCell.getValue());
+ }
+
+
+ colIndex++;
+ } //ã»ã«ãã¨ã®ã«ã¼ã
+
+ rowIndex++;
+ } //è¡ãã¨ã®ã«ã¼ã
+
+
+
+ return rowIndex;
+ }
diff --git a/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcCell.java b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcCell.java
new file mode 100644
index 0000000..b2d881d
--- /dev/null
+++ b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcCell.java
@@ -0,0 +1,49 @@
+package jp.satomichan.nucalgen.addition;
+
+public class AcCell {
+ private String value;
+ private AcCellType type;
+ private String alias;
+
+ public AcCell(){
+ //System.out.println("Cell#Cell()");
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+ public AcCellType getCellType() {
+ return type;
+ }
+
+ public String getType() {
+ return type.getId();
+ }
+
+ public void setType(String type) {
+ AcCellType[] types = AcCellType.values();
+ for(AcCellType aType : types) {
+ if(aType.getId().equals(type)){
+ this.setType(aType);
+ }
+ }
+ }
+
+ private void setType(AcCellType type) {
+ this.type = type;
+ }
+
+ public String getAlias() {
+ return alias;
+ }
+
+ public void setAlias(String alias) {
+ this.alias = alias;
+ }
+}
diff --git a/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcCellType.java b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcCellType.java
new file mode 100644
index 0000000..a3074e2
--- /dev/null
+++ b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcCellType.java
@@ -0,0 +1,17 @@
+package jp.satomichan.nucalgen.addition;
+
+public enum AcCellType {
+ FORMULA("formula"),
+ STRING("string");
+
+ private String id;
+
+
+ private AcCellType(String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+}
diff --git a/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcRow.java b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcRow.java
new file mode 100644
index 0000000..5fd994f
--- /dev/null
+++ b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AcRow.java
@@ -0,0 +1,24 @@
+package jp.satomichan.nucalgen.addition;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AcRow {
+ private List cells = new ArrayList();
+
+ public List getCells() {
+ return cells;
+ }
+
+ public void setCells(List cells) {
+ this.cells = cells;
+ }
+
+
+ public void addCell(AcCell cell) {
+ this.cells.add(cell);
+ //System.out.println("Row#addCell()");
+ }
+
+
+}
diff --git a/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AdditionConfig.java b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AdditionConfig.java
new file mode 100644
index 0000000..cc03b8e
--- /dev/null
+++ b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AdditionConfig.java
@@ -0,0 +1,26 @@
+package jp.satomichan.nucalgen.addition;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AdditionConfig {
+ private List rows = new ArrayList();
+
+ public List getRows() {
+ return rows;
+ }
+
+ public void setRows(List rows) {
+ this.rows = rows;
+ }
+
+
+ public void addRow(AcRow row) {
+ this.rows.add(row);
+ }
+
+
+ public AdditionConfig(){
+ }
+
+}
diff --git a/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AdditionUtil.java b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AdditionUtil.java
new file mode 100644
index 0000000..8b03346
--- /dev/null
+++ b/nucalgen/src/main/java/jp/satomichan/nucalgen/addition/AdditionUtil.java
@@ -0,0 +1,59 @@
+package jp.satomichan.nucalgen.addition;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.commons.digester.Digester;
+import org.xml.sax.SAXException;
+
+public class AdditionUtil {
+
+ public static void main(String[] args) {
+ AdditionConfig add = additionFileReader(new File("C:\\Users\\h520s\\Desktop\\pfc-balance.xml"));
+ }
+
+
+ public static AdditionConfig additionFileReader(File reportXmlFile){
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ javax.xml.parsers.SAXParser parser = null;
+ AdditionConfig addition = null;
+
+ try {
+ parser = factory.newSAXParser();
+
+ Digester digester = new Digester(parser);
+
+ digester.addObjectCreate("addition", AdditionConfig.class);
+ digester.addObjectCreate("addition/row", AcRow.class);
+
+ digester.addSetNext("addition/row", "addRow");
+ digester.addSetProperties("addition/row");
+
+ digester.addObjectCreate("addition/row/cell", AcCell.class);
+
+ digester.addSetNext("addition/row/cell", "addCell");
+ digester.addBeanPropertySetter("addition/row/cell/type");
+ digester.addBeanPropertySetter("addition/row/cell/value");
+ digester.addBeanPropertySetter("addition/row/cell/alias");
+
+ //ãã¼ã¹ãã
+ InputStream in;
+
+ in = new FileInputStream(reportXmlFile);
+ addition = (AdditionConfig)digester.parse(in);
+
+
+
+ } catch (IOException | SAXException | ParserConfigurationException e) {
+ throw new RuntimeException(e);
+ }
+
+ return addition;
+
+ }
+}