using LinqToExcel; // 使用 LinqToExcel 讀 excel using Microsoft.Ajax.Utilities; using NLog; using Qcarbon.ViewModels.DTO; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Web; using Weee.DAL; using Weee.Models; using Weee.Models.Paramemter; namespace Weee.Areas.Admin.Supports { public class SimaproExcelImporter { protected Logger log; private ExcelQueryFactory excelFile; private string FName; public SimaproExcelImporter(string fileName) { log = NLog.LogManager.GetCurrentClassLogger(); log.Info("SimaproExcelImporter 1"); excelFile = new ExcelQueryFactory(fileName); FName = fileName;//DL-6 log.Info("SimaproExcelImporter 2"); } public void DeleteExcelFile(string fileName) { File.Delete(fileName); } public void InsertSimaproData(string version, string description = "", string parasource = "") { log.Info("InsertSimaproData 1"); excelFile.AddMapping(x => x.Encoding, "編碼"); excelFile.AddMapping(x => x.Value, "kg CO2 eq"); excelFile.AddMapping(x => x.Unit, "Unit"); excelFile.AddMapping(x => x.Remark, "Remark"); excelFile.AddMapping(x => x.Remark, "Remarks"); excelFile.AddMapping(x => x.Database, "Database"); excelFile.AddMapping(x => x.Database, "database"); excelFile.AddMapping(x => x.Project, "Project"); excelFile.AddMapping(x => x.Description, "Tool"); excelFile.AddMapping(x => x.typeTW, "類型"); excelFile.AddMapping(x => x.typeEN, "Cat"); log.Info("InsertSimaproData 2"); var simaproVersion = new SimaproVersion(); simaproVersion.Version = version; simaproVersion.Description = description; simaproVersion.paraSource = parasource; int i = 0; System.Diagnostics.Debug.WriteLine("start " + DateTime.Now); using (var db = new WeeeDataContext()) { simaproVersion = db.SimaproVersions.Add(simaproVersion); db.SaveChanges(); log.Info("InsertSimaproData 3"); var sheetNames = excelFile.GetWorksheetNames(); log.Info("InsertSimaproData 4"); foreach (var sheetName in sheetNames) { System.Diagnostics.Debug.WriteLine("start row: " + " " + DateTime.Now); log.Info("InsertSimaproData 5"); var rows = from c in excelFile.Worksheet(sheetName) select c; log.Info("InsertSimaproData 6"); System.Diagnostics.Debug.WriteLine("end row: " + " " + DateTime.Now); if (rows.Count() > 0) { var simaproParameterCategory = new SimaproParameterCategory(); simaproParameterCategory.DisplayNameTW = sheetName; simaproParameterCategory.DisplayNameCN = sheetName; simaproParameterCategory.DisplayNameEN = sheetName; simaproParameterCategory.VersionID = simaproVersion.ID; simaproParameterCategory = db.SimaproCategories.Add(simaproParameterCategory); db.SaveChanges(); i++; System.Diagnostics.Debug.WriteLine("start SimaproParameterType: " + i + " " + DateTime.Now); /* * simaproParameterTypes */ Dictionary simTypeEN = new Dictionary(); Dictionary simTypeTW = new Dictionary(); log.Info("InsertSimaproData 7"); excelFile.AddMapping(x => x.DisplayNameTW, "類型"); excelFile.AddMapping(x => x.DisplayNameCN, "类型"); excelFile.AddMapping(x => x.DisplayNameEN, "Cat"); var excelContent = excelFile.Worksheet(sheetName); log.Info("InsertSimaproData 8"); Dictionary listSimaproParameterType = new Dictionary(); foreach (var row in excelContent) { string nameEN = ""; if (row.DisplayNameEN != null) nameEN = row.DisplayNameEN; string nameCN = ""; if (row.DisplayNameCN != null) nameCN = row.DisplayNameCN; string nameDefault = ""; if (row.DisplayNameTW != null) nameDefault = row.DisplayNameTW; else nameDefault = nameEN; var simaproParameterType = new SimaproParameterType(); simaproParameterType.DisplayNameTW = nameDefault; simaproParameterType.DisplayNameCN = nameCN; simaproParameterType.DisplayNameEN = nameEN; simaproParameterType.CategoryID = simaproParameterCategory.ID; if (!string.IsNullOrWhiteSpace(nameDefault) && !listSimaproParameterType.ContainsKey(nameDefault)) { listSimaproParameterType.Add(nameDefault, simaproParameterType); } } System.Diagnostics.Debug.WriteLine("end SimaproParameterType: " + i + " " + DateTime.Now); db.SimaproTypes.AddRange(listSimaproParameterType.Values); db.SaveChanges(); foreach (SimaproParameterType simaproParameterType in listSimaproParameterType.Values) { if (!string.IsNullOrWhiteSpace(simaproParameterType.DisplayNameEN) && !simTypeEN.ContainsKey(simaproParameterType.DisplayNameEN)) { simTypeEN.Add(simaproParameterType.DisplayNameEN, simaproParameterType.ID); } if (!string.IsNullOrWhiteSpace(simaproParameterType.DisplayNameTW) && !simTypeTW.ContainsKey(simaproParameterType.DisplayNameTW)) { simTypeTW.Add(simaproParameterType.DisplayNameTW, simaproParameterType.ID); } } System.Diagnostics.Debug.WriteLine("end add SimaproParameterType: " + i + " " + DateTime.Now); System.Diagnostics.Debug.WriteLine("start simaproParameters: " + i + " " + DateTime.Now); /* * simaproParameters */ var emptySimaproType = new SimaproParameterType(); emptySimaproType.DisplayNameTW = "(全部)"; emptySimaproType.DisplayNameCN = "(全部)"; emptySimaproType.DisplayNameEN = "(all)"; emptySimaproType.CategoryID = simaproParameterCategory.ID; log.Info("InsertSimaproData 9"); List listSimaproParameterImport = new List(); excelFile.AddMapping(x => x.DisplayNameTW, "中文"); excelFile.AddMapping(x => x.DisplayNameCN, "簡體中文"); excelFile.AddMapping(x => x.DisplayNameEN, "Simapro name"); var excelContent2 = excelFile.Worksheet(sheetName); log.Info("InsertSimaproData 10"); foreach (var row in excelContent2) { var simaproParameter = new SimaproParameter(); simaproParameter.DisplayNameTW = row.DisplayNameTW != null ? row.DisplayNameTW : row.DisplayNameEN; if (string.IsNullOrWhiteSpace(simaproParameter.DisplayNameTW)) { Thread.Sleep(0); continue; } simaproParameter.DisplayNameCN = row.DisplayNameCN; simaproParameter.DisplayNameEN = row.DisplayNameEN; simaproParameter.Encoding = row.Encoding; simaproParameter.Value = row.Value; simaproParameter.Unit = row.Unit; simaproParameter.Remark = row.Remark; simaproParameter.Database = row.Database; simaproParameter.Project = row.Project; simaproParameter.Description = row.Description; if (!string.IsNullOrWhiteSpace(row.typeEN) && simTypeEN.ContainsKey(row.typeEN)) { simaproParameter.TypeID = simTypeEN[row.typeEN]; listSimaproParameterImport.Add(simaproParameter); } else if (!string.IsNullOrWhiteSpace(row.typeTW) && simTypeTW.ContainsKey(row.typeTW)) { simaproParameter.TypeID = simTypeTW[row.typeTW]; listSimaproParameterImport.Add(simaproParameter); } else { SimaproParameter paraRec; string json = CScommon.JsonUtl.fromT(simaproParameter); paraRec = CScommon.JsonUtl.toT(json); emptySimaproType.Parameters.Add(paraRec); } if (listSimaproParameterImport.Count >= 1000) { db.SimaproParameters.AddRange(listSimaproParameterImport); db.SaveChanges(); listSimaproParameterImport.Clear(); } } System.Diagnostics.Debug.WriteLine("end simaproParameters: " + i + " " + DateTime.Now); if (listSimaproParameterImport.Count > 0) { db.SimaproParameters.AddRange(listSimaproParameterImport); db.SaveChanges(); } System.Diagnostics.Debug.WriteLine("end add simaproParameters: " + i + " " + DateTime.Now); if (emptySimaproType.Parameters.Count > 0) { db.SimaproTypes.Add(emptySimaproType); db.SaveChanges(); } System.Diagnostics.Debug.WriteLine("end saving: " + i + " " + DateTime.Now); } } System.Diagnostics.Debug.WriteLine("end " + DateTime.Now); } Thread.Sleep(0); log.Info("InsertSimaproData 11 end"); } public void OLDInsertSimaproData(string version, string description = "", string parasource = "") { System.Diagnostics.Debug.WriteLine("start " + DateTime.Now); var simaproVersion = new SimaproVersion(); simaproVersion.Version = version; simaproVersion.Description = description; simaproVersion.paraSource = parasource; int i = 0; var simaproParameterCategories = this.MappingExcelColumnToSimaproParameterCategory(); using (var db = new WeeeDataContext()) { foreach (var simaproParameterCategory in simaproParameterCategories) { i++; var sheetName = simaproParameterCategory.DisplayNameEN; var simaproParameterTypes = this.MappingExcelColumnToSimaproParameterType(sheetName); var simaproParameters = this.MappingExcelColumnToSimaproParameter(sheetName); var emptySimaproType=new SimaproParameterType(); emptySimaproType.DisplayNameTW = "(全部)"; emptySimaproType.DisplayNameCN = "(全部)"; emptySimaproType.DisplayNameEN = "(all)"; //simaproParameterTypes = this.SimaproTypeNormalization(simaproParameterTypes); Dictionary simTypeEN = new Dictionary(); Dictionary simTypeTW = new Dictionary(); int j = 0; foreach (var rec in simaproParameterTypes) { if (!string.IsNullOrWhiteSpace(rec.Value.DisplayNameEN)) simTypeEN.Add(rec.Value.DisplayNameEN, rec.Value); if (!string.IsNullOrWhiteSpace(rec.Value.DisplayNameTW)) simTypeTW.Add(rec.Value.DisplayNameTW, rec.Value); j++; } j = 0; foreach (var simaproParameter in simaproParameters) { SimaproParameter paraRec; string json = CScommon.JsonUtl.fromT(simaproParameter); paraRec = CScommon.JsonUtl.toT(json); if (!string.IsNullOrWhiteSpace(simaproParameter.typeEN) && simTypeEN.ContainsKey(simaproParameter.typeEN)) simTypeEN[simaproParameter.typeEN].Parameters.Add(paraRec); else if (!string.IsNullOrWhiteSpace(simaproParameter.typeTW) && simTypeTW.ContainsKey(simaproParameter.typeTW)) simTypeTW[simaproParameter.typeTW].Parameters.Add(paraRec); //if (simaproParameter.typeEN == simaproParameterType.DisplayNameEN || // simaproParameter.typeTW == simaproParameterType.DisplayNameTW) //{ // simaproParameterType.Parameters.Add(paraRec); //} else emptySimaproType.Parameters.Add(paraRec); j++; } if (emptySimaproType.Parameters.Count>0) simaproParameterTypes.Add(emptySimaproType.DisplayNameTW, emptySimaproType); j = 0; foreach (var simaproParameterType in simaproParameterTypes) { simaproParameterCategory.SubTypes.Add(simaproParameterType.Value); j++; } simaproVersion.Categories.Add(simaproParameterCategory); } db.SimaproVersions.Add(simaproVersion); db.SaveChanges(); } Thread.Sleep(0); System.Diagnostics.Debug.WriteLine("end " + DateTime.Now); } private List MappingExcelColumnToSimaproParameterCategory() { var simaproParameterCategories = new List(); var sheetNames = excelFile.GetWorksheetNames(); foreach (var sheetName in sheetNames) { var rows = from c in excelFile.Worksheet(sheetName) select c; if (rows.Count() > 0) { //var cols = excelFile.GetColumnNames(sheetName); //if (cols.Count() >= 7 || ! FName.Contains("xlsx")) { var simaproParameterCategory = new SimaproParameterCategory(); simaproParameterCategory.DisplayNameTW = sheetName; simaproParameterCategory.DisplayNameCN = sheetName; simaproParameterCategory.DisplayNameEN = sheetName; simaproParameterCategories.Add(simaproParameterCategory); } } } return simaproParameterCategories; } private Dictionary MappingExcelColumnToSimaproParameterType(string sheetName) { var simaproParameterTypes = new Dictionary(); //excelFile.AddMapping(x => x.DisplayNameTW, "中文"); //excelFile.AddMapping(x => x.DisplayNameCN, "簡體中文"); //excelFile.AddMapping(x => x.DisplayNameEN, "Simapro name"); excelFile.AddMapping(x => x.DisplayNameTW, "類型"); excelFile.AddMapping(x => x.DisplayNameCN, "类型"); excelFile.AddMapping(x => x.DisplayNameEN, "Cat"); var excelContent = excelFile.Worksheet(sheetName); int counts = excelContent.ToList().Count; int i = 0; foreach (var row in excelContent) { i++; var simaproParameterType = new SimaproParameterType(); string nameEN = ""; if (row.DisplayNameEN != null) nameEN = row.DisplayNameEN;//.Split(',')[0]; //else // continue; string nameCN = ""; if (row.DisplayNameCN != null) nameCN = row.DisplayNameCN;//.Split(',')[0]; string nameDefault = ""; if (row.DisplayNameTW != null) nameDefault = row.DisplayNameTW;//.Split(',')[0]; else nameDefault = nameEN; simaproParameterType.DisplayNameTW = nameDefault; //if (string.IsNullOrWhiteSpace(nameDefault)) //{ // continue; // Thread.Sleep(0); //} simaproParameterType.DisplayNameCN = nameCN; simaproParameterType.DisplayNameEN = nameEN; if (!string.IsNullOrWhiteSpace(nameDefault) && !simaproParameterTypes.ContainsKey(nameDefault)) simaproParameterTypes.Add(nameDefault, simaproParameterType); } return simaproParameterTypes; } private List MappingExcelColumnToSimaproParameter(string sheetName) { var simaproParameters = new List(); try { excelFile.AddMapping(x => x.DisplayNameTW, "中文"); excelFile.AddMapping(x => x.DisplayNameCN, "簡體中文"); excelFile.AddMapping(x => x.DisplayNameEN, "Simapro name"); excelFile.AddMapping(x => x.Encoding, "編碼"); excelFile.AddMapping(x => x.Value, "kg CO2 eq"); excelFile.AddMapping(x => x.Unit, "Unit"); excelFile.AddMapping(x => x.Remark, "Remark"); excelFile.AddMapping(x => x.Remark, "Remarks"); excelFile.AddMapping(x => x.Database, "Database"); excelFile.AddMapping(x => x.Database, "database"); excelFile.AddMapping(x => x.Project, "Project"); excelFile.AddMapping(x => x.Description, "Tool"); excelFile.AddMapping(x => x.typeTW, "類型"); excelFile.AddMapping(x => x.typeEN, "Cat"); var excelContent = excelFile.Worksheet(sheetName); int rows = 0; foreach (var row in excelContent) { var simaproParameter = new SimaproParameterImport(); //if (row.DisplayNameEN == null) { continue; } simaproParameter.DisplayNameTW = row.DisplayNameTW != null ? row.DisplayNameTW : row.DisplayNameEN; if (string.IsNullOrWhiteSpace(simaproParameter.DisplayNameTW)) { Thread.Sleep(0); continue; } rows++; simaproParameter.DisplayNameCN = row.DisplayNameCN; simaproParameter.DisplayNameEN = row.DisplayNameEN; simaproParameter.Encoding = row.Encoding; simaproParameter.Value = row.Value; simaproParameter.Unit = row.Unit; simaproParameter.Remark = row.Remark; simaproParameter.Database = row.Database; simaproParameter.Project=row.Project; simaproParameter.Description = row.Description; simaproParameter.typeTW = row.typeTW; simaproParameter.typeEN = row.typeEN; simaproParameters.Add(simaproParameter); } } catch(Exception ex) { throw new Exception($"sheet: {sheetName} failed({ex.Message})"); } return simaproParameters; } private List SimaproTypeNormalization(List simaproParameterTypes) { var resultOfSimaproTypes = new List(); foreach (var simaproParameterType in simaproParameterTypes) { var IsExist = false; foreach (var resultOfSimaproType in resultOfSimaproTypes) { if (!string.IsNullOrWhiteSpace(resultOfSimaproType.DisplayNameEN) && resultOfSimaproType.DisplayNameEN == simaproParameterType.DisplayNameEN) { IsExist = true; break; } if (!string.IsNullOrWhiteSpace(resultOfSimaproType.DisplayNameTW) && resultOfSimaproType.DisplayNameTW == simaproParameterType.DisplayNameTW) { IsExist = true; break; } } if (!IsExist && !string.IsNullOrWhiteSpace(simaproParameterType.DisplayNameTW)) resultOfSimaproTypes.Add(simaproParameterType); } return resultOfSimaproTypes; } } }