示例#1
0
 /// <summary>
 /// List<Form> Init(int toc_line) - initiate all Forms for Document in toc_line.
 /// </summary>
 /// <param name="toc_line">line number in TOC</param>
 /// <returns>form list</returns>
 public static List<Form> Init(int toc_line)
 {
     Log.set("Init(" + toc_line + ")");
     //------------------------------------------------------------------------------
     language = true; //en-US for Englisg Debug. Remove or comment this line later  !
     //------------------------------------------------------------------------------
     List<Form> Forms = new List<Form>();
     for (int col = Decl.DOC_FORMS, i = 0; i < 10; i++)
     {
         string s = Lang(tocMtr.Strng(toc_line, col++));
         if (string.IsNullOrEmpty(s)) continue;
         if (FileOp.isNamedRangeExist(Wb, s))
         {
             List<int> _r = new List<int>();
             List<int> _c = new List<int>();
             string sf = s + "_F";
             if (FileOp.isNamedRangeExist(Wb, sf))
             {
                 Mtr format = new Mtr(Wb.Names.Item(sf).RefersToRange.Value);
                 for (int c = 1; c <= format.iEOC(); c++)
                     for (int r = 1; r <= format.iEOL(); r++)
                     {
                         string f = format.Strng(r, c);
                         if (f.Contains("{") & f.Contains("}")) { _r.Add(r); _c.Add(c); }
                     }
             }
             Forms.Add(new Form(s, _r, _c));
         }
     }
     Log.exit();
     return Forms;
 }
示例#2
0
 //public void wrDoc(string form_name, params object[] objs)
 //{
 //    wrDoc(form_name, objs);
 //}
 ////////public void wrDoc(int iForm, object[] lst) // List<T> lst)
 ////////{
 ////////    Form frm = forms.Find(x => x.name == forms[iForm].name);
 ////////    string format_name = frm.name + "_F";
 ////////    if (!FileOp.isNamedRangeExist(Wb, format_name)) Msg.F("ERR __!!__.NOFORM_F", frm.name);
 ////////    object[] obj = new object[lst.Count];
 ////////    //!!-- fill obj[]
 ////////    wrDoc(frm.name, obj);
 ////////}
 ////public void wrDoc(string str)
 ////{
 ////    object[] t = { Lib.timeStr() };
 ////    wrDoc(str, t);
 ////    Body[1, 1] = t[0];
 ////}
 public void wrDoc(List<int> rows, List<int> cols, List<int> rFr, List<int> cFr)
 {
     Log.set("wrDoc(List rows, List cols, List rFr, List cFr)");
     Mtr tmpBody = FileOp.getSheetValue(this.Sheet);
     throw new NotImplementedException();
     Log.exit();
 }
示例#3
0
 /// <summary>
 /// Trace(Stamp)    - вывод в Log-файл данных по Штампам Документа
 /// </summary>
 /// <param name="st"></param>
 /// <history> 26.12.13 -- не дописано -- нужно rnd не только doc.Body, но для SF doc.Summary
 /// 18.1.14 (ПХ) отладка с Matrix
 /// 12.12.15 - для TSmatch не нужно обрабатывать документы типа SFDC
 /// </history>
 public string Trace(Document doc)
 {
     Mtr rng = doc.Body;
     string msg = (string)((rng == doc.Summary) ? "Пятка" : "Body");
     msg += "Документ не соответствует Штампам";
     foreach (OneStamp st in doc.stamp.stamps)
         traceSub(st.Check(rng) ? "OK" : "!!", st);
     return msg;
 }
示例#4
0
 /// <summary>
 /// Stamp.Check(mtr) - проверка mtr на соответствие Штампу в stmp. ОК->true, несовпадение->false
 /// </summary>
 /// <param name="mtr"></param>
 /// <returns>bool: true если проверка Штампа дает совпадение сигнатуры</returns>
 /// <history> 12.12.2013
 /// 25.12.13 (ПХ) ToString вместо Value2 для проверяемой ячейки
 /// 13.1.14 - работа с матрицами
 /// 18.1.14 - (ПХ) рефакторинг. Теперь сверяем strToCheck в mtr и SigInStamp в Штампе
 /// </history>
 public bool Check(Mtr mtr)
 {
     string sigInStamp = signature.ToLower();
     foreach (var pos in stampPosition) {
         string strToCheck = mtr.Strng(pos[0], pos[1]).ToLower();
         if (typeStamp == "=") {
             if (strToCheck == sigInStamp) return true;
         } else {
             if (strToCheck.Contains(sigInStamp)) return true;
         }
     }
     return false;
 }
示例#5
0
 public Document(Document d)     // конструктор - перегрузка для копирования Документа
 {
     name = d.name;
     Body = d.Body;
     type = d.type;
     i0 = d.i0; il = d.il;
     isOpen = d.isOpen; isChanged = d.isChanged; isNewDoc = d.isNewDoc;
     Wb = d.Wb; Sheet = d.Sheet; SheetN = d.SheetN;
     FileName = d.FileName; FileDirectory = d.FileDirectory;
     MadeStep = d.MadeStep; MadeTime = d.MadeTime;
     chkSum = d.chkSum;
     stamp = d.stamp;
     creationDate = d.creationDate;
     forms = d.forms;
 }
示例#6
0
        private void splitBodySummary()
        {
            int fullEOL = Body.iEOL();
            int _resLns = 0;
            switch (ResLines.Count)
            {
                case 0: break;
                case 1: _resLns = ResLines[0]; break;
                default: _resLns = (this.MadeStep == "Loaded") ? ResLines[0] : ResLines[1]; break;
            }
            int iEOL = (_resLns == 0) ? fullEOL : fullEOL - _resLns;
            int iEOC = Body.iEOC();

            Body = FileOp.getRngValue(Sheet, 1, 1, iEOL, iEOC);
            dt = Body.DaTab();
            if (_resLns > 0) Summary = FileOp.getRngValue(Sheet, iEOL + 1, 1, fullEOL, iEOC);
        }
示例#7
0
        //internal void wrDoсForm(string dir, string v, DateTime date, string mD5, int count, string strListRules)
        //{
        //    throw new NotImplementedException();
        //}

        /// <summary>
        /// wrDoc(str, obect[] obj) -- write data from array of objects to the Document in Excel
        /// </summary>
        /// <param name="str">form name; "str_F" format is also accounted</param>
        /// <param name="obg">data array to be written</param>
        /// <history>16.3.2016
        /// 26.3.2016 - output HDR_ form with time.Now in [1,1]
        ///  3.4.2016 - multiple line output support with last_name
        /// 13.4.2016 - Internal error message, when form not found
        /// 22.8.2016 - auditted: if(obj is Array); i0+1
        /// </history>
        public void wrDoc(string formName, params object[] obj)
        {
            Log.set("wrDoc(" + formName + ", obj[])");

            if (obj is Array)
            {
                int objLng = obj.Length;
                object[] _obj = obj;
                //--------------- not implemented yet
                if (obj[0] is Array)
                {

                }
            }
            //           Type ob = typeof(obj);  //.IsAssignableFrom(type); 

            Form frm = forms.Find(x => x.name == formName);
            if (frm == null) Msg.F("Document.wrDoc no form", formName, this.name);
            if (frm.col.Count != frm.row.Count) Msg.F("wrDoc Form corrupted"
                , formName, frm.row.Count, frm.col.Count);
            if (frm.col.Count != obj.Length) Msg.F("wrDoc wrong agroments", obj);
            if (frm.name == Form.last_name)
            {
                Body.AddRow(obj);
            }
            else
            {
                saveDoc();
                int lineInBodyToWrite = Form.nStr < 1 ? Body.iEOL() : Form.nStr;
                Excel.Range rng = FileOp.setRange(Sheet, lineInBodyToWrite);
                Document toc = getDoc();
                FileOp.CopyRng(toc.Wb, formName, rng);
                Body = FileOp.getSheetValue(Sheet);
                FileOp.saveRngValue(Body);
                int i = 0;
                foreach (var v in obj)
                {
                    int r = frm.row[i] + lineInBodyToWrite - 1;
                    int c = frm.col[i++];
                    Body[r, c] = v;
                }
                FileOp.saveRngValue(Body, 1, AutoFit: frm.AutoFit);
                Form.last_name = frm.name;
            }
            Log.exit();
        }
示例#8
0
        /// <summary>
        /// saveDoc(doc [,BodySave, string MD5]) - сохраняет Документ в Excel файл, если он изменялся
        /// </summary>
        /// <param name="name">имя документа</param>
        /// <param name="BodySave>true - doc.Body нужно сохранить, false - уже в Excel</param>
        /// <param name="MD5">MD5 документа. Если BodySave = false - обязательно</param>
        /// <history>10.1.2016
        /// 18.1.16 - аккуратная обработка BodySave=false и MD5
        /// 20.1.16 - fix bug: not write EOLinTOC for TSmatch type Documents
        /// 1.04.16 - overlay saveDoc(..)
        /// </history>
        public static void saveDoc(Document doc, bool BodySave = true, string MD5 = "", int EOL = 0)
        {
            Log.set("saveDoc(\"" + doc.name + "\")");
            try
            {
                Document toc = Documents[Decl.DOC_TOC];
                if (doc.type == Decl.DOC_TYPE_N) doc.isChanged = true;
                if (doc.isChanged)
                {
                    int EOLinTOC = EOL;
                    if (BodySave)
                    {
                        FileOp.setRange(doc.Sheet);
                        FileOp.saveRngValue(doc.Body);
//24/4/17                        doc.chkSum = doc.Body.ComputeMD5();
//2/8/17 removed EOLinTOC                       doc.EOLinTOC = doc.Body.iEOL();
                        doc.il = doc.Body.iEOL();
                        FileOp.fileSave(doc.Wb);
                        doc.isChanged = false;
                    }
                    else
                    {
                        if (MD5.Length < 20 || EOL == 0) { Message.Message Msg = new Message.Message(); Msg.F("ERR_05.8_saveDoc_NOMD5"); }
                        //2/8/17 removed EOLinTOC                        else { doc.chkSum = MD5; doc.EOLinTOC = EOLinTOC; }
                        else { doc.chkSum = MD5; doc.il = EOLinTOC; }
                    }
                    Mtr tmp = FileOp.getSheetValue(toc.Sheet);
                    for (int n = toc.i0; n <= toc.il; n++)
                    {   // находим и меняем строку документа doc TOC
                        if ((string)toc.Body[n, Decl.DOC_NAME] != doc.name) continue;
                        tmp[1, 1] = Lib.timeStr();
                        tmp[n, Decl.DOC_TIME] = Lib.timeStr();
                        tmp[n, Decl.DOC_MD5] = doc.chkSum;
                        if (doc.type == "N") tmp[n, Decl.DOC_CREATED] = Lib.timeStr();
//2/8/17 removed EOLinTOC                        if (doc.type != Decl.TSMATCH_TYPE) tmp[n, Decl.DOC_EOL] = doc.EOLinTOC;
                        if (doc.type != Decl.TSMATCH_TYPE) tmp[n, Decl.DOC_EOL] = doc.il;
                        FileOp.setRange(toc.Sheet);
                        FileOp.saveRngValue(tmp, AutoFit: false);  //======= save TОC in TSmatch.xlsx
                        break;
                    }
                }
            }
            catch (Exception e) { Log.FATAL("Ошибка \"" + e.Message + "\" сохранения файла \"" + doc.name + "\""); }
            Log.exit();
        }
示例#9
0
 /// <summary>
 /// Reset() - "Reset" of the Document. All contents of hes Excel Sheet erased, write Header form
 /// Reset("Now") - write DataTime.Now string in Cell [1,1]
 /// </summary>
 /// <history>9.1.2014
 /// 17.1.16 - полностью переписано с записью Шапки
 /// 16.3.16 - header name get from doc.forms[0]
 /// 26.3.16 - Reset("Now")
 /// 27.3.16 - bug fixed. Issue was: Reset named as a doc.name instead SheetN
 /// </history>
 public void Reset(string str = "")
 {
     Log.set("Reset(" + this.name + ")");
     Document toc = getDoc();
     this.Sheet = FileOp.SheetReset(this.Wb, this.SheetN);
     Excel.Range rng = FileOp.setRange(this.Sheet);
     if (this.forms.Count == 0) Msg.F("Document.Reset no HDR form", this.name);
     string myHDR_name = this.forms[0].name;
     FileOp.CopyRng(toc.Wb, myHDR_name, rng);
     this.Body = FileOp.getSheetValue(this.Sheet);
     if (str == "Now")
     {
         Body[1, 1] = Lib.timeStr();
         FileOp.setRange(this.Sheet);
         FileOp.saveRngValue(Body);
     }
     Log.exit();
 }
示例#10
0
        public static void saveRngValue(Mtr Body, int rowToPaste = 1, bool AutoFit = true, string msg = "")
        {
            Log.set("saveRngValue");
            int r0 = Body.LBoundR(), r1 = Body.iEOL(),    //!!
                c0 = Body.LBoundC(), c1 = Body.iEOC();    //!!

            try
            {
                object[,] obj = new object[r1, c1];
                for (int i = 0; i < r1; i++)
                {
                    for (int j = 0; j < c1; j++)
                    {
                        obj[i, j] = Body[i + 1, j + 1];
                    }
                }
                r1 = r1 - r0 + rowToPaste;
                r0 = rowToPaste;
                Excel.Range cell1 = _sh.Cells[r0, c0];
                Excel.Range cell2 = _sh.Cells[r1, c1];
                Excel.Range rng   = _sh.Range[cell1, cell2];
                rng.Value = obj;
                if (AutoFit)
                {
                    for (int i = 1; i <= c1; i++)
                    {
                        _sh.Columns[i].AutoFit();
                    }
                }
            }
            catch (Exception e)
            {
                if (msg == "")
                {
                    msg = "Range[ [" + r0 + ", " + c0 + "] , [" + r1 + ", " + c1 + "] ]";
                }
                Log.FATAL(msg);
            }
            Log.exit();
        }
示例#11
0
 /// <summary>
 /// Start(TOCdir) - prepare further works with the Documents; setup data from TOC
 /// </summary>
 /// <param name="FileDir">Directory, Path to TSmatch.xlsx</param>
 /// <history> 22.1.2016
 /// 12.3.2016 - multilanguage Heders support
 /// 14.3.2016 - Form class support
 /// 19.3.2016 - use EOL method
 /// 30.3.2016 - Start(TOCdir) and getDoc with #template interaction with Bootstrap
 /// 17.4.2016 - tocStart extracted from Start for initial TOC open
 /// </history>
 public static void Start(Dictionary<string, string> _Templates)
 {
     Log.set("Document.Start(#Templates)");
     Templates = _Templates;
     //2/8            Document toc = tocStart(Templates["#TOC"]);
     toc = tocStart(Templates["#TOC"]);
     Mtr mtr = toc.Body;
     for (int i = toc.i0; i <= toc.il; i++)
     {
         string docName = mtr.Strng(i, Decl.DOC_NAME);
         if (docName != "")
         {
             Document doc = new Document(docName);
             // mtr относится только к TOCmatch, а не ко всем Документам,
             //.. то есть реально загружаем ТОС, а остальные Документы- потом
             if (doc.name == Decl.DOC_TOC) doc = toc;
             Documents.Add(docName, doc);
             doc.MadeTime = Lib.getDateTime(mtr[i, Decl.DOC_TIME]);
             doc.ResLines = Lib.ToIntList(mtr.Strng(i, Decl.DOC_TYPE), '/');
             doc.MadeStep = mtr.Strng(i, Decl.DOC_MADESTEP);
             doc.FileName = mtr.Strng(i, Decl.DOC_FILE);
             doc.FileDirectory = mtr.Strng(i, Decl.DOC_DIR);
             doc.type = mtr.Strng(i, Decl.DOC_TYPE);
             doc.isNewDoc = (doc.type == Decl.DOC_TYPE_N);
             doc.SheetN = mtr.Strng(i, Decl.DOC_SHEET);
             if (doc.type == Decl.TSMATCH_TYPE) doc.Sheet = toc.Wb.Worksheets[doc.SheetN];
             doc.creationDate = Lib.getDateTime(mtr[i, Decl.DOC_CREATED]);
             doc.Supplier = mtr.Strng(i, Decl.DOC_SUPPLIER);
             doc.LoadDescription = mtr.Strng(i, Decl.DOC_STRUCTURE_DESCRIPTION);
             doc.forms = Form.Init(i);
             doc.Loader = mtr.Strng(i, Decl.DOC_LOADER);
             doc.EOL(i);
             int j;
             for (j = i + 1; j <= mtr.iEOL() && mtr.Strng(j, Decl.DOC_NAME) == ""; j++) ;
             doc.stamp = new Stamp(i, j - 1);
         } //if docName !=""
     } // for по строкам TOC
     Log.exit();
 } // end Start
示例#12
0
        public static void okSave(string FileDir, int ok)
        {
            const string SheetN = "Report";
            const string FileName = "TSmatchINFO.xlsx";
            Excel.Workbook Wb = FileOp.fileOpen(FileDir, FileName, create_ifnotexist: true);
            FileOp.SheetReset(Wb, SheetN); 
            Excel.Worksheet Sh = Wb.Worksheets[SheetN];
//            Mtr Body = null;
            int n_ex_str = 0;
            string mat = "Материал", prf = "Профиль", lng = "Длина",
                Comp_doc = "Компонент", Comp_n = "№ стр", Comp_str = "Cтрока компонента";
            Mtr Body = new Mtr();
            Body.Init(new object[] { "№", mat, prf, lng, Comp_doc, Comp_n, Comp_str });
            foreach (var v in Elements)
            {
                mat = v.mat;
                prf = v.prf;
                lng = v.lng.ToString();
                for (int i_ok = 0; i_ok < OKnstrComp.Count; i_ok++)
                {
                    if (n_ex_str == OKnstrComp[i_ok])
                    {
                        Comp_doc = OKdocName[i_ok];
                        Comp_n = OKnComp[i_ok].ToString();
                        Comp_str = OKstrComp[i_ok];
                        break;
                    }
                    else { Comp_doc = ""; Comp_str = ""; Comp_n = ""; }
                }
                Body.AddRow(new object[] { n_ex_str, mat, prf, lng, Comp_doc, Comp_n, Comp_str });
                n_ex_str++;
            }
            FileOp.setRange(Sh);
            FileOp.saveRngValue(Body);
        }
示例#13
0
 public static void setWb(Excel.Workbook _Wb, Mtr _tocMtr)
 {
     Wb = _Wb; tocMtr = _tocMtr;
 }
示例#14
0
 /// <summary>
 /// Check(Документ) - проверка, что штамп в Документе соответствует цепочке Штампов в TOCmatch
 /// 
 /// Штамп.Check(Mtr) - проверяем, что данные в Mtr содержат сигнатуры Штампа на нужных местах
 /// </summary>
 /// <param name="doc">проверяемый Документ</param>
 /// <returns>true, если результат проверки положительный, иначе false</returns>
 /// <history> 12.12.13
 /// 16.12.13 (ПХ) перенес в класс Stamp и переписал
 /// 13.1.2014 - переписано
 /// 18.1.14 (ПХ) - переписано еще раз: проверяем mtr
 /// </history>
 public bool Check(Mtr mtr)
 {
     if (mtr == null) return false;
     foreach (OneStamp st in stamps) if (!st.Check(mtr)) return false;
     return true;
 }
示例#15
0
 private static void colCpy(Mtr mtr, int rwMtr, Excel.Range rng, int rwRng)
 {
     int cols = mtr.iEOC();
     //!!! 2.1.16            for (int col = 1; col <= cols; col++) rng.Cells[rwRng, col] = mtr.get(rwMtr, col);
 }
示例#16
0
 public static void saveRngValue(Mtr Body, int rowToPaste = 1, bool AutoFit = true, string msg = "")
 {
     Log.set("saveRngValue");
     int r0 = Body.LBoundR(), r1 = Body.iEOL(),    //!!
         c0 = Body.LBoundC(), c1 = Body.iEOC();    //!!
     try
     {
         object[,] obj = new object[r1, c1];
         for (int i = 0; i < r1; i++)
             for (int j = 0; j < c1; j++)
                 obj[i, j] = Body[i + 1, j + 1];
         r1 = r1 - r0 + rowToPaste;
         r0 = rowToPaste;
         Excel.Range cell1 = _sh.Cells[r0, c0];
         Excel.Range cell2 = _sh.Cells[r1, c1];
         Excel.Range rng = _sh.Range[cell1, cell2];
         rng.Value2 = obj;
         if( AutoFit) for (int i = 1; i <= c1; i++) _sh.Columns[i].AutoFit();
     }
     catch (Exception e)
     {
         if (msg == "")
         { msg = "Range[ [" + r0 + ", " + c0 + "] , [" + r1 + ", " + c1 + "] ]"; }
         Log.FATAL(msg);
     }
     Log.exit();
 }