using DevExpress.XtraBars; using DevExpress.XtraBars.ToolbarForm; using DevExpress.XtraEditors; using DeviceRepair.Models; using DeviceRepair.Models.Enum; using System; using System.Windows.Forms; using DeviceRepair.Utils; using System.IO; using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using Newtonsoft.Json; using TsSFCDevice.Client.Biz.Impl; using System.Text.RegularExpressions; namespace TsSFCDevice.Client.Launch.CheckForm { public partial class pageFormVersionEdit : ToolbarForm { public MaintenanceFormVersionInfo CurrentModel; PreserveTemplate.BaseTemplate template = null; bool isAM = false; public pageFormVersionEdit() : this(new MaintenanceFormVersionInfo { FormBelong = EnumDeviceBelong.PM.ToString() }) { } public pageFormVersionEdit(MaintenanceFormVersionInfo currentModel) { InitializeComponent(); CurrentModel = currentModel; isAM = EnumDeviceBelong.AM.ToString() == currentModel.FormBelong; if (isAM) { txtVersion.Properties.Items.Clear(); txtVersion.Properties.Items.Add(new DevExpress.XtraEditors.Controls.RadioGroupItem { Description = "FM-P0075.01", Value = "FM-P0075.01" }); txtVersion.Properties.Items.Add(new DevExpress.XtraEditors.Controls.RadioGroupItem { Description = "FM-P0075.15", Value = "FM-P0075.15" }); txtVersion.EditValue = "FM-P0075.01"; this.Text = "AM 的点检表"; } } private void pageFormVersionEdit_Load(object sender, EventArgs e) { if (CurrentModel.AutoID != 0) { txtName.EditValue = CurrentModel.FormName; txtName.Enabled = false; txtCode.EditValue = CurrentModel.VersionCode; txtCode.Enabled = false; txtRev.EditValue = CurrentModel.VersionRev; txtRev.Enabled = false; txtFilePath.EditValue = CurrentModel.FormFileName ?? Path.GetFileName(CurrentModel.FormPath); txtFilePath.Enabled = false; txtVersion.EditValue = CurrentModel.VersionCode; txtVersion.Enabled = false; txtNote.EditValue = CurrentModel.Remarks; } } /// /// 提交 /// /// /// private void btnSave_ItemClick(object sender, ItemClickEventArgs e) { try { if (CanCloas()) { if (CurrentModel.AutoID == 0) { CurrentModel.ContentData = JsonConvert.SerializeObject(template); CurrentModel.FormName = txtName.EditValue + ""; CurrentModel.FormPath = txtFilePath.EditValue + ""; CurrentModel.FormStatus = true; CurrentModel.Remarks = txtNote.EditValue + ""; CurrentModel.VersionCode = txtCode.EditValue + ""; CurrentModel.VersionRev = txtRev.EditValue + ""; CurrentModel.FormFileName = Path.GetFileName(txtFilePath.EditValue + ""); CurrentModel.FormBelong = isAM ? "AM" : "PM"; } else { CurrentModel.Remarks = txtNote.EditValue + ""; } this.DialogResult = DialogResult.OK; } } catch (Exception ex) { XtraMessageBoxHelper.Error(ex.Message); return; } this.DialogResult = DialogResult.OK; } /// /// 选择文件 /// /// /// private void txtFilePath_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e) { if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) { try { XtraOpenFileDialog xtraOpenFileDialog1 = new XtraOpenFileDialog(); xtraOpenFileDialog1.FileName = string.Empty; xtraOpenFileDialog1.Filter = "(*.xls)|*.xls;*.xlsx"; xtraOpenFileDialog1.Multiselect = false; xtraOpenFileDialog1.Title = "请选择待导入的点检表Excel文件"; if (xtraOpenFileDialog1.ShowDialog(this) == DialogResult.OK) { string FilePath = xtraOpenFileDialog1.FileName; splashScreenManager1.ShowWaitForm(); template = null; using (FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Read)) { string fileExtension = Path.GetExtension(FilePath); MaintenanceFormVersionInfo entity; if (fileExtension.Equals(".xls", StringComparison.OrdinalIgnoreCase)) { // 如果是 .xls 文件 HSSFWorkbook workbook = new HSSFWorkbook(fileStream); if (isAM) { entity = ReadHeaderFromWorkbookAM(workbook); } else { entity = ReadHeaderFromWorkbookPM(workbook); } } else if (fileExtension.Equals(".xlsx", StringComparison.OrdinalIgnoreCase)) { // 如果是 .xlsx 文件 XSSFWorkbook workbook = new XSSFWorkbook(fileStream); if (isAM) { entity = ReadHeaderFromWorkbookAM(workbook); } else { entity = ReadHeaderFromWorkbookPM(workbook); } } else { // 不支持的文件类型 throw new NotSupportedException("不支持的文件类型"); } DevExpress.XtraSpreadsheet.SpreadsheetControl spreadsheetControl1 = new DevExpress.XtraSpreadsheet.SpreadsheetControl(); spreadsheetControl1.BeginUpdate(); spreadsheetControl1.LoadDocument(IOExtend.FileToByteArray(FilePath)); spreadsheetControl1.EndUpdate(); if (spreadsheetControl1.Document.Worksheets.Contains("正文")) spreadsheetControl1.Document.Worksheets.ActiveWorksheet = spreadsheetControl1.Document.Worksheets["正文"]; else if (spreadsheetControl1.Document.Worksheets.Contains("Table2")) spreadsheetControl1.Document.Worksheets.ActiveWorksheet = spreadsheetControl1.Document.Worksheets["Table2"]; else { throw new NotSupportedException("非标准设备保养表单!"); } switch (entity.VersionCode) { case PreserveTemplate.TemplateConstValue.CompositeTemplateV2: template = new PreserveTemplate.TemplateIndexV2(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; case PreserveTemplate.TemplateConstValue.CompositeTemplateV1: template = new PreserveTemplate.TemplateIndexV1(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; case PreserveTemplate.TemplateConstValue.MonthTemplateV1: template = new PreserveTemplate.Template_AM_17(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; case PreserveTemplate.TemplateConstValue.DailyTemplateV2: template = new PreserveTemplate.Template_AM_01(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; case PreserveTemplate.TemplateConstValue.DailyTemplateV1: template = new PreserveTemplate.Template_AM_15(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; default: template = null; break; } if (entity != null) { //检测当前文档是否存在 if (CheckFormRepository.Instance.Get_CheckForm_Exists(entity.VersionCode, entity.VersionRev)) { throw new Exception("当前点检表已存在!"); } } else { throw new Exception("请选择点检表文件!"); } txtCode.EditValue = entity.VersionCode; txtFilePath.EditValue = FilePath; txtName.EditValue = entity.FormName; txtRev.EditValue = entity.VersionRev; } splashScreenManager1.TryCloseWait(); } } catch (Exception ex) { splashScreenManager1.TryCloseWait(); XtraMessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } /// /// 校验表单 /// /// private bool CanCloas() { // 校验点检表文件 if (CurrentModel.AutoID == 0) { if ((txtFilePath.EditValue + "").IsNull()) throw new ArgumentException("文件路径不能为空!"); string FilePath = txtFilePath.EditValue + ""; if (!File.Exists(FilePath)) throw new ArgumentException("找不到待提交的文件!"); if (txtVersion.EditValue + "" != txtCode.EditValue + "") throw new ArgumentException("文件版本与上传文件版本不匹配!"); CurrentModel.FormPath = FilePath; // 校验说明 string Note = txtNote.EditValue + ""; if (!Note.IsNull() && Note.Length > 200) throw new ArgumentException("说明的文字长度不允许超出200字!"); } else { string Note = txtNote.EditValue + ""; if (!Note.IsNull() && Note.Length > 200) throw new ArgumentException("说明的文字长度不允许超出200字!"); } return true; } /// /// 从工作簿中读取页眉 /// /// /// private MaintenanceFormVersionInfo ReadHeaderFromWorkbookAM(IWorkbook workbook) { MaintenanceFormVersionInfo maintenance = null; try { // 获取第一个工作表 ISheet CurrentSheet = null; int SheetCount = workbook.NumberOfSheets; if (SheetCount == 0) { throw new ArgumentException("导入的点检表文件出错,文件中无内容!"); } CurrentSheet = workbook.GetSheet("Table2"); if (CurrentSheet == null) { throw new ArgumentException("导入的点检表文件出错,当前文件中不存在【Table2】的Sheet页!"); } // 获取页眉 if (CurrentSheet != null && CurrentSheet.Header != null) { Tuple tuple = GetPageHeadVersionInfo(CurrentSheet); maintenance = new MaintenanceFormVersionInfo(); maintenance.FormName = tuple.Item1; maintenance.VersionCode = tuple.Item2; maintenance.VersionRev = tuple.Item3; } // 验证模板内容 ArgumentException argEx; if (maintenance.VersionCode == PreserveTemplate.TemplateConstValue.DailyTemplateV2) { PreserveTemplate.FM_P0075_01 fm = new PreserveTemplate.FM_P0075_01(); argEx = fm.CheckCurrentSheet(CurrentSheet); } else if (maintenance.VersionCode == PreserveTemplate.TemplateConstValue.DailyTemplateV1) { PreserveTemplate.FM_P0075_15 fm = new PreserveTemplate.FM_P0075_15(); argEx = fm.CheckCurrentSheet(CurrentSheet); } else if (maintenance.VersionCode == PreserveTemplate.TemplateConstValue.MonthTemplateV1) { PreserveTemplate.FM_P0075_17 fm = new PreserveTemplate.FM_P0075_17(); argEx = fm.CheckCurrentSheet(CurrentSheet); } else { throw new ArgumentException($"未适配的点检表编号【{maintenance.VersionCode}】,无法导入!"); } if (argEx != null) throw argEx; return maintenance; } catch (Exception) { throw; } } /// /// 从工作簿中读取页眉 /// /// /// private MaintenanceFormVersionInfo ReadHeaderFromWorkbookPM(IWorkbook workbook) { MaintenanceFormVersionInfo maintenance = new MaintenanceFormVersionInfo(); // 获取第一个工作表 ISheet CurrentSheet = null; int SheetCount = workbook.NumberOfSheets; if ("FM-P0075.17" == (txtVersion.EditValue + "")) { if (SheetCount == 0) { throw new ArgumentException("导入的点检表文件出错,文件中无内容!"); } CurrentSheet = workbook.GetSheet("Table2"); if (CurrentSheet == null) { throw new ArgumentException("导入的点检表文件出错,当前文件中不存在【Table2】的Sheet页!"); } } else { for (int i = 0; i < SheetCount; i++) { ISheet sheet = workbook.GetSheetAt(i); if (sheet.SheetName.Equals("正文")) { CurrentSheet = sheet; } } } if (CurrentSheet == null) { throw new Exception("读取文档信息出错,当前文档不存在【正文】Sheet页!"); } // 获取页眉 if (CurrentSheet != null && CurrentSheet.Header != null) { //文档名称 string FormName = CurrentSheet.Header.Center; if (!string.IsNullOrEmpty(FormName)) maintenance.FormName = patternToRemoveString(FormName).Trim(); if (maintenance.FormName.Length > 100) { throw new Exception("操作失败,点检表名称长度超限,最大长度为100字!"); } string Other = CurrentSheet.Header.Right; if (!string.IsNullOrEmpty(Other)) { string[] os = patternToRemoveString(Other).Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); if (os.Length == 3) { maintenance.VersionCode = os[0].Trim().ToUpper(); if (maintenance.VersionCode != txtVersion.EditValue + "") { throw new Exception("操作失败,点检表版本与选定的版本不一致!"); } maintenance.VersionRev = patternToRemoveString(os[1], "Rev版本:(\\s{0,})").Trim(); } else { throw new Exception("操作失败,点检表文档编号或点检表版本不能为空!!"); } } } return maintenance; } /// /// 正则去除字符串 /// /// /// string patternToRemoveString(string inputText, string patternToRemove = "&\"\\S*?\"") { return Regex.Replace(inputText, patternToRemove, string.Empty); } /// /// 获取页眉右侧单元格 /// /// /// private Tuple GetPageHeadVersionInfo(ISheet CurrentSheet) { try { Func func = (s1, s2) => { if (s2.IsNull()) s2 = "&\"\\S*?\""; string s3 = Regex.Replace(s1, s2, string.Empty); return s3; }; //文档名称 string FormName = NPOI.XSSF.UserModel.Extensions.XSSFHeaderFooter.StripFields(CurrentSheet.Header.Center); if (!FormName.IsNull()) FormName = func(FormName, null).Trim(); if (FormName.IsNull()) { throw new Exception("操作失败,点检表名称不能为空!"); } if (FormName.Length > 100) { throw new Exception("操作失败,点检表名称长度超限,最大长度为100字!"); } string VersionInfo = CurrentSheet.Header.Right; if (!VersionInfo.IsNull()) { string[] infs = func(VersionInfo, null).Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); if (infs.Length == 3) { string VersionCode = infs[0].Trim().ToUpper(); if (VersionCode.IsNull()) { throw new Exception("操作失败,点检表编码版本不能为空!"); } if (VersionCode != txtVersion.EditValue + "") { throw new Exception("操作失败,点检表编码版本与选定的编码版本不一致!"); } string VersionRev = func(infs[1].Replace(":", ":"), "Rev版本:(\\s{0,})").Trim(); if (VersionRev.IsNull()) { throw new Exception("操作失败,点检表Rev版本不能为空!"); } if (VersionRev.Length > 50) { throw new Exception("操作失败,点检表Rev版本长度不能超出50个字符!"); } return Tuple.Create(FormName, VersionCode, VersionRev); } else { throw new Exception("操作失败,点检表文档页眉编号或点检表版本读取失败,格式不正确!"); } } else { throw new Exception("操作失败,点检表中未检测到页眉数据!!"); } } catch (Exception) { throw; } } } }