/// <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; }
//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(); }
/// <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; }
/// <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; }
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; }
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); }
//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(); }
/// <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(); }
/// <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(); }
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(); }
/// <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
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); }
public static void setWb(Excel.Workbook _Wb, Mtr _tocMtr) { Wb = _Wb; tocMtr = _tocMtr; }
/// <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; }
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); }
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(); }