فهرست منبع

modify:优化解析excel的合并单元格查找处理;添加开机启动,自动登录的逻辑

runming56 1 سال پیش
والد
کامیت
09dd824b03

+ 8 - 2
lqnet/Api/MyConstants.cs

@@ -1,5 +1,6 @@
 
 using System.Drawing;
+using System.Windows.Forms;
 
 namespace lqnet.Api
 {
@@ -33,9 +34,14 @@ namespace lqnet.Api
     }
     public class VariablesGlobal
     {
-        public static string IP_PORT = "http://10.60.102.252:8088/";
-        //public static string IP_PORT = "http://10.60.102.253:8088/";
+        //public static string IP_PORT = "http://10.60.102.252:8088/";
+        public static string IP_PORT = "http://10.60.102.253:8088/";
         //public static string IP_PORT = "http://192.168.1.4:8190/";
+        //public static string IP_PORT = "http://tdm.jgiot.com:7012/dev-api/";
         public static string USER_TOKEN = "";
+        /// <summary>
+        /// 当前窗口
+        /// </summary>
+        public static Form currentForm = null;
     }
 }

+ 93 - 5
lqnet/Application.cs

@@ -1,4 +1,10 @@
-using System;
+using lqnet.Api;
+using lqnet.Forms;
+using Microsoft.VisualBasic.ApplicationServices;
+using Microsoft.Win32;
+using System;
+using System.Diagnostics;
+using System.Security.Principal;
 using System.Text;
 using System.Windows.Forms;
 
@@ -23,11 +29,25 @@ namespace lqnet
                 //设置应用程序处理异常
                 System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                 System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
-                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
-
+                AppDomain.CurrentDomain.UnhandledException += new System.UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
+                string[] args = Environment.GetCommandLineArgs();
                 System.Windows.Forms.Application.EnableVisualStyles();
                 System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(true);
-                System.Windows.Forms.Application.Run(new LoginForm());
+                WindowsIdentity identity = WindowsIdentity.GetCurrent();
+                WindowsPrincipal principal = new WindowsPrincipal(identity);
+                bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
+                if(!isAdmin)
+                {
+                    ProcessStartInfo startInfo = new ProcessStartInfo();
+                    startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
+                    startInfo.Verb = "runas";
+                    Process.Start(startInfo);
+                } else
+                {
+                    //System.Windows.Forms.Application.Run(new LoginForm());
+                    SingleInstanceController controller = new SingleInstanceController();
+                    controller.Run(args);
+                }
             }
             catch (Exception e)
             {
@@ -37,13 +57,81 @@ namespace lqnet
 
         }
 
+        public static void Fun_AutoStart(bool isAutoRun = true)
+        {
+            try
+            {
+                string path = System.Windows.Forms.Application.ExecutablePath;
+                RegistryKey rk = Registry.LocalMachine;
+                RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
+                if (isAutoRun)
+                    rk2.SetValue("System Security", path); //rk2.DeleteValue(“OIMSServer”, false);
+                else
+                    rk2.DeleteValue("System Security", false);
+                rk2.Close();
+                rk.Close();
+            }
+            catch
+            {
+                MessageBox.Show("开机自动启动服务注册被拒绝!请确认有系统管理员权限!");
+            }
+        }
+        /// <summary>
+        /// 保证单例启动
+        /// </summary>
+        public class SingleInstanceController : WindowsFormsApplicationBase
+        {
+            public SingleInstanceController()
+            {
+                IsSingleInstance = true;
+
+                StartupNextInstance += this_StartupNextInstance;
+            }
+
+            void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e)
+            {
+                if (VariablesGlobal.currentForm !=null)
+                {
+                    MainForm = VariablesGlobal.currentForm;
+                    if(MainForm is lqnet.Forms.MainForm)
+                    {
+                        lqnet.Forms.MainForm form = MainForm as lqnet.Forms.MainForm;
+                        //这个方法是处理窗体状态的,自己想要最大化还是正常显示都可以
+                        form.ReDisplay();
+                    } else
+                    {
+                        LoginForm form = MainForm as LoginForm;
+                        //这个方法是处理窗体状态的,自己想要最大化还是正常显示都可以
+                        form.ReDisplay();
+                    }
+                } else
+                {
+                    LoginForm form = MainForm as LoginForm;
+                    //这个方法是处理窗体状态的,自己想要最大化还是正常显示都可以
+                    form.ReDisplay();
+                }
+            }
+
+            protected override void OnCreateMainForm()
+            {
+                if (VariablesGlobal.currentForm != null)
+                {
+                    MainForm = VariablesGlobal.currentForm;
+                } else
+                {
+                    //创建登录窗口
+                    MainForm = new LoginForm();
+                } 
+            }
+        }
+
         static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
         {
             string str = GetExceptionMsg(e.Exception, e.ToString());
             MessageBox.Show(str, "插件异常", MessageBoxButtons.OK);
         }
 
-        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+        static void CurrentDomain_UnhandledException(object sender, System.UnhandledExceptionEventArgs e)
         {
             string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
             MessageBox.Show(str, "插件未处理异常", MessageBoxButtons.OK);

+ 7 - 0
lqnet/Entities/User.cs

@@ -8,5 +8,12 @@ namespace lqnet.Entities
         public string Username { get; set; }
         [JsonProperty(PropertyName = "password")]
         public string Password { get; set; }
+
+        [JsonProperty(PropertyName = "hosts")]
+        public string Hosts { get; set; }
+        [JsonProperty(PropertyName = "device")]
+        public DeviceInfo Device {  get; set; }
+        [JsonProperty(PropertyName = "autLogin")]
+        public bool AutoLogin { get; set; } = false;
     }
 }

+ 32 - 7
lqnet/Forms/LoginForm.Designer.cs

@@ -62,6 +62,7 @@ namespace lqnet
             this.ipLabel = new System.Windows.Forms.Label();
             this.addressShowLabel = new System.Windows.Forms.Label();
             this.label1 = new System.Windows.Forms.Label();
+            this.AutoLoginCb = new System.Windows.Forms.CheckBox();
             this.SuspendLayout();
             // 
             // pwd_textBox
@@ -86,9 +87,11 @@ namespace lqnet
             | System.Windows.Forms.AnchorStyles.Right)));
             this.mindPwd.AutoSize = true;
             this.mindPwd.BackColor = System.Drawing.Color.Transparent;
+            this.mindPwd.Checked = true;
+            this.mindPwd.CheckState = System.Windows.Forms.CheckState.Checked;
             this.mindPwd.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
             this.mindPwd.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
-            this.mindPwd.Location = new System.Drawing.Point(216, 106);
+            this.mindPwd.Location = new System.Drawing.Point(300, 241);
             this.mindPwd.Name = "mindPwd";
             this.mindPwd.Size = new System.Drawing.Size(118, 31);
             this.mindPwd.TabIndex = 11;
@@ -169,7 +172,7 @@ namespace lqnet
             this.Ip_set.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128)))));
             this.Ip_set.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
             this.Ip_set.Font = new System.Drawing.Font("宋体", 10F);
-            this.Ip_set.Location = new System.Drawing.Point(474, 152);
+            this.Ip_set.Location = new System.Drawing.Point(474, 116);
             this.Ip_set.Name = "Ip_set";
             this.Ip_set.Size = new System.Drawing.Size(72, 33);
             this.Ip_set.TabIndex = 14;
@@ -186,7 +189,7 @@ namespace lqnet
             this.deviceLabel.BackColor = System.Drawing.Color.Transparent;
             this.deviceLabel.Font = new System.Drawing.Font("宋体", 11F);
             this.deviceLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
-            this.deviceLabel.Location = new System.Drawing.Point(91, 238);
+            this.deviceLabel.Location = new System.Drawing.Point(91, 199);
             this.deviceLabel.Name = "deviceLabel";
             this.deviceLabel.Size = new System.Drawing.Size(98, 22);
             this.deviceLabel.TabIndex = 16;
@@ -200,7 +203,7 @@ namespace lqnet
             this.deviceListCombox.Enabled = false;
             this.deviceListCombox.Font = new System.Drawing.Font("宋体", 11F);
             this.deviceListCombox.FormattingEnabled = true;
-            this.deviceListCombox.Location = new System.Drawing.Point(217, 235);
+            this.deviceListCombox.Location = new System.Drawing.Point(217, 196);
             this.deviceListCombox.Name = "deviceListCombox";
             this.deviceListCombox.Size = new System.Drawing.Size(237, 30);
             this.deviceListCombox.TabIndex = 17;
@@ -219,7 +222,7 @@ namespace lqnet
             this.chooseDeviceBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
             this.chooseDeviceBtn.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.chooseDeviceBtn.ForeColor = System.Drawing.Color.White;
-            this.chooseDeviceBtn.Location = new System.Drawing.Point(474, 235);
+            this.chooseDeviceBtn.Location = new System.Drawing.Point(474, 196);
             this.chooseDeviceBtn.Name = "chooseDeviceBtn";
             this.chooseDeviceBtn.Size = new System.Drawing.Size(72, 32);
             this.chooseDeviceBtn.TabIndex = 18;
@@ -236,7 +239,7 @@ namespace lqnet
             this.ipLabel.BackColor = System.Drawing.Color.Transparent;
             this.ipLabel.Font = new System.Drawing.Font("宋体", 11F);
             this.ipLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
-            this.ipLabel.Location = new System.Drawing.Point(113, 158);
+            this.ipLabel.Location = new System.Drawing.Point(113, 122);
             this.ipLabel.Name = "ipLabel";
             this.ipLabel.Size = new System.Drawing.Size(76, 22);
             this.ipLabel.TabIndex = 19;
@@ -250,7 +253,7 @@ namespace lqnet
             this.addressShowLabel.BackColor = System.Drawing.Color.Transparent;
             this.addressShowLabel.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.addressShowLabel.ForeColor = System.Drawing.Color.Black;
-            this.addressShowLabel.Location = new System.Drawing.Point(212, 158);
+            this.addressShowLabel.Location = new System.Drawing.Point(212, 122);
             this.addressShowLabel.Name = "addressShowLabel";
             this.addressShowLabel.Size = new System.Drawing.Size(242, 40);
             this.addressShowLabel.TabIndex = 20;
@@ -268,6 +271,25 @@ namespace lqnet
             this.label1.TabIndex = 21;
             this.label1.Text = "version 1.1.0";
             // 
+            // AutoLoginCb
+            // 
+            this.AutoLoginCb.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.AutoLoginCb.AutoSize = true;
+            this.AutoLoginCb.BackColor = System.Drawing.Color.Transparent;
+            this.AutoLoginCb.Checked = true;
+            this.AutoLoginCb.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.AutoLoginCb.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+            this.AutoLoginCb.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
+            this.AutoLoginCb.Location = new System.Drawing.Point(151, 241);
+            this.AutoLoginCb.Name = "AutoLoginCb";
+            this.AutoLoginCb.Size = new System.Drawing.Size(118, 31);
+            this.AutoLoginCb.TabIndex = 22;
+            this.AutoLoginCb.Text = "自动登录";
+            this.AutoLoginCb.UseVisualStyleBackColor = false;
+            this.AutoLoginCb.CheckedChanged += new System.EventHandler(this.AutoLoginCb_Change);
+            // 
             // LoginForm
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(144F, 144F);
@@ -275,6 +297,7 @@ namespace lqnet
             this.AutoSize = true;
             this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240)))));
             this.ClientSize = new System.Drawing.Size(594, 395);
+            this.Controls.Add(this.AutoLoginCb);
             this.Controls.Add(this.label1);
             this.Controls.Add(this.addressShowLabel);
             this.Controls.Add(this.ipLabel);
@@ -296,6 +319,7 @@ namespace lqnet
             this.Name = "LoginForm";
             this.Text = "TDM测试台数据传输终端";
             this.Load += new System.EventHandler(this.Login_Load);
+            this.Shown += new System.EventHandler(this.Login_Shown);
             this.Paint += new System.Windows.Forms.PaintEventHandler(this.Boder_Paint);
             this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Login_KeyUp);
             this.ResumeLayout(false);
@@ -318,6 +342,7 @@ namespace lqnet
         private Label ipLabel;
         private Label addressShowLabel;
         private Label label1;
+        private CheckBox AutoLoginCb;
     }
 }
 

+ 107 - 6
lqnet/Forms/LoginForm.cs

@@ -9,6 +9,7 @@ using lqnet.Api;
 using lqnet.Entities;
 using lqnet.Forms;
 using lqnet.Utils;
+using Microsoft.Win32;
 using Newtonsoft.Json;
 using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
 
@@ -57,11 +58,12 @@ namespace lqnet
                 this.mindPwd.BackColor = MyConstants.BACKGROUDIMG_COLOR;
                 //MessageBox.Show("未找到背景图片资源,建议重新安装修复终端,避免影响使用观感", "初始化提示", MessageBoxButtons.OK);
             }
-            //记住密码
-            Init_MindPwd();
             this.addressShowLabel.Text = VariablesGlobal.IP_PORT;
             this.Ip_port = VariablesGlobal.IP_PORT;
             this.login_button.Select();
+            VariablesGlobal.currentForm = this;
+            //加载用户名密码
+            Init_MindPwd();
         }
 
         private void reInitComponent()
@@ -111,8 +113,15 @@ namespace lqnet
         /// <summary>
         /// 记住密码
         /// </summary>
-        private void Init_MindPwd()
+        private bool Init_MindPwd()
         {
+            bool condition = false;
+            if (!File.Exists(Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH))
+            {
+                this.mindPwd.Checked = false;
+                this.AutoLoginCb.Checked = false;
+                return condition;
+            }
             try
             {
                 using (StreamReader sr = new StreamReader(Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH))
@@ -127,11 +136,32 @@ namespace lqnet
                     this.mindPwd.Checked = true;
                     this.userName_textBox.Text = u.Username;
                     this.pwd_textBox.Text = u.Password;
+                    this.AutoLoginCb.Checked = u.AutoLogin;
+                    if (this.AutoLoginCb.Checked)
+                    {
+                        //自动登录设置自动选择记住密码
+                        this.mindPwd.Checked = true;
+                    }
+                    if(!string.IsNullOrEmpty(u.Hosts) && !string.IsNullOrWhiteSpace(u.Hosts))
+                    {
+                        this.addressShowLabel.Text = u.Hosts;
+                        this.Ip_port = u.Hosts;
+                        VariablesGlobal.IP_PORT = u.Hosts;
+                    }
+                    if (u.Device != null)
+                    {
+                        this.deviceListCombox.Items.Clear();
+                        this.deviceListCombox.Items.Add(u.Device);
+                        this.deviceListCombox.DisplayMember = "equitName";
+                        this.deviceListCombox.ValueMember = "propertyCode";
+                        this.deviceListCombox.SelectedIndex = 0;
+                    }
                 }
             }
             catch (Exception)
             {
             }
+            return this.AutoLoginCb.Checked;
         }
 
         /// <summary>
@@ -178,20 +208,38 @@ namespace lqnet
                             User user = new User
                             {
                                 Username = u,
-                                Password = p
+                                Password = p,
+                                Hosts = this.Ip_port,
+                                Device = deviceInfo,
+                                AutoLogin = this.AutoLoginCb.Checked
                             };
                             var uBytes = Encoding.UTF8.GetBytes(Base64.Base64EnCodeMoreOnlyTwo(JsonConvert.SerializeObject(user)));
                             FileStream file = new FileStream(Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH,
                                        FileMode.Create, FileAccess.ReadWrite);
                             file.Write(uBytes, 0, uBytes.Length);
                             file.Close();
+                        } else
+                        {
+                            //删除保存的用户信息
+                            string userFilePath = Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH;
+                            if(File.Exists(userFilePath))
+                            {
+                                File.Delete(userFilePath);
+                            }
+                        }
+                        if(this.AutoLoginCb.Checked)
+                        {
+                            SetAutoStart();
+                        } else
+                        {
+                            CancelAutoStart();
                         }
                     }
                     catch (Exception)
                     {
                     }
-                    new MainForm(this, deviceInfo).Show();
                     this.Visible = false;
+                    new MainForm(this, deviceInfo).Show();
                 }
                 else if (r.Code == MyConstants.CODE_FAIL_500)
                 {
@@ -238,7 +286,10 @@ namespace lqnet
 
         private void MindPwd_CheckedChanged(object sender, EventArgs e)
         {
-
+            if(this.mindPwd.Checked==false)
+            {
+                this.AutoLoginCb.Checked = false;
+            }
         }
 
         private void UserName_textBox_TextChanged(object sender, EventArgs e)
@@ -289,5 +340,55 @@ namespace lqnet
             }
            
         }
+        /// <summary>
+        /// 恢复窗体显示,当启动另外一个实例时,当前实例自动恢复窗体显示
+        /// </summary>
+        public void ReDisplay()
+        {
+            WindowState = FormWindowState.Normal;//还原窗体显示
+            this.Activate();//激活窗体并给予焦点
+            this.ShowInTaskbar = true;//显示任务栏图标
+        }
+
+        private void AutoLoginCb_Change(object sender, EventArgs e)
+        {
+            if(this.AutoLoginCb.Checked)
+            {
+                this.mindPwd.Checked = true;
+            }
+        }
+
+        private void SetAutoStart()
+        {
+            //将当前程序起动路径
+            string path = System.Windows.Forms.Application.ExecutablePath.ToLower();
+            //获得应用程序名称
+            string name = System.Windows.Forms.Application.ExecutablePath;
+            if(!SystemHelper.IsAutoRun(path, name))
+            {
+                SystemHelper.SetAutoRun(path, name, true);
+            }
+        }
+
+        private void CancelAutoStart()
+        {
+            //将当前程序起动路径
+            string path = System.Windows.Forms.Application.ExecutablePath.ToLower();
+            //获得应用程序名称
+            string name = System.Windows.Forms.Application.ExecutablePath;
+            if (SystemHelper.IsAutoRun(path, name))
+            {
+                SystemHelper.SetAutoRun(path, name, false);
+            }
+        }
+
+        private void Login_Shown(object sender, EventArgs e)
+        {
+            if(this.AutoLoginCb.Checked)
+            {
+                //自动登录
+                loginHandler();
+            }
+        }
     }
 }

+ 129 - 87
lqnet/Forms/MainForm.Designer.cs

@@ -52,8 +52,18 @@ namespace lqnet.Forms
         {
             this.components = new System.ComponentModel.Container();
             System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
             this.prodtDesig_sel = new System.Windows.Forms.TextBox();
             this.dataGridView1 = new System.Windows.Forms.DataGridView();
+            this.Index = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.idDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.prodtDesigDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.prodtBatchDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.numDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.groupOrderCodeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.proceNameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.groupProceIdDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.groupProceCodeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
             this.taskListBindingSource = new System.Windows.Forms.BindingSource(this.components);
             this.CheckItemComboBox = new System.Windows.Forms.ComboBox();
             this.slectBt = new System.Windows.Forms.Button();
@@ -82,15 +92,10 @@ namespace lqnet.Forms
             this.label3 = new System.Windows.Forms.Label();
             this.label2 = new System.Windows.Forms.Label();
             this.panel2 = new System.Windows.Forms.Panel();
-            this.Index = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.idDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.prodtDesigDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.prodtBatchDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.numDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.groupOrderCodeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.proceNameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.groupProceIdDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.groupProceCodeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
+            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+            this.退出ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.taskListBindingSource)).BeginInit();
             this.groupBox1.SuspendLayout();
@@ -100,6 +105,7 @@ namespace lqnet.Forms
             this.groupBox3.SuspendLayout();
             this.panel1.SuspendLayout();
             this.panel2.SuspendLayout();
+            this.contextMenuStrip1.SuspendLayout();
             this.SuspendLayout();
             // 
             // prodtDesig_sel
@@ -141,6 +147,90 @@ namespace lqnet.Forms
             this.dataGridView1.TabIndex = 2;
             this.dataGridView1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridView1_CellClick);
             // 
+            // Index
+            // 
+            this.Index.DataPropertyName = "Index";
+            this.Index.HeaderText = "序号";
+            this.Index.MinimumWidth = 10;
+            this.Index.Name = "Index";
+            this.Index.ReadOnly = true;
+            this.Index.Width = 60;
+            // 
+            // idDataGridViewTextBoxColumn
+            // 
+            this.idDataGridViewTextBoxColumn.DataPropertyName = "GroupOrderId";
+            this.idDataGridViewTextBoxColumn.HeaderText = "调度单id";
+            this.idDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";
+            this.idDataGridViewTextBoxColumn.ReadOnly = true;
+            this.idDataGridViewTextBoxColumn.Visible = false;
+            this.idDataGridViewTextBoxColumn.Width = 80;
+            // 
+            // prodtDesigDataGridViewTextBoxColumn
+            // 
+            this.prodtDesigDataGridViewTextBoxColumn.DataPropertyName = "ProdtDesig";
+            this.prodtDesigDataGridViewTextBoxColumn.HeaderText = "产品代号";
+            this.prodtDesigDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.prodtDesigDataGridViewTextBoxColumn.Name = "prodtDesigDataGridViewTextBoxColumn";
+            this.prodtDesigDataGridViewTextBoxColumn.ReadOnly = true;
+            this.prodtDesigDataGridViewTextBoxColumn.Width = 120;
+            // 
+            // prodtBatchDataGridViewTextBoxColumn
+            // 
+            this.prodtBatchDataGridViewTextBoxColumn.DataPropertyName = "ProdtBatch";
+            this.prodtBatchDataGridViewTextBoxColumn.HeaderText = "生产批次";
+            this.prodtBatchDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.prodtBatchDataGridViewTextBoxColumn.Name = "prodtBatchDataGridViewTextBoxColumn";
+            this.prodtBatchDataGridViewTextBoxColumn.ReadOnly = true;
+            this.prodtBatchDataGridViewTextBoxColumn.Width = 120;
+            // 
+            // numDataGridViewTextBoxColumn
+            // 
+            this.numDataGridViewTextBoxColumn.DataPropertyName = "PlanAmt";
+            this.numDataGridViewTextBoxColumn.HeaderText = "数量";
+            this.numDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.numDataGridViewTextBoxColumn.Name = "numDataGridViewTextBoxColumn";
+            this.numDataGridViewTextBoxColumn.ReadOnly = true;
+            this.numDataGridViewTextBoxColumn.Width = 80;
+            // 
+            // groupOrderCodeDataGridViewTextBoxColumn
+            // 
+            this.groupOrderCodeDataGridViewTextBoxColumn.DataPropertyName = "GroupOrderCode";
+            this.groupOrderCodeDataGridViewTextBoxColumn.HeaderText = "调度单号";
+            this.groupOrderCodeDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.groupOrderCodeDataGridViewTextBoxColumn.Name = "groupOrderCodeDataGridViewTextBoxColumn";
+            this.groupOrderCodeDataGridViewTextBoxColumn.ReadOnly = true;
+            this.groupOrderCodeDataGridViewTextBoxColumn.Width = 130;
+            // 
+            // proceNameDataGridViewTextBoxColumn
+            // 
+            this.proceNameDataGridViewTextBoxColumn.DataPropertyName = "ProceName";
+            this.proceNameDataGridViewTextBoxColumn.HeaderText = "工序名称";
+            this.proceNameDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.proceNameDataGridViewTextBoxColumn.Name = "proceNameDataGridViewTextBoxColumn";
+            this.proceNameDataGridViewTextBoxColumn.ReadOnly = true;
+            this.proceNameDataGridViewTextBoxColumn.Width = 130;
+            // 
+            // groupProceIdDataGridViewTextBoxColumn
+            // 
+            this.groupProceIdDataGridViewTextBoxColumn.DataPropertyName = "GroupProceId";
+            this.groupProceIdDataGridViewTextBoxColumn.HeaderText = "工序id";
+            this.groupProceIdDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.groupProceIdDataGridViewTextBoxColumn.Name = "groupProceIdDataGridViewTextBoxColumn";
+            this.groupProceIdDataGridViewTextBoxColumn.ReadOnly = true;
+            this.groupProceIdDataGridViewTextBoxColumn.Visible = false;
+            this.groupProceIdDataGridViewTextBoxColumn.Width = 150;
+            // 
+            // groupProceCodeDataGridViewTextBoxColumn
+            // 
+            this.groupProceCodeDataGridViewTextBoxColumn.DataPropertyName = "ProceCode";
+            this.groupProceCodeDataGridViewTextBoxColumn.HeaderText = "工序编号";
+            this.groupProceCodeDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.groupProceCodeDataGridViewTextBoxColumn.Name = "groupProceCodeDataGridViewTextBoxColumn";
+            this.groupProceCodeDataGridViewTextBoxColumn.ReadOnly = true;
+            this.groupProceCodeDataGridViewTextBoxColumn.Visible = false;
+            this.groupProceCodeDataGridViewTextBoxColumn.Width = 150;
+            // 
             // taskListBindingSource
             // 
             this.taskListBindingSource.DataSource = typeof(lqnet.Entities.Tasks);
@@ -290,7 +380,7 @@ namespace lqnet.Forms
             this.dataGridView2.RowTemplate.Height = 50;
             this.dataGridView2.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
             this.dataGridView2.ShowCellToolTips = false;
-            this.dataGridView2.Size = new System.Drawing.Size(1010, 430);
+            this.dataGridView2.Size = new System.Drawing.Size(1010, 400);
             this.dataGridView2.TabIndex = 34;
             // 
             // indexDataGridViewTextBoxColumn
@@ -491,89 +581,36 @@ namespace lqnet.Forms
             this.panel2.Size = new System.Drawing.Size(1338, 894);
             this.panel2.TabIndex = 41;
             // 
-            // Index
+            // notifyIcon1
             // 
-            this.Index.DataPropertyName = "Index";
-            this.Index.HeaderText = "序号";
-            this.Index.MinimumWidth = 10;
-            this.Index.Name = "Index";
-            this.Index.ReadOnly = true;
-            this.Index.Width = 60;
+            this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
+            this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));
+            this.notifyIcon1.Text = "非标上传同步软件";
+            this.notifyIcon1.Visible = true;
+            this.notifyIcon1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon1_DClick);
             // 
-            // idDataGridViewTextBoxColumn
+            // contextMenuStrip1
             // 
-            this.idDataGridViewTextBoxColumn.DataPropertyName = "GroupOrderId";
-            this.idDataGridViewTextBoxColumn.HeaderText = "调度单id";
-            this.idDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";
-            this.idDataGridViewTextBoxColumn.ReadOnly = true;
-            this.idDataGridViewTextBoxColumn.Visible = false;
-            this.idDataGridViewTextBoxColumn.Width = 80;
-            // 
-            // prodtDesigDataGridViewTextBoxColumn
-            // 
-            this.prodtDesigDataGridViewTextBoxColumn.DataPropertyName = "ProdtDesig";
-            this.prodtDesigDataGridViewTextBoxColumn.HeaderText = "产品代号";
-            this.prodtDesigDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.prodtDesigDataGridViewTextBoxColumn.Name = "prodtDesigDataGridViewTextBoxColumn";
-            this.prodtDesigDataGridViewTextBoxColumn.ReadOnly = true;
-            this.prodtDesigDataGridViewTextBoxColumn.Width = 120;
+            this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
+            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripMenuItem1,
+            this.退出ToolStripMenuItem});
+            this.contextMenuStrip1.Name = "contextMenuStrip1";
+            this.contextMenuStrip1.Size = new System.Drawing.Size(117, 64);
             // 
-            // prodtBatchDataGridViewTextBoxColumn
+            // toolStripMenuItem1
             // 
-            this.prodtBatchDataGridViewTextBoxColumn.DataPropertyName = "ProdtBatch";
-            this.prodtBatchDataGridViewTextBoxColumn.HeaderText = "生产批次";
-            this.prodtBatchDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.prodtBatchDataGridViewTextBoxColumn.Name = "prodtBatchDataGridViewTextBoxColumn";
-            this.prodtBatchDataGridViewTextBoxColumn.ReadOnly = true;
-            this.prodtBatchDataGridViewTextBoxColumn.Width = 120;
+            this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+            this.toolStripMenuItem1.Size = new System.Drawing.Size(116, 30);
+            this.toolStripMenuItem1.Text = "还原";
+            this.toolStripMenuItem1.Click += new System.EventHandler(this.Main_ReNormal_Click);
             // 
-            // numDataGridViewTextBoxColumn
+            // 退出ToolStripMenuItem
             // 
-            this.numDataGridViewTextBoxColumn.DataPropertyName = "PlanAmt";
-            this.numDataGridViewTextBoxColumn.HeaderText = "数量";
-            this.numDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.numDataGridViewTextBoxColumn.Name = "numDataGridViewTextBoxColumn";
-            this.numDataGridViewTextBoxColumn.ReadOnly = true;
-            this.numDataGridViewTextBoxColumn.Width = 80;
-            // 
-            // groupOrderCodeDataGridViewTextBoxColumn
-            // 
-            this.groupOrderCodeDataGridViewTextBoxColumn.DataPropertyName = "GroupOrderCode";
-            this.groupOrderCodeDataGridViewTextBoxColumn.HeaderText = "调度单号";
-            this.groupOrderCodeDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.groupOrderCodeDataGridViewTextBoxColumn.Name = "groupOrderCodeDataGridViewTextBoxColumn";
-            this.groupOrderCodeDataGridViewTextBoxColumn.ReadOnly = true;
-            this.groupOrderCodeDataGridViewTextBoxColumn.Width = 130;
-            // 
-            // proceNameDataGridViewTextBoxColumn
-            // 
-            this.proceNameDataGridViewTextBoxColumn.DataPropertyName = "ProceName";
-            this.proceNameDataGridViewTextBoxColumn.HeaderText = "工序名称";
-            this.proceNameDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.proceNameDataGridViewTextBoxColumn.Name = "proceNameDataGridViewTextBoxColumn";
-            this.proceNameDataGridViewTextBoxColumn.ReadOnly = true;
-            this.proceNameDataGridViewTextBoxColumn.Width = 130;
-            // 
-            // groupProceIdDataGridViewTextBoxColumn
-            // 
-            this.groupProceIdDataGridViewTextBoxColumn.DataPropertyName = "GroupProceId";
-            this.groupProceIdDataGridViewTextBoxColumn.HeaderText = "工序id";
-            this.groupProceIdDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.groupProceIdDataGridViewTextBoxColumn.Name = "groupProceIdDataGridViewTextBoxColumn";
-            this.groupProceIdDataGridViewTextBoxColumn.ReadOnly = true;
-            this.groupProceIdDataGridViewTextBoxColumn.Visible = false;
-            this.groupProceIdDataGridViewTextBoxColumn.Width = 150;
-            // 
-            // groupProceCodeDataGridViewTextBoxColumn
-            // 
-            this.groupProceCodeDataGridViewTextBoxColumn.DataPropertyName = "ProceCode";
-            this.groupProceCodeDataGridViewTextBoxColumn.HeaderText = "工序编号";
-            this.groupProceCodeDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.groupProceCodeDataGridViewTextBoxColumn.Name = "groupProceCodeDataGridViewTextBoxColumn";
-            this.groupProceCodeDataGridViewTextBoxColumn.ReadOnly = true;
-            this.groupProceCodeDataGridViewTextBoxColumn.Visible = false;
-            this.groupProceCodeDataGridViewTextBoxColumn.Width = 150;
+            this.退出ToolStripMenuItem.Name = "退出ToolStripMenuItem";
+            this.退出ToolStripMenuItem.Size = new System.Drawing.Size(116, 30);
+            this.退出ToolStripMenuItem.Text = "退出";
+            this.退出ToolStripMenuItem.Click += new System.EventHandler(this.Main_Close_Click);
             // 
             // MainForm
             // 
@@ -586,10 +623,10 @@ namespace lqnet.Forms
             this.Icon = global::lqnet.Properties.Resources.favicon;
             this.MaximizeBox = false;
             this.MaximumSize = new System.Drawing.Size(1360, 950);
-            this.MinimizeBox = false;
             this.Name = "MainForm";
             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
             this.Text = "TDM测试台数据传输终端";
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
             this.Load += new System.EventHandler(this.Main_Load);
             this.Shown += new System.EventHandler(this.MainForm_Shown);
             this.Paint += new System.Windows.Forms.PaintEventHandler(this.Boder_Paint);
@@ -605,6 +642,7 @@ namespace lqnet.Forms
             this.panel1.ResumeLayout(false);
             this.panel1.PerformLayout();
             this.panel2.ResumeLayout(false);
+            this.contextMenuStrip1.ResumeLayout(false);
             this.ResumeLayout(false);
 
         }
@@ -649,5 +687,9 @@ namespace lqnet.Forms
         private DataGridViewTextBoxColumn proceNameDataGridViewTextBoxColumn;
         private DataGridViewTextBoxColumn groupProceIdDataGridViewTextBoxColumn;
         private DataGridViewTextBoxColumn groupProceCodeDataGridViewTextBoxColumn;
+        private NotifyIcon notifyIcon1;
+        private ContextMenuStrip contextMenuStrip1;
+        private ToolStripMenuItem toolStripMenuItem1;
+        private ToolStripMenuItem 退出ToolStripMenuItem;
     }
 }

+ 65 - 1
lqnet/Forms/MainForm.cs

@@ -19,6 +19,7 @@ using lqnet.Utils;
 using Microsoft.VisualBasic.Devices;
 using Newtonsoft.Json;
 using Org.BouncyCastle.Pqc.Crypto.Lms;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
 
 namespace lqnet.Forms
 {
@@ -121,6 +122,7 @@ namespace lqnet.Forms
                 reloadDeviceConfig();
                 startSendbeat();
             }
+            this.Text = this.Text + "  当前登录设备:" + this._device.equitName;
             //try
             //{
             //    string imgPath = System.Windows.Forms.Application.StartupPath + MyConstants.BACKGROUDIMG_NAME;
@@ -132,7 +134,7 @@ namespace lqnet.Forms
             //    this.BackColor = MyConstants.BACKGROUDIMG_COLOR;
             //    //MessageBox.Show("未找到背景图片资源,建议重新安装修复终端,避免影响使用观感", "初始化提示", MessageBoxButtons.OK);
             //}
-
+            VariablesGlobal.currentForm = this;
         }
 
         private void NumberTextBox_KeyPress(object sender, KeyPressEventArgs e)
@@ -431,6 +433,21 @@ namespace lqnet.Forms
             SelectTaskList();
         }
 
+        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            // 注意判断关闭事件reason来源于窗体按钮,否则用菜单退出时无法退出!
+            if (e.CloseReason == CloseReason.UserClosing)
+            {
+                //取消"关闭窗口"事件
+                e.Cancel = true; // 取消关闭窗体
+                //使关闭时窗口向右下角缩小的效果
+                this.WindowState = FormWindowState.Minimized;
+                this.notifyIcon1.Visible = true;
+                this.Hide();
+                return;
+            }
+        }
+
         /// <summary>
         /// 搜索任务
         /// </summary>
@@ -667,6 +684,7 @@ namespace lqnet.Forms
                 return;
             }
             this.ParentFormLogin.Visible = true;
+            VariablesGlobal.currentForm = this.ParentFormLogin;
             this.DisposeParentFormIs = false;
             VariablesGlobal.USER_TOKEN = null;
             this.Dispose();
@@ -1013,5 +1031,51 @@ namespace lqnet.Forms
 
             this.Location = new Point(left, top);
         }
+
+        /// <summary>
+        /// 恢复窗体显示,当启动另外一个实例时,当前实例自动恢复窗体显示
+        /// </summary>
+        public void ReDisplay()
+        {
+            this.Visible = true;
+            WindowState = FormWindowState.Normal;//还原窗体显示
+            this.ShowInTaskbar = true;//显示任务栏图标
+            this.notifyIcon1.Visible = true;//托盘图标隐藏
+            this.Activate();//激活窗体并给予焦点
+        }
+
+        private void Main_ReNormal_Click(object sender, EventArgs e)
+        {
+            this.Visible = true;
+            this.WindowState = FormWindowState.Normal;
+            this.ShowInTaskbar = true;//显示任务栏图标
+            this.notifyIcon1.Visible = true;
+            this.Activate();
+        }
+
+        private void Main_Close_Click(object sender, EventArgs e)
+        {
+            this.notifyIcon1.Visible = false;
+            VariablesGlobal.currentForm = null;
+            this.Close();
+            this.Dispose();
+            System.Environment.Exit(System.Environment.ExitCode);
+        }
+
+        private void NotifyIcon1_DClick(object sender, MouseEventArgs e)
+        {
+            if (this.Visible)
+            {
+                this.WindowState = FormWindowState.Minimized;
+                this.notifyIcon1.Visible = true;
+                this.Hide();
+            }
+            else
+            {
+                this.Visible = true;
+                this.WindowState = FormWindowState.Normal;
+                this.Activate();
+            }
+        }
     }
 }

+ 416 - 0
lqnet/Forms/MainForm.resx

@@ -126,4 +126,420 @@
   <metadata name="reportColListBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
+  <metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>574, 21</value>
+  </metadata>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>736, 21</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="notifyIcon1.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
 </root>

+ 5 - 1
lqnet/Lqnet.csproj

@@ -58,7 +58,7 @@
     <ManifestKeyFile>Lqnet_TemporaryKey.pfx</ManifestKeyFile>
   </PropertyGroup>
   <PropertyGroup>
-    <GenerateManifests>true</GenerateManifests>
+    <GenerateManifests>false</GenerateManifests>
   </PropertyGroup>
   <PropertyGroup>
     <SignManifests>false</SignManifests>
@@ -69,6 +69,9 @@
   <PropertyGroup>
     <ApplicationIcon>icon.ico</ApplicationIcon>
   </PropertyGroup>
+  <PropertyGroup>
+    <TargetZone>LocalIntranet</TargetZone>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
       <HintPath>..\packages\BouncyCastle.Cryptography.2.2.1\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
@@ -216,6 +219,7 @@
     <Compile Include="Utils\PageHelper.Designer.cs">
       <DependentUpon>PageHelper.cs</DependentUpon>
     </Compile>
+    <Compile Include="Utils\SystemHelper.cs" />
     <EmbeddedResource Include="Forms\DevicePopupForm.resx">
       <DependentUpon>DevicePopupForm.cs</DependentUpon>
     </EmbeddedResource>

+ 4 - 3
lqnet/Properties/AssemblyInfo.cs

@@ -1,4 +1,5 @@
-using System.Reflection;
+using System.Diagnostics;
+using System.Reflection;
 using System.Runtime.InteropServices;
 
 // 有关程序集的一般信息由以下
@@ -31,5 +32,5 @@ using System.Runtime.InteropServices;
 // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 // 方法是按如下所示使用“*”: :
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.12")]
-[assembly: AssemblyFileVersion("1.0.0.12")]
+[assembly: AssemblyVersion("1.0.0.16")]
+[assembly: AssemblyFileVersion("1.0.0.16")]

+ 35 - 9
lqnet/Utils/ExcelHelper.cs

@@ -8,11 +8,13 @@ using NPOI.SS.Util;
 using NPOI.XSSF.Streaming;
 using NPOI.XSSF.UserModel;
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Security.Cryptography.X509Certificates;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace lqnet.Utils
@@ -22,6 +24,11 @@ namespace lqnet.Utils
     /// </summary>
     public static class ExcelHelper
     {
+        private static ConcurrentDictionary<int, List<CellRangeAddress>> _rowCellRangeList = new ConcurrentDictionary<int, List<CellRangeAddress>>();
+        /// <summary>
+        /// 锁对象
+        /// </summary>
+        private static Mutex mutex = new Mutex();
         /// <summary>
         /// 读取传入的报告内容
         /// </summary>
@@ -30,6 +37,18 @@ namespace lqnet.Utils
         /// <param name="rowSpan">产品跨行数</param>
         public static List<ReportCol> readRport(string filePath, string prodtStartIndx, int rowSpan)
         {
+            try
+            {
+                mutex.WaitOne();
+                return parseReport(filePath, prodtStartIndx, rowSpan);
+            } finally { 
+                mutex.ReleaseMutex();
+            }
+        }
+
+        private static List<ReportCol> parseReport(string filePath, string prodtStartIndx, int rowSpan)
+        {
+            _rowCellRangeList.Clear();
             if (!File.Exists(filePath))
             {
                 //文件不存在直接返回空
@@ -45,7 +64,8 @@ namespace lqnet.Utils
                     XSSFWorkbook excelWorkbook = new XSSFWorkbook(filestream);
                     SXSSFWorkbook workbook = new SXSSFWorkbook(excelWorkbook, 100);
                     sheet = workbook.XssfWorkbook.GetSheetAt(0);
-                } else
+                }
+                else
                 {
                     HSSFWorkbook workbook = new HSSFWorkbook(filestream);
                     sheet = workbook.GetSheetAt(0);
@@ -53,21 +73,21 @@ namespace lqnet.Utils
                 var index = prodtStartIndx.IndexOfAny("0123456789".ToCharArray());
                 int prodStartRow = int.Parse(prodtStartIndx.Split(',')[0].Substring(index));
                 int startRow = prodStartRow - 1;
-                int endRow = prodStartRow + (rowSpan>1? rowSpan-1: 0);
+                int endRow = prodStartRow + (rowSpan > 1 ? rowSpan - 1 : 0);
 
                 string startColLabel = prodtStartIndx.Substring(0, index);
                 byte[] array = System.Text.Encoding.ASCII.GetBytes(startColLabel.Substring(startColLabel.Length - 1));
                 //计算开始列位置
-                int startCol = ((int)array[0]) - 65 + (26 * ((startColLabel.Length > 1 ? ((int)System.Text.Encoding.ASCII.GetBytes(startColLabel.Substring(0, 1))[0]-65+startColLabel.Length-1) :startColLabel.Length - 1)));
+                int startCol = ((int)array[0]) - 65 + (26 * ((startColLabel.Length > 1 ? ((int)System.Text.Encoding.ASCII.GetBytes(startColLabel.Substring(0, 1))[0] - 65 + startColLabel.Length - 1) : startColLabel.Length - 1)));
                 //读一行得每一列
                 List<ReportCol> data = new List<ReportCol>();
-                for(int i = startRow; i < endRow; i++)
+                for (int i = startRow; i < endRow; i++)
                 {
                     int col = startCol + 1;
                     do
                     {
                         string label = GetCellReference(sheet, i, col);
-                        if(!string.IsNullOrEmpty(label))
+                        if (!string.IsNullOrEmpty(label))
                         {
                             ReportCol reportCol = new ReportCol();
                             //获取单元格的cell label
@@ -80,8 +100,8 @@ namespace lqnet.Utils
                 }
                 return data;
             }
-
         }
+
         /// <summary>
         /// 获取cell坐标
         /// </summary>
@@ -105,10 +125,16 @@ namespace lqnet.Utils
         private static string getMergeCellReference(ISheet sheet, int row, int col)
         {
             int regionsCount = sheet.NumMergedRegions;
-            for (int i = 0; i < regionsCount; i++)
+            List<CellRangeAddress> rowList = _rowCellRangeList.ContainsKey(row)? _rowCellRangeList[row]:null;
+            if(rowList == null || rowList.Count == 0)
+            {
+                rowList = sheet.MergedRegions.Where(item => item.FirstRow == row).ToList();
+                _rowCellRangeList[row] = rowList;
+            }
+            if(rowList !=null && rowList.Count > 0)
             {
-                CellRangeAddress range = sheet.GetMergedRegion(i);
-                if (sheet.IsMergedRegion(range) && range.FirstRow == row && range.FirstColumn == col)
+                CellRangeAddress range = rowList.Where(item => item.FirstRow == row && item.FirstColumn == col).FirstOrDefault();
+                if (range != null && sheet.IsMergedRegion(range))
                 {
                     return range.FormatAsString();
                 }

+ 85 - 0
lqnet/Utils/SystemHelper.cs

@@ -0,0 +1,85 @@
+using lqnet.Entities;
+using Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace lqnet.Utils
+{
+    public sealed class SystemHelper
+    {
+        private SystemHelper() { }
+
+        /// <summary>
+        /// 设置程序开机启动
+        /// </summary>
+        /// <param name="strAppPath">应用程序exe所在文件夹</param>
+        /// <param name="strAppName">应用程序exe名称</param>
+        /// <param name="bIsAutoRun">自动运行状态</param>
+        public static void SetAutoRun(string strAppPath, string strAppName, bool bIsAutoRun)
+        {
+            try
+            {
+                if (string.IsNullOrWhiteSpace(strAppPath)
+                    || string.IsNullOrWhiteSpace(strAppName))
+                {
+                    throw new Exception("应用程序路径或名称为空!");
+                }
+
+                RegistryKey reg = Registry.LocalMachine;
+                RegistryKey run = reg.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
+
+                if (bIsAutoRun)
+                {
+                    run.SetValue(strAppName, strAppPath);
+                }
+                else
+                {
+                    if (null != run.GetValue(strAppName))
+                    {
+                        run.DeleteValue(strAppName);
+                    }
+                }
+
+                run.Close();
+                reg.Close();
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show("设置或者取消开机启动失败,失败原因:" + ex.Message, "提示", MessageBoxButtons.OK);
+            }
+        }
+
+        /// <summary>
+        /// 判断是否开机启动
+        /// </summary>
+        /// <param name="strAppPath">应用程序路径</param>
+        /// <param name="strAppName">应用程序名称</param>
+        /// <returns></returns>
+        public static bool IsAutoRun(string strAppPath, string strAppName)
+        {
+            try
+            {
+                RegistryKey reg = Registry.LocalMachine;
+                RegistryKey software = reg.OpenSubKey(@"SOFTWARE");
+                RegistryKey run = reg.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
+                object key = run.GetValue(strAppName);
+                software.Close();
+                run.Close();
+                if (null == key || !strAppPath.Equals(key.ToString()))
+                {
+                    return false;
+                }
+                return true;
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show("读取开机启动状态失败,失败原因:" + ex.Message, "提示", MessageBoxButtons.OK);
+            }
+            return false;
+        }
+    }
+}

+ 18 - 18
lqnet/app.config

@@ -1,39 +1,39 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
-        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="MathNet.Numerics" publicKeyToken="cd8b63ad3d691a37" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.10.0.0" newVersion="4.10.0.0"/>
+        <assemblyIdentity name="MathNet.Numerics" publicKeyToken="cd8b63ad3d691a37" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.10.0.0" newVersion="4.10.0.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1"/>
+        <assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2"/>
+        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0"/>
+        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
+        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-1.3.3.11" newVersion="1.3.3.11"/>
+        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.3.3.11" newVersion="1.3.3.11" />
       </dependentAssembly>
     </assemblyBinding>
   </runtime>

+ 7 - 14
lqnet/app.manifest

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
-  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
+  <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
     <security>
       <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
@@ -15,46 +15,40 @@
             如果你的应用程序需要此虚拟化来实现向后兼容性,则删除此
             元素。
         -->
-        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
+		  <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
       </requestedPrivileges>
+      <applicationRequestMinimum>
+        <PermissionSet Unrestricted="true" ID="Custom" SameSite="site" />
+        <defaultAssemblyRequest permissionSetReference="Custom" />
+      </applicationRequestMinimum>
     </security>
   </trustInfo>
-
   <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
     <application>
       <!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
            Windows 版本的列表。取消评论适当的元素,
            Windows 将自动选择最兼容的环境。 -->
-
       <!-- Windows Vista -->
       <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
-
       <!-- Windows 7 -->
       <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
-
       <!-- Windows 8 -->
       <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
-
       <!-- Windows 8.1 -->
       <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
-
       <!-- Windows 10 -->
       <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
-
     </application>
   </compatibility>
-
   <!-- 指示该应用程序可以感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
        自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需
        选择加入。选择加入此设置的 Windows 窗体应用程序(目标设定为 .NET Framework 4.6 )还应
        在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。-->
-
   <application xmlns="urn:schemas-microsoft-com:asm.v3">
     <windowsSettings>
       <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
     </windowsSettings>
   </application>
-
   <!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
   <!--
   <dependency>
@@ -70,5 +64,4 @@
     </dependentAssembly>
   </dependency>
   -->
-
-</assembly>
+</assembly>

BIN
lqnet/bin/Debug/app.publish/lqnet.exe


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 21
lqnet/bin/Debug/lqnet.application


BIN
lqnet/bin/Debug/lqnet.exe


+ 18 - 18
lqnet/bin/Debug/lqnet.exe.config

@@ -1,39 +1,39 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
-        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="MathNet.Numerics" publicKeyToken="cd8b63ad3d691a37" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.10.0.0" newVersion="4.10.0.0"/>
+        <assemblyIdentity name="MathNet.Numerics" publicKeyToken="cd8b63ad3d691a37" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.10.0.0" newVersion="4.10.0.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1"/>
+        <assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2"/>
+        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0"/>
+        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
+        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
       </dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-1.3.3.11" newVersion="1.3.3.11"/>
+        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.3.3.11" newVersion="1.3.3.11" />
       </dependentAssembly>
     </assemblyBinding>
   </runtime>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1521
lqnet/bin/Debug/lqnet.exe.manifest


BIN
lqnet/bin/Debug/lqnet.pdb


+ 1 - 1
lqnet/lqnet.csproj.user

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <PublishUrlHistory>publish\</PublishUrlHistory>
+    <PublishUrlHistory>G:\lqnet\publish\|publish\</PublishUrlHistory>
     <InstallUrlHistory />
     <SupportUrlHistory />
     <UpdateUrlHistory />

BIN
lqnet/obj/Debug/DesignTimeResolveAssemblyReferences.cache


BIN
lqnet/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache


+ 1 - 1
lqnet/obj/Debug/Lqnet.csproj.CoreCompileInputs.cache

@@ -1 +1 @@
-35fe29d3e990e929809fad03ba6bd03584a6c2b7
+c1268fa35a1cb7cdfd1cb1e0290364ef4a7b65e5

+ 0 - 4
lqnet/obj/Debug/Lqnet.csproj.FileListAbsolute.txt

@@ -169,8 +169,6 @@ F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\NPOI.Core.dll
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\NPOI.Core.pdb
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\SixLabors.Fonts.xml
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.exe.config
-F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.exe.manifest
-F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.application
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.exe
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.pdb
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\System.Runtime.InteropServices.RuntimeInformation.dll
@@ -326,8 +324,6 @@ F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.Utils.PageHelper2
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.Utils.PageHelper.resources
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.GenerateResource.cache
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.CoreCompileInputs.cache
-F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.exe.manifest
-F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.application
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.CopyComplete
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.exe
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.pdb

BIN
lqnet/obj/Debug/Lqnet.csproj.GenerateResource.cache


BIN
lqnet/obj/Debug/lqnet.Forms.MainForm.resources


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 21
lqnet/obj/Debug/lqnet.application


BIN
lqnet/obj/Debug/lqnet.exe


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1521
lqnet/obj/Debug/lqnet.exe.manifest


BIN
lqnet/obj/Debug/lqnet.pdb


+ 1 - 0
lqnet/packages.config

@@ -4,6 +4,7 @@
   <package id="Enums.NET" version="4.0.1" targetFramework="net48" />
   <package id="MathNet.Numerics.Signed" version="4.15.0" targetFramework="net462" />
   <package id="Microsoft.IO.RecyclableMemoryStream" version="2.3.2" targetFramework="net48" />
+  <package id="Microsoft.VisualBasic" version="10.3.0" targetFramework="net462" />
   <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net40" requireReinstallation="true" />
   <package id="NPOI" version="2.6.1" targetFramework="net462" />
   <package id="SharpZipLib" version="1.3.3" targetFramework="net48" />