using DevExpress.XtraBars; using DevExpress.XtraBars.ToolbarForm; using DevExpress.XtraEditors; using DeviceRepair.Models; using DeviceRepair.Models.Enum; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using DeviceRepair.Utils; using DeviceRepairAndOptimization.Common; using System.IO; using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using Newtonsoft.Json; namespace DeviceRepairAndOptimization.Pages.AM.FormVersion { public partial class pageFormVersionEdit : ToolbarForm { public MaintenanceFormVersionInfo CurrentModel; Biz.PreserveTemplate.BaseTemplate template = null; public pageFormVersionEdit() : this(new MaintenanceFormVersionInfo { FormBelong = EnumDeviceBelong.AM.ToString() }) { } public pageFormVersionEdit(MaintenanceFormVersionInfo currentModel) { InitializeComponent(); CurrentModel = currentModel; } 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 + ""); } 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); entity = ReadHeaderFromWorkbook(workbook); } else if (fileExtension.Equals(".xlsx", StringComparison.OrdinalIgnoreCase)) { // 如果是 .xlsx 文件 XSSFWorkbook workbook = new XSSFWorkbook(fileStream); entity = ReadHeaderFromWorkbook(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 Biz.PreserveTemplate.TemplateConstValue.CompositeTemplateV2: template = new Biz.PreserveTemplate.TemplateIndexV2(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; case Biz.PreserveTemplate.TemplateConstValue.CompositeTemplateV1: template = new Biz.PreserveTemplate.TemplateIndexV1(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; case Biz.PreserveTemplate.TemplateConstValue.DailyTemplateV2: template = new Biz.PreserveTemplate.Template_AM_01(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; case Biz.PreserveTemplate.TemplateConstValue.DailyTemplateV1: template = new Biz.PreserveTemplate.Template_AM_15(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; case Biz.PreserveTemplate.TemplateConstValue.MonthTemplateV1: template = new Biz.PreserveTemplate.Template_AM_17(spreadsheetControl1.Document.Worksheets.ActiveWorksheet); break; default: template = null; break; } if (entity != null) { //检测当前文档是否存在 APIResponseData apiResponseData = Biz.FormManager.Instance.DataIsExists(entity); if (!apiResponseData.IsSuccess) throw new Exception(apiResponseData.Message); if (Convert.ToBoolean(apiResponseData.Data)) { 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 ReadHeaderFromWorkbook(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 == Biz.PreserveTemplate.TemplateConstValue.DailyTemplateV2) { Biz.AM.Templates.FM_P0075_01 fm = new Biz.AM.Templates.FM_P0075_01(); argEx = fm.CheckCurrentSheet(CurrentSheet); } else if (maintenance.VersionCode == Biz.PreserveTemplate.TemplateConstValue.DailyTemplateV1) { Biz.AM.Templates.FM_P0075_15 fm = new Biz.AM.Templates.FM_P0075_15(); argEx = fm.CheckCurrentSheet(CurrentSheet); } else if (maintenance.VersionCode == Biz.PreserveTemplate.TemplateConstValue.MonthTemplateV1) { Biz.AM.Templates.FM_P0075_17 fm = new Biz.AM.Templates.FM_P0075_17(); argEx = fm.CheckCurrentSheet(CurrentSheet); } else { throw new ArgumentException($"未适配的点检表编号【{maintenance.VersionCode}】,无法导入!"); } if (argEx != null) throw argEx; return maintenance; // int SheetIndex = 0; // bool HasContent = false; //ReadSheet: // CurrentSheet = workbook.GetSheetAt(SheetIndex); // try // { // 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; // } // return maintenance; // } // catch (Exception) // { // if (SheetIndex < SheetCount - 1) // { // SheetIndex++; // goto ReadSheet; // } // throw; // } } catch (Exception) { throw; } } /// /// 获取页眉右侧单元格 /// /// /// private Tuple GetPageHeadVersionInfo(ISheet CurrentSheet) { try { Func func = (s1, s2) => { if (s2.IsNull()) s2 = "&\"\\S*?\""; string s3 = System.Text.RegularExpressions.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; } } } }