Example #1
0
        static void Main(string[] args)
        {
//            Test wm = new Test(@"X:\Code\internt\kartlegging-vurdering\Sjekkliste risiko analyse_demo.xlsx");

            WorkbookManager wbm = new WorkbookManager(@"X:\Code\internt\kartlegging-vurdering\Sjekkliste risiko analyse_demo.xlsx");

            Parser p = new Parser("rules.json", wbm);

            int numRows = wbm.GetNumberOfRows();

            // Setter opp headings for sammendrag:
            Row headerRow = wbm.GetRow(1);

            Cell grCell = new Cell()
            {
                CellReference = "CC1", DataType = CellValues.String, CellValue = new CellValue("Antall grønne")
            };
            Cell ylCell = new Cell()
            {
                CellReference = "CD1", DataType = CellValues.String, CellValue = new CellValue("Antall gule")
            };
            Cell rdCell = new Cell()
            {
                CellReference = "CE1", DataType = CellValues.String, CellValue = new CellValue("Antall røde")
            };
            Cell fnlCell = new Cell()
            {
                CellReference = "CF1", DataType = CellValues.String, CellValue = new CellValue("Endelig score")
            };

            headerRow.Append(grCell, ylCell, rdCell, fnlCell);

            for (int i = 2; i < numRows; i++)
            {
                var row = wbm.GetRow(i);
                p.ParseRow(row);
            }
            wbm.Save();
        }
Example #2
0
        /// <summary>
        /// Parse en rad ved å gå over alt av regler.
        ///
        /// Reglene er definer som json:
        ///     Array med alle regler
        ///         Hver idx er et objekt med en gitt column=bokstav
        ///         Objektet inneholder også en array "rules" som inneholder reglene som skal parses
        ///             Hver regel er et objekt i arrayen med color:farge, regexp:regel som skal parses og en optional dependsOn:kolonne-Farge
        ///             Tanken er at vi kan ha en dependency, der en kolonne får en farge basert på eget innhold _samt_ fargen fra en annen kolonne.
        ///             Eks: Delvis kontroll på lagret informasjon er gul (kol AL), dersom vi ikke vet om
        ///
        ///
        /// </summary>
        /// <param name="rowToParse"></param>
        /// <returns></returns>
        public Row ParseRow(Row rowToParse)
        {
            Dictionary <string, string> flags = new Dictionary <string, string>();

            foreach (Rule r in Rules)
            {
                // do stuff, add flags to flags as we go along....
                var rxCol = new Regex("^(" + r.Column + ")[0-9]", RegexOptions.IgnoreCase);

                // Se på regelen og hent cella vi vil jobbe mot.
                Cell cell = (from Cell c in rowToParse.Elements <Cell>() where rxCol.IsMatch(c.CellReference) select c).Single <Cell>();

                for (int i = 0; i < r.Rules.Count; i++)
                {
                    // sjekk om vi har en regel som matcher. Første vinner. Dersom mer enn en treffer flagger vi cella med grått.
                    Regex rxCellVal = new Regex(r.Rules[i]["Regexp"], RegexOptions.IgnoreCase);
                    Regex refRxCellVal;
                    var   cellValue    = GetCellValue(cell);
                    var   refCellValue = "";

                    Cell refCell;

                    // Resultatet av innholdet i en celle kan vektes mot en annen:
                    if (r.RefColumn != null)
                    {
                        int    rowIdx     = Convert.ToInt32((uint)rowToParse.RowIndex);
                        string refCellRef = r.RefColumn + rowIdx;

                        refCell      = (from Cell c in rowToParse.Elements <Cell>() where c.CellReference.Equals(refCellRef) select c).Single <Cell>();
                        refCellValue = GetCellValue(refCell);
                    }

                    // Sjekk om regelen har en refregexp:
                    if (r.Rules[i].ContainsKey("RefRegexp"))
                    {
                        refRxCellVal = new Regex(r.Rules[i]["RefRegexp"], RegexOptions.IgnoreCase);
                        // Sjekk om vi har treff mot refcella
                        if (rxCellVal.IsMatch(cellValue) && refRxCellVal.IsMatch(refCellValue))
                        {
                            flags.Add(cell.CellReference, r.Rules[i]["Color"]);
                            // Dersom treff går vi ut av løkka, slik at vi kan ha catch-all regler.
                            break;
                        }
                    }
                    else if (rxCellVal.IsMatch(cellValue))
                    {
                        // Ingen refcelle, kjør vanlig compare
                        flags.Add(cell.CellReference, r.Rules[i]["Color"]);
                        break;
                    }
                }
            }

            // At the end, set bgcolors according to flags, summarize and add columns as needed.
            foreach (var kv in flags)
            {
                Cell c = (from Cell cc in rowToParse where cc.CellReference.Equals(kv.Key) select cc).Single <Cell>();
                c.StyleIndex = Convert.ToUInt32(WorkbookManager.MapStyleIdx(kv.Value));
            }

            // Legg til kolonner her.
            int numGr = (from KeyValuePair <string, string> f in flags where f.Value.Equals("green") select f).Count();
            int numYl = (from KeyValuePair <string, string> f in flags where f.Value.Equals("yellow") select f).Count();
            int numRd = (from KeyValuePair <string, string> f in flags where f.Value.Equals("red") select f).Count();

            // CC, CD, CE, CF for totalt antall grønn, gul og rød, samt en total score
            Cell grCell = new Cell()
            {
                CellReference = "CC" + rowToParse.RowIndex, DataType = CellValues.String, CellValue = new CellValue(numGr.ToString())
            };
            Cell ylCell = new Cell()
            {
                CellReference = "CD" + rowToParse.RowIndex, DataType = CellValues.String, CellValue = new CellValue(numYl.ToString())
            };
            Cell rdCell = new Cell()
            {
                CellReference = "CE" + rowToParse.RowIndex, DataType = CellValues.String, CellValue = new CellValue(numRd.ToString())
            };

            grCell.StyleIndex = Convert.ToUInt32(WorkbookManager.MapStyleIdx("green"));
            ylCell.StyleIndex = Convert.ToUInt32(WorkbookManager.MapStyleIdx("yellow"));
            rdCell.StyleIndex = Convert.ToUInt32(WorkbookManager.MapStyleIdx("red"));

            rowToParse.Append(grCell, ylCell, rdCell);

            // Så må vi tenke litt... Hva er fornuftige grenser for endelig score?
            // Flere grønne enn gule+røde => grønn
            // Flere grønne+gule enn røde => gul, eller røde+gule enn grønne => gul
            // Flere røde enn grønne+gule => rød
            var finalScore = "red";

            if (numGr > numYl + numRd)
            {
                finalScore = "green";
            }
            else if (numGr + numYl >= numRd || numGr <= numYl + numRd)
            {
                finalScore = "yellow";
            }
            else if (numGr + numYl <= numRd)
            {
                finalScore = "red";
            }

            Cell fnlCell = new Cell()
            {
                CellReference = "CF" + rowToParse.RowIndex, DataType = CellValues.String, CellValue = new CellValue("")
            };

            fnlCell.StyleIndex = Convert.ToUInt32(WorkbookManager.MapStyleIdx(finalScore));
            rowToParse.Append(fnlCell);

            return(rowToParse);
        }
Example #3
0
 public Parser(string rulesFile, WorkbookManager wbm)
 {
     Rules = JsonConvert.DeserializeObject <List <Rule> >(File.ReadAllText(rulesFile));
     Wbm   = wbm;
 }