using DeviceRepairAndOptimization.Models; using DeviceRepairAndOptimization.Models.DeviceRepair; using DeviceRepairAndOptimization.Utils; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; namespace DeviceRepairAndOptimization.Pages.RepairView { public partial class page_RepairRecordView : FormBase { private KeyOfValuesV1 Template = new KeyOfValuesV1(); /// /// 查询字符串 /// private string FilterString { get { return txt_Filter.Text.Trim(); } } /// /// 查询开始时间 /// private DateTime FilterStartTime { get { if (de_Start.EditValue == null) de_Start.EditValue = DateTime.Today.AddMonths(-1); return (DateTime)de_Start.EditValue; } } /// /// 查询结束时间 /// private DateTime FilterEndTime { get { if (de_End.EditValue == null) de_End.EditValue = DateTime.Today.AddHours(23).AddMinutes(59).AddSeconds(59); return (DateTime)de_End.EditValue; } } private Dictionary ExportHeaderInfos = null; /// /// 当前选中行下标 /// private int CurrentRowIndex; /// /// 当前选中对象 /// private view_DeviceRepairRecord CurrentDataObject; public page_RepairRecordView() { InitializeComponent(); this.Load += Page_RepairRecordView_Load; gridView1.CustomDrawRowIndicator += (s, e) => { if (e.Info.IsRowIndicator && e.RowHandle >= 0) { e.Info.DisplayText = (e.RowHandle + 1).ToString(); e.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; e.Appearance.TextOptions.VAlignment = DevExpress.Utils.VertAlignment.Center; } }; } private void Page_RepairRecordView_Load(object sender, EventArgs e) { InitializeGridData(); de_Start.EditValue = DateTime.Today.AddMonths(-1); de_End.EditValue = DateTime.Today.AddHours(23).AddMinutes(59).AddSeconds(59); layoutControlGroup1.ViewInfo.OwnerILayoutControl.AllowCustomizationMenu = false; } /// /// 数据加载 /// void InitializeGridData() { try { splashScreenManager1.ShowWaitForm(); APIResponseData apiResponseData = Business.DeviceRepairManager.Instance.Filter(FilterString, FilterStartTime, FilterEndTime); List lst = new List(); if (apiResponseData.Code == 1) lst = apiResponseData.ToDeserializeObject>(); dgvDatas.DataSource = lst; gridView1.BestFitColumns(); splashScreenManager1.TryCloseWait(); } catch (Exception ex) { splashScreenManager1.TryCloseWait(); XtraMessageBoxHelper.Error(ex.Message); } } /// /// 导入 /// /// /// private void btn_Import_Click(object sender, EventArgs e) { try { if (!ApiHelper.Instance.RoleExistsAuth("BIZ_REPAIRRECORD_IMPORT").ToBool()) { XtraMessageBoxHelper.Error($"当前账号缺少此操作的权限"); return; } //扩展 - 自定义待选择文件类型 OpenFileDialog ofd = new OpenFileDialog(); //自定义待选择文件类型 ofd.Filter = "Excel文件|*.xls;*.xlsx;*.xlsm;"; if (ofd.ShowDialog() == DialogResult.OK) { string loadFilePath = ofd.FileName; if (XtraMessageBoxHelper.Ask("确定现在导入吗?") == DialogResult.OK) { string fileExtension = Path.GetExtension(loadFilePath); using (FileStream fs = new FileStream(loadFilePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook; if (fileExtension.Equals(".xls", StringComparison.CurrentCultureIgnoreCase)) workbook = new HSSFWorkbook(fs); // 处理.xls文件 else if (fileExtension.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase)) workbook = new XSSFWorkbook(fs); // 处理.xlsx文件 else { throw new Exception("不支持的文件格式"); } // 获取第一个工作表 ISheet sheet = workbook.GetSheetAt(0); // 读取表头 IRow headerRow = sheet.GetRow(0); // 判断字段数量是否匹配模板 if (headerRow.LastCellNum != Template.KeyValuePairs.Count) { throw new Exception("数据模板列数不符合!"); } DataTable ImportDatas = new DataTable(); #region 列头导入 List NotFoundCell = new List(); for (int colIndex = 0; colIndex < Template.KeyValuePairs.Count; colIndex++) { ICell cell = headerRow.GetCell(colIndex); string CellValue = string.Empty; if (cell != null) CellValue = cell.StringCellValue; // 列名为空 或 非模板内列 CellTypeOfValue cellTemplate = Template.KeyValuePairs.FirstOrDefault(x => x.Caption.Equals(CellValue, StringComparison.CurrentCultureIgnoreCase)); if (string.IsNullOrWhiteSpace(CellValue) || cellTemplate == null) { NotFoundCell.Add($"位置:【{ConvertColumnIndexToColumnName(colIndex)}】的值:{CellValue}不在模板中!"); continue; } ImportDatas.Columns.Add(cellTemplate.FieldName, cellTemplate.FieldType); } #endregion #region 读取数据行 // 读取数据行并将其添加到 DataTable 中 for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++) { try { IRow dataRow = sheet.GetRow(rowIndex); if (dataRow != null) { DataRow newRow = ImportDatas.NewRow(); for (int colIndex = 0; colIndex < dataRow.LastCellNum; colIndex++) { ICell cell = dataRow.GetCell(colIndex); if (cell != null) { if (cell.CellType == CellType.Numeric) { if (DateUtil.IsCellDateFormatted(cell)) { // 日期类型 DateTime dateValue = cell.DateCellValue; if (dateValue.Year == 1899) { DateTime nDateValue = new DateTime(); if (DateTime.TryParse(newRow[colIndex - 1] + "", out nDateValue)) { nDateValue = new DateTime(nDateValue.Year, nDateValue.Month, nDateValue.Day, dateValue.Hour, dateValue.Minute, dateValue.Second); newRow[colIndex] = nDateValue; continue; } else { dateValue = dateValue.AddDays(1); } } newRow[colIndex] = dateValue; } else { //其他数字类型 newRow[colIndex] = cell.NumericCellValue; } } else if (cell.CellType == CellType.Blank) { // 空白 newRow[colIndex] = DBNull.Value; } else if (cell.CellType == CellType.Formula) { // 公式 if (fileExtension.Equals(".xls", StringComparison.CurrentCultureIgnoreCase)) { XSSFFormulaEvaluator eva = new XSSFFormulaEvaluator(workbook); if (eva.Evaluate(cell).CellType == CellType.Numeric) { newRow[colIndex] = eva.Evaluate(cell).NumberValue; } else { newRow[colIndex] = eva.Evaluate(cell).StringValue; } } else { HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(workbook); if (eva.Evaluate(cell).CellType == CellType.Numeric) { newRow[colIndex] = eva.Evaluate(cell).NumberValue; } else { newRow[colIndex] = eva.Evaluate(cell).StringValue; } } } else { newRow[colIndex] = cell.ToString(); } } } ImportDatas.Rows.Add(newRow); } } catch (Exception ex) { throw ex; } } #endregion // 模板中不存在的列 if (NotFoundCell.Count > 0) throw new Exception(string.Join("
", NotFoundCell)); List lst = ImportDatas.ToList(); APIResponseData apiResponseData = Business.DeviceRepairManager.Instance.Insertable(lst); if (apiResponseData.Code == 1) XtraMessageBoxHelper.Info(apiResponseData.Message); else XtraMessageBoxHelper.Error(apiResponseData.Message); InitializeGridData(); } } } } catch (Exception ex) { Invoke(new Action(() => { InitializeGridData(); })); XtraMessageBoxHelper.Error(ex.Message); } } string ConvertColumnIndexToColumnName(int index) { index = index + 1; int system = 26; char[] digArray = new char[100]; int i = 0; while (index > 0) { int mod = index % system; if (mod == 0) mod = system; digArray[i++] = (char)(mod - 1 + 'A'); index = (index - 1) / 26; } StringBuilder sb = new StringBuilder(i); for (int j = i - 1; j >= 0; j--) { sb.Append(digArray[j]); } return sb.ToString(); } /// /// 搜索 /// /// /// private void btn_Search_Click(object sender, EventArgs e) { try { if (this.FilterStartTime > DateTime.Today) throw new Exception("开始时间不允许大于当前时间!"); if (this.FilterStartTime >= this.FilterEndTime) throw new Exception("开始时间不允许大于结束时间!"); InitializeGridData(); } catch (Exception ex) { XtraMessageBoxHelper.Error(ex.Message); } } /// /// 编辑 /// /// /// private void btn_Edit_Click(object sender, EventArgs e) { try { if (!ApiHelper.Instance.RoleExistsAuth("BIZ_REPAIRRECORD_EDIT").ToBool()) { XtraMessageBoxHelper.Error($"当前账号缺少此操作的权限"); return; } CurrentRowIndex = gridView1.FocusedRowHandle; if (!gridView1.IsValidRowHandle(CurrentRowIndex)) { throw new Exception("请先选择记录所在行!"); } CurrentDataObject = gridView1.GetRow(CurrentRowIndex) as view_DeviceRepairRecord; if (CurrentDataObject == null) { throw new Exception("请先选择记录所在行!"); } using (page_RepairRecordEdit view = new page_RepairRecordEdit(CurrentDataObject.ToDeviceRepairRecord())) { if (view.ShowDialog() == DialogResult.OK) { Invoke(new Action(() => { InitializeGridData(); })); XtraMessageBoxHelper.Info("操作成功!"); } } } catch (Exception ex) { XtraMessageBoxHelper.Error(ex.Message); } } /// /// 表格选择行改变事件 /// /// /// private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { try { if (e.FocusedRowHandle >= 0) { CurrentRowIndex = e.FocusedRowHandle; CurrentDataObject = gridView1.GetRow(e.FocusedRowHandle) as view_DeviceRepairRecord; } } catch (Exception ex) { XtraMessageBoxHelper.Error(ex.Message); } } /// /// 当前数据导出 /// /// /// private void btn_Export_Click(object sender, EventArgs e) { try { if (!ApiHelper.Instance.RoleExistsAuth("BIZ_REPAIRRECORD_EXPORT").ToBool()) { XtraMessageBoxHelper.Error($"当前账号缺少此操作的权限"); return; } List lst = new List(); if (XtraMessageBoxHelper.AskYesNo("是否导出当前查询条件下的数据?(否为导出全部数据)") == DialogResult.No) { splashScreenManager1.ShowWaitForm(); APIResponseData apiResponseData = Business.DeviceRepairManager.Instance.Filter("", DateTime.MinValue, DateTime.Today.AddDays(1)); if (apiResponseData.Code == 1) lst = apiResponseData.ToDeserializeObject>(); } else { splashScreenManager1.ShowWaitForm(); lst = dgvDatas.DataSource as List; } SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Excel文件|*.xlsx;*.xls;"; string filePath = string.Empty; if (sfd.ShowDialog() == DialogResult.OK) { filePath = sfd.FileName; if (lst != null && lst.Count > 0) { InitializeExportHeaderInfos(); DataTable tbDatas = lst.toDataTable(); DataTable tbContent = new DataTable(); // 添加行信息 foreach (var item in ExportHeaderInfos) { tbContent.Columns.Add(item.Value); } // 添加内容 foreach (DataRow row in tbDatas.Rows) { DataRow r = tbContent.NewRow(); foreach (DataColumn col in tbContent.Columns) { string ColumnName = ExportHeaderInfos.FirstOrDefault(x => x.Value == col.ColumnName).Key; if (!string.IsNullOrWhiteSpace(ColumnName)) { if (timeColumns.Contains(ColumnName)) { DateTime time = default(DateTime); if (DateTime.TryParse(row[ColumnName] + "", out time)) { if (ColumnName.Equals("ActualDateOfIssuance", StringComparison.CurrentCultureIgnoreCase) || ColumnName.Equals("ReferenceDate", StringComparison.CurrentCultureIgnoreCase) ) { r[col.ColumnName] = time.ToString("d"); } else if (ColumnName.Equals("BasicStartTime", StringComparison.CurrentCultureIgnoreCase) || ColumnName.Equals("ReferenceTime", StringComparison.CurrentCultureIgnoreCase) ) { r[col.ColumnName] = time.ToString("T"); } else if (ColumnName.Equals("StartOfMaintenance", StringComparison.CurrentCultureIgnoreCase) || ColumnName.Equals("MaintenanceCompletionTime", StringComparison.CurrentCultureIgnoreCase) ) { r[col.ColumnName] = time.ToString("g"); } } else { r[col.ColumnName] = row[ColumnName]; } } else { r[col.ColumnName] = row[ColumnName]; } } } tbContent.Rows.Add(r); } byte[] bt = ExcelExport.Export(tbContent); File.WriteAllBytes(filePath, bt); } } splashScreenManager1.TryCloseWait(); } catch (Exception ex) { splashScreenManager1.TryCloseWait(); XtraMessageBoxHelper.Error(ex.Message); } } string[] timeColumns = new string[] { "ActualDateOfIssuance", "ReferenceDate", "BasicStartTime", "ReferenceTime", "StartOfMaintenance", "MaintenanceCompletionTime" }; void InitializeExportHeaderInfos() { if (ExportHeaderInfos == null) { ExportHeaderInfos = new Dictionary(); ExportHeaderInfos.Add("Plant", "工厂"); ExportHeaderInfos.Add("Installations", "设备"); ExportHeaderInfos.Add("PurchaseOrder", "订单"); ExportHeaderInfos.Add("OrderType", "订单类型"); ExportHeaderInfos.Add("TypesOfMaintenanceOperations", "维护作业类型"); ExportHeaderInfos.Add("FullProgramCosts", "全部计划成本"); ExportHeaderInfos.Add("Acttotcost", "ActTotCost"); ExportHeaderInfos.Add("SystemStatus", "系统状态"); ExportHeaderInfos.Add("TestLot", "检验批"); ExportHeaderInfos.Add("Tin", "技术标识号"); ExportHeaderInfos.Add("DescriptionOfTechnicalObjects", "技术对象描述"); ExportHeaderInfos.Add("Descriptive", "描述"); ExportHeaderInfos.Add("Importer", "输入者"); ExportHeaderInfos.Add("ActualDateOfIssuance", "实际下达日期"); ExportHeaderInfos.Add("BasicStartTime", "基本的开始时间"); ExportHeaderInfos.Add("ReferenceDate", "参考日期"); ExportHeaderInfos.Add("ReferenceTime", "参考时间"); ExportHeaderInfos.Add("FinalModifier", "最后修改者"); ExportHeaderInfos.Add("ReasonForDowntime", "停机原因"); ExportHeaderInfos.Add("MaintenancePersonnel", "维修人员"); ExportHeaderInfos.Add("StartOfMaintenance", "开始维修时间"); ExportHeaderInfos.Add("MaintenanceCompletionTime", "维修完成时间"); ExportHeaderInfos.Add("CauseOfFailure", "故障原因"); ExportHeaderInfos.Add("MaintenanceContent", "维修内容"); ExportHeaderInfos.Add("ReplacementParts", "配件"); ExportHeaderInfos.Add("Downtime", "停机时长"); ExportHeaderInfos.Add("MaintenancePeriod", "维修工时"); ExportHeaderInfos.Add("RepairMethods", "维修方式"); ExportHeaderInfos.Add("PhenomenologicalDistinction", "现象区分"); ExportHeaderInfos.Add("VerificationNumber", "验证编号"); ExportHeaderInfos.Add("OtherThan", "其它"); ExportHeaderInfos.Add("DeviceStatus", "设备状态"); ExportHeaderInfos.Add("Tier", "Tier"); ExportHeaderInfos.Add("DidTheFaultCauseAShutdown", "故障是否导致停机"); ExportHeaderInfos.Add("TierTrackers", "Tier跟踪人员"); ExportHeaderInfos.Add("StatusFeedbackAndTime", "状态反馈/及时间"); ExportHeaderInfos.Add("PartsAndServiceRequisitionTime", "配件/服务申购时间"); ExportHeaderInfos.Add("PartsAndServiceArrivalTime", "配件/服务到货时间"); ExportHeaderInfos.Add("PmAndAmAssociatedProjectLocation", "PM/AM关联项目位置"); } } } }