private ExpandoObject GetHeaderObject(DataTable dt, fk_doc fkDoc, List <fk_code> fkCodes) { dynamic header = new ExpandoObject(); header.Marker = Constant.MarkerXlHeader; foreach (var fkcode in fkCodes.Where(x => x.Marker == Constant.MarkerXlHeader)) { var cellname = fkcode.Code.Between("(", ")"); // DOCDATE(A2) var cellval = dt.Rows[cellname.GetRowIndex()].ItemArray[cellname.GetColumnIndex()].ToString(); if (fkcode.Descript.Contains("{}")) // за{}г. { var adelimiters = fkcode.Descript.Split("{}"); if (!string.IsNullOrWhiteSpace(adelimiters[0])) { cellval = cellval.From(adelimiters[0].Trim()); } if (!string.IsNullOrWhiteSpace(adelimiters[1])) { cellval = cellval.To(adelimiters[1].Trim()); } } ((IDictionary <string, object>)header).Add(fkcode.Code.To("("), cellval.ToFkTypeVal(fkcode)); } return(header); }
private ExpandoObject GetMaketObject(DataTable dt, fk_doc fkDoc, List <fk_code> fkCodes) { dynamic header = new ExpandoObject(); header.Marker = Constant.MarkerDocxHeader; foreach (var fkcode in fkCodes.Where(x => x.Marker.Trim() == Constant.MarkerDocxHeader)) { var val = ""; if (fkcode.Code == "MAKET") { val = FileData.DocxTextBetweenParagaphs("Макет файла", "Пример файла"); } else if (fkcode.Code == "VERSIONSTR") { val = FileData.DocxTextBetweenParagaphs("Пример файла", "FROM", new string[1] { "FK|" }); } else if (fkcode.Code == "NAME") { val = ((string)FileData.DocxTextBetweenParagaphs("", "Назначение и маршрут")).Substr(0, 80); } ((IDictionary <string, object>)header).Add(fkcode.Code, val.ToFkTypeVal(fkcode)); } return(header); }
private fk_code FkCodeRecord(fk_doc fkDoc, dynamic objTb, ImportParam importParam) { if (fkDoc == null) { return(null); } //if (string.IsNullOrWhiteSpace(objTb.NumOrder)) // филтр // return null; fk_code fkCode = new fk_code() { DocId = fkDoc.Sysid, Marker = objTb.Marker, NumPos = objTb.NumPos, NumOrder = objTb.NumOrder, Code = objTb.Code, FldType = objTb.FldType, FldLen = objTb.FldLen, IsFilled = ((string)objTb.IsFilled) == "Да", Descript = objTb.Descript, Comments = objTb.Comments }; // fkCode.FkDoc = fkDoc; return(fkCode); }
private async Task <List <ExpandoObject> > GetXlObject(DataTable dt, fk_doc fkDoc, List <fk_code> fkCodes) { var maket = ImportParam.TypeImp == ImportType.Import ? fkDoc.MaketImport : ImportParam.TypeImp == ImportType.Preview ? fkDoc.MaketPreview : fkDoc.MaketFull; // var dicScheme = FkDictionary(maket); var doc = new List <ExpandoObject>(); // HEADER var header = GetHeaderObject(dt, fkDoc, fkCodes); doc.Add(header); // TB var startrow = Convert.ToInt32(fkCodes.Where(x => x.Marker == "STARTROW").FirstOrDefault().Code); for (var i = startrow - 1; i < dt.Rows.Count; i++) { dynamic obj = new ExpandoObject(); obj.Marker = Constant.MarkerXlTable; foreach (var fkcode in fkCodes.Where(x => x.Marker == Constant.MarkerXlTable && (x.NumOrder ?? 0) > 0) .OrderBy(x => x.NumOrder)) { //if (!markerpar.Flds.Contains(fkcode.Code)) // continue; object val = null; var cellval = dt.Rows[i].ItemArray[(fkcode.NumOrder ?? 0) - 1]; if (cellval != null) { val = cellval.ToString().ToFkTypeVal(fkcode); } ((IDictionary <string, object>)obj).Add(fkcode.Code, val); } doc.Add(obj); } return(doc); }
public async Task <object> ParserFormat(object doc, ImportParam importParam) { var fkcodes = new List <fk_code>(); dynamic header = ((List <ExpandoObject>)doc).FirstOrDefault(x => ((dynamic)x).Marker.Trim() == Constant.MarkerDocxHeader); var maket = (string)header.MAKET; string formatnom = CheckFormatInFile(header, importParam); if (string.IsNullOrWhiteSpace(formatnom)) { return(fkcodes); } var fkDoc = await _dohodDbContext.fk_doc.Where(x => (x.Group ?? "") == importParam.FormatGroup && (x.Format ?? "") == importParam.Format) .OrderBy(x => x.Nfrm).LastOrDefaultAsync(x => x.Nfrm == formatnom); if (fkDoc == null) { fkDoc = new fk_doc() { Group = importParam.FormatGroup, Format = importParam.Format, Nfrm = formatnom, Type = "IMP", } } ; // Эти поля корректируется при переимпорте fkDoc.MaketImport = maket; fkDoc.MaketPreview = maket; fkDoc.MaketFull = maket; fkDoc.Name = ((string)header.NAME).Substr(0, 80); //await DeleteTheFileData(importParam); // foreach (dynamic obj in (List <ExpandoObject>)doc) { if (obj.Marker.Trim() == Constant.MarkerDocxHeader) { continue; } // TB var fkcode = FkCodeRecord(fkDoc, obj, importParam); if (fkcode != null) { fkcodes.Add(fkcode); } } return(fkcodes); }
public async Task <bool> IsFoundMfXlVersion(DataTable dt, fk_doc fkdoc) { var fkcodes = await _dohodDbContext.fk_code.AsNoTracking().Where(x => x.DocId == fkdoc.Sysid).ToListAsync(); dynamic header = GetHeaderObject(dt, fkdoc, fkcodes); if (header.DOCDATE == null || header.TERRITORY == null || header.DATEVYB == null) { return(false); } return(true); }
public async Task <ResultCrmDb> ParseFile() { var result = new ResultCrmDb(); var dt = FileData.XlToDataTable(); if (dt.Rows.Count == 0) { result.AddError(Constant.ErrCodeImport, $"Файл не содержит данных."); return(result); } var fkDocs = await _dohodDbContext.fk_doc.Where(x => (x.Group ?? "") == ImportParam.FormatGroup && (x.Format ?? "") == ImportParam.Format) .OrderBy(x => x.Nfrm).ToListAsync(); fk_doc fkDoc = null; foreach (fk_doc fkdoc in fkDocs) { if (await IsFoundMfXlVersion(dt, fkdoc)) { fkDoc = fkdoc; break; } } if (fkDoc == null) { result.AddError(Constant.ErrCodeImport, $"Требуется файл формата: {ImportParam.Format}"); return(result); } var fkCodes = await _dohodDbContext.fk_code.Where(x => x.DocId == fkDoc.Sysid).ToListAsync(); if (fkCodes == null || fkCodes.Count == 0) { result.AddError(Constant.ErrCodeImport, $"Не заполнена структура формата {ImportParam.Format} версии {fkDoc.Nfrm} в fk_doc"); return(result); } result.Result = await GetXlObject(dt, fkDoc, fkCodes); return(result); return(result); }
private async Task <List <ExpandoObject> > GetFkObject(string txt, fk_doc fkDoc, List <fk_code> fkCodes) { var maket = ImportParam.TypeImp == ImportType.Import ? fkDoc.MaketImport : ImportParam.TypeImp == ImportType.Preview ? fkDoc.MaketPreview : fkDoc.MaketFull; var dicScheme = FkDictionary(maket); var doc = new List <ExpandoObject>(); using (StringReader reader = new StringReader(txt)) { while (true) { var line = await reader.ReadLineAsync(); if (line == null) { break; } var aline = line.Split('|'); var marker = aline[0]; if (string.IsNullOrWhiteSpace(marker) || marker == versionMarker || !dicScheme.ContainsKey(marker)) { continue; } var markerpar = dicScheme[marker]; dynamic obj = new ExpandoObject(); obj.Marker = marker; foreach (var fkcode in fkCodes.Where(x => x.Marker == marker && (x.NumOrder ?? 0) > 0) .OrderBy(x => x.NumOrder)) { if (!markerpar.Flds.Contains(fkcode.Code)) { continue; } var val = aline[fkcode.NumOrder ?? 0].ToFkTypeVal(fkcode); ((IDictionary <string, object>)obj).Add(fkcode.Code, val); } doc.Add(obj); } return(doc); } }
private List <ExpandoObject> GetDocsObject(DataTable dt, fk_doc fkDoc, List <fk_code> fkCodes) { var doc = new List <ExpandoObject>(); // MAKET var header = GetMaketObject(dt, fkDoc, fkCodes); doc.Add(header); // TB var startrow = 1; // Пропуская заголовок var numorder = 0; var prevMarker = ""; for (var i = startrow; i < dt.Rows.Count; i++) { dynamic obj = new ExpandoObject(); foreach (var fkcode in fkCodes.Where(x => x.Marker.Trim() == Constant.MarkerDocxTable) // && (x.NumOrder ?? 0) > 0 .OrderBy(x => x.NumOrder)) { object val = null; var cellval = dt.Rows[i].ItemArray[(fkcode.NumOrder ?? 0) - 1]; if (cellval != null) { val = ((string)cellval).ToFkTypeVal(fkcode); } ((IDictionary <string, object>)obj).Add(fkcode.Code, val); } var isMarkerHeader = string.IsNullOrWhiteSpace(obj.FldType) && string.IsNullOrWhiteSpace(obj.FldLen); // && string.IsNullOrWhiteSpace(obj.Comments); ZF - !!! var isHeaderComment = isMarkerHeader && string.IsNullOrWhiteSpace(obj.Code); if (isMarkerHeader && !isHeaderComment) { // Начало блока prevMarker = ((string)obj.Code).To("(", true); numorder = 0; } obj.Marker = prevMarker; obj.NumPos = i; obj.NumOrder = isHeaderComment ? 0 : numorder++; doc.Add(obj); } return(doc); }