From ef52fd6fd07508883dce4eb002acda59f0169e59 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期四, 23 四月 2026 10:19:33 +0800
Subject: [PATCH] 优化;

---
 HMI.DataViewer/DataViewer.xaml.cs |  236 +++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 157 insertions(+), 79 deletions(-)

diff --git a/HMI.DataViewer/DataViewer.xaml.cs b/HMI.DataViewer/DataViewer.xaml.cs
index a1e2400..d704535 100644
--- a/HMI.DataViewer/DataViewer.xaml.cs
+++ b/HMI.DataViewer/DataViewer.xaml.cs
@@ -1,23 +1,27 @@
 锘縰sing HMI.Base;
 using HMI.Core.Util;
 using HMI.DataViewer.Entity;
+using HMI.UI.Converter;
 using HMI.UI.Util;
+using NPOI.SS.Formula.Functions;
 using NPOI.SS.UserModel;
 using NPOI.XSSF.UserModel;
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Data;
+using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
-using System.Windows.Controls.Primitives;
+using System.Windows.Data;
 using System.Windows.Forms;
-using System.Windows.Media;
 
 namespace HMI.DataViewer
 {
+    
+
     /// <summary>
     /// UserControl1.xaml 鐨勪氦浜掗�昏緫
     /// </summary>
@@ -27,6 +31,7 @@
         {
             DataContext = this;
             InitializeComponent();
+            DefaultDate();
         }
 
         private string SourceFilePath;
@@ -141,10 +146,16 @@
             }
         }
 
+        private void DefaultDate()
+        {
+            var now = DateTime.Now;
+            startTimeInput.SelectedDateTime = DateTime.Parse(now.ToString("yyyy-MM-dd"));
+            endTimeInput.SelectedDateTime = DateTime.Parse(now.AddDays(1).ToString("yyyy-MM-dd"));
+        }
+
         private void ResetDataTable()
         {
-            startTimeInput.SelectedDateTime = null;
-            endTimeInput.SelectedDateTime = null;
+            DefaultDate();
             dataTable.ItemsSource = null;
             foreach (var data in Datas)
             {
@@ -176,7 +187,7 @@
             Map.Clear();
             foreach (var data in settings)
             {
-                Map.Add(data.Program, data);
+                Map[data.Program] = data;
                 names.Add(data.Program);
             }
             programInput.ItemsSource = names;
@@ -256,7 +267,10 @@
             DataGridTextColumn textColumn = new DataGridTextColumn
             {
                 Header = header,
-                Binding = new System.Windows.Data.Binding(bindingPath),
+                Binding = new System.Windows.Data.Binding(bindingPath)
+                {
+                    Converter = DateStrConverter.Instance
+                },
                 Width = new DataGridLength(1, DataGridLengthUnitType.Star)
             };
             dataTable.Columns.Add(textColumn);
@@ -265,53 +279,58 @@
 
         private void dataTable_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
         {
-            // 鑾峰彇鐐瑰嚮鐨勫厓绱�
-            DependencyObject dep = (DependencyObject)e.OriginalSource;
+            //// 鑾峰彇鐐瑰嚮鐨勫厓绱�
+            //DependencyObject dep = (DependencyObject)e.OriginalSource;
 
-            // 閬嶅巻鎵惧埌 DataGridColumnHeader
-            while (dep != null && !(dep is DataGridColumnHeader) && !(dep is DataGridRow))
-            {
-                dep = VisualTreeHelper.GetParent(dep);
-            }
-            HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null);
+            //// 閬嶅巻鎵惧埌 DataGridColumnHeader
+            //while (dep != null && !(dep is DataGridColumnHeader) && !(dep is DataGridRow))
+            //{
+            //    dep = VisualTreeHelper.GetParent(dep);
+            //}
+            //HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null);
 
-            if (dep is DataGridColumnHeader columnHeader)
-            {
-                // 鑾峰彇鍒楃储寮�
-                int columnIndex = columnHeader.Column.DisplayIndex;
+            //if (dep is DataGridColumnHeader columnHeader)
+            //{
+            //    // 鑾峰彇鍒楃储寮�
+            //    int columnIndex = columnHeader.Column.DisplayIndex;
 
-                // 娓呴櫎宸叉湁閫夋嫨
-                dataTable.SelectedCells.Clear();
+            //    // 娓呴櫎宸叉湁閫夋嫨
+            //    dataTable.SelectedCells.Clear();
 
-                // 閬嶅巻鎵�鏈夎锛岄�変腑璇ュ垪鐨勬墍鏈夊崟鍏冩牸
-                foreach (var item in dataTable.Items)
-                {
-                    DataGridCellInfo cellInfo = new DataGridCellInfo(item, columnHeader.Column);
-                    dataTable.SelectedCells.Add(cellInfo);
-                }
-                HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, columnHeader.Column);
+            //    // 閬嶅巻鎵�鏈夎锛岄�変腑璇ュ垪鐨勬墍鏈夊崟鍏冩牸
+            //    foreach (var item in dataTable.Items)
+            //    {
+            //        DataGridCellInfo cellInfo = new DataGridCellInfo(item, columnHeader.Column);
+            //        dataTable.SelectedCells.Add(cellInfo);
+            //    }
+            //    HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, columnHeader.Column);
 
-                e.Handled = true; // 闃叉榛樿琛屼负
-            }
-            else if (dep is DataGridRow row)
-            {
-                // 娓呴櫎宸叉湁閫夋嫨
-                dataTable.SelectedCells.Clear();
-                dataTable.SelectedItem = row.Item;
-                e.Handled = true;
-            }
+            //    e.Handled = true; // 闃叉榛樿琛屼负
+            //}
+            //else if (dep is DataGridRow row)
+            //{
+            //    // 娓呴櫎宸叉湁閫夋嫨
+            //    dataTable.SelectedCells.Clear();
+            //    dataTable.SelectedItem = row.Item;
+            //    e.Handled = true;
+            //}
         }
 
         private DataTable DoSearchData(DataBase_Setting setting, List<QueryData> datas)
         {
+            string conditon = "WHERE 1=1 ";
             string fields = string.Join(",", Datas?.Select(d => $"[{d.Key}]").ToList());
+            if (datas != null && datas.Count > 0)
+            {
+                conditon = "WHERE " + string.Join(" AND ", datas.Select(d => $"[{d.Key}] {d.Condition} '{d.Value}'").ToList());
+            }
 
-            string conditon = string.Join(" AND ", datas.Select(d => $"[{d.Key}] {d.Condition} '{d.Value}'").ToList());
             string timeCol = setting.TimeCol;
             if (string.IsNullOrEmpty(timeCol))
             {
                 timeCol = "time";
             }
+
             if (!string.IsNullOrEmpty(startTimeInput.Text))
             {
                 conditon += $" AND {timeCol} >= '{startTimeInput.Text}'";
@@ -320,28 +339,74 @@
             {
                 conditon += $" AND {timeCol} < '{endTimeInput.Text}'";
             }
-            conditon = string.IsNullOrEmpty(conditon) ? string.Empty : $" WHERE {conditon}";
 
-            SqliteHelper helper = null;
-            string sql = string.Empty;
-            try
+            string sql = $"SELECT {fields} FROM {setting.TableName} {conditon}";
+
+            DataTable dt = new DataTable();
+
+            if (string.IsNullOrEmpty(setting.Pattern))
             {
-                helper = new SqliteHelper(setting.DBFilePath);
-                sql = $"SELECT {fields} FROM {setting.TableName} {conditon}";
-                DataTable dt = helper.GetDataTable(sql);
-                HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null);
-                dataTable.ItemsSource = dt.DefaultView;
-                return dt;
+                try
+                {
+                    using (var helper = new Sqlite3Helper(setting.DBFilePath))
+                    {
+                        dt = helper.GetDataTable(sql);
+                    }
+                }
+                catch (Exception ex)
+                {
+                    log.Error($"Select Data Failed. SQL: {sql}", ex);
+                    throw ex;
+                }
             }
-            catch (Exception ex)
+            else
             {
-                log.Error($"Select Data Failed. SQL: {sql}", ex);
-                throw ex;
+                // 閫氶厤绗�
+                try
+                {
+                    string dir = Path.GetDirectoryName(setting.DBFilePath);
+                    string startName = $"Data_{startTimeInput.SelectedDateTime?.ToString("yyyyMMdd")}";
+                    string endName = $"Data_{endTimeInput.SelectedDateTime?.ToString("yyyyMMdd")}";
+                    var oldFiles = Directory.GetFiles(dir, "Data_*.db");
+                    oldFiles = oldFiles.Where(file =>
+                    {
+                        var fileName = Path.GetFileNameWithoutExtension(file);
+                        bool flag = true;
+                        flag &= (string.Compare(fileName, startName) == 1 || fileName == startName);
+                        flag &= (string.Compare(endName, fileName) == 1 || fileName == endName);
+                        return flag;
+                    }).ToArray();
+                    if (oldFiles == null || oldFiles.Length <= 0)
+                    {
+                        return dt;
+                    }
+
+                    foreach (string file in oldFiles)
+                    {
+                        try
+                        {
+                            using (var helper = new SqliteHelper(file))
+                            {
+                                var temp = helper.GetDataTable(sql);
+                                dt.Merge(temp);
+                            }
+                        }
+                        catch
+                        {
+
+                        }
+                    }
+                    return dt;
+                }
+                catch (Exception ex)
+                {
+                    log.Error($"Select Data Failed. SQL: {sql}", ex);
+                    throw ex;
+                }
             }
-            finally
-            {
-                helper?.Close();
-            }
+            //HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null);
+            //dt.
+            return dt;
         }
 
         private void SearchData()
@@ -354,7 +419,9 @@
             }
 
             var datas = Datas?.Where(d => !string.IsNullOrEmpty(d.Value)).ToList();
-            if (datas == null || datas.Count <= 0)
+
+            if ((datas == null || datas.Count <= 0) &&
+                (string.IsNullOrEmpty(startTimeInput.Text) || string.IsNullOrEmpty(endTimeInput.Text)))
             {
                 ToastHelper.Warning(Window.GetWindow(this), this.lang("Dv.QueryCantBeEmpty"));
                 return;
@@ -364,7 +431,7 @@
 
             try
             {
-                DoSearchData(setting, datas);
+                dataTable.ItemsSource = DoSearchData(setting, datas).DefaultView;
             }
             catch (Exception ex)
             {
@@ -374,6 +441,7 @@
 
         private void ExportData()
         {
+            int maxRow = 1048575;
             try
             {
                 string program = programInput.Text;
@@ -390,7 +458,8 @@
                 }
 
                 var datas = Datas?.Where(d => !string.IsNullOrEmpty(d.Value)).ToList();
-                if (datas == null || datas.Count <= 0)
+                if ((datas == null || datas.Count <= 0) &&
+                    (string.IsNullOrEmpty(startTimeInput.Text) || string.IsNullOrEmpty(endTimeInput.Text)))
                 {
                     ToastHelper.Warning(Window.GetWindow(this), this.lang("Dv.QueryCantBeEmpty"));
                     return;
@@ -416,7 +485,7 @@
                 SaveFileDialog sfd = new SaveFileDialog();
 
                 sfd.Filter = "";
-                sfd.DefaultExt = "xls";
+                sfd.DefaultExt = "xlsx";
                 sfd.FileName = setting.Program;
                 if (sfd.ShowDialog() == DialogResult.OK)
                 {
@@ -427,29 +496,38 @@
                 1.寮曞叆搴撴枃浠�,鏂板缓lib鏂囦欢澶癸紝澶嶅埗鐩稿叧鏂囦欢  
                 2.鍦ㄩ」鐩腑娣诲姞瀵硅繖鍑犱釜dll鐨勫紩鐢�  
                 3.鍦ㄥ唴瀛樹腑寤虹珛 excel琛ㄦ枃浠�  */
-                XSSFWorkbook workbook = new XSSFWorkbook();
-                workbook.CreateSheet("sheet1");////鏂板缓涓�涓伐浣滆〃
-                XSSFSheet SheetOne = (XSSFSheet)workbook.GetSheet("Sheet1"); ////鑾峰彇鍚嶇О涓篠heet1鐨勫伐浣滆〃,鍒涘缓鏍囬澶�
-                IRow row1 = SheetOne.CreateRow(0);////鑾峰彇Sheet1宸ヤ綔琛ㄧ殑棣栬,璁剧疆琛ㄥご锛岃幏鍙栧垪
-                //XSSFCell[] SheetCell = new XSSFCell[currentColumns.Count];
-                for (int i = 0; i < currentColumns.Count; i++)
-                {
-                    row1.CreateCell(i).SetCellValue(currentColumns[i].Header.ToString());
-                }
-
-                for (int i = 0; i < dataView.Count; i++)
-                {
-                    IRow rowTemp = SheetOne.CreateRow(i + 1);
-                    for (int j = 0; j < currentColumns.Count; j++)
-                    {
-                        string name = ((System.Windows.Data.Binding)currentColumns[j].Binding).Path.Path;
-                        var value = dataView[i][name].ToString();
-                        rowTemp.CreateCell(j).SetCellValue(value);
-                    }
-                }
-
                 using (FileStream fs = new FileStream(fname, FileMode.Create))
                 {
+
+                    XSSFWorkbook workbook = new XSSFWorkbook();
+
+                    int row = 1;
+                    for (int i = 0; i < dataView.Count; i++)
+                    {
+                        int sheetIndex = sheetIndex = i / maxRow;
+                        string sheetName = $"sheet{sheetIndex + 1}";
+                        var sheet = (XSSFSheet)workbook.GetSheet(sheetName);
+                        if (sheet == null)
+                        {
+                            sheet = (XSSFSheet)workbook.CreateSheet(sheetName);
+                            IRow row1 = sheet.CreateRow(0);
+                            for (int j = 0; j < currentColumns.Count; j++)
+                            {
+                                row1.CreateCell(j).SetCellValue(currentColumns[j].Header.ToString());
+                            }
+                            row = 1;
+                        }
+
+
+                        IRow rowTemp = sheet.CreateRow(row++);
+                        for (int j = 0; j < currentColumns.Count; j++)
+                        {
+                            string name = ((System.Windows.Data.Binding)currentColumns[j].Binding).Path.Path;
+                            var value = dataView[i][name].ToString();
+                            rowTemp.CreateCell(j).SetCellValue(value);
+                        }
+                    }
+
                     workbook.Write(fs);
                 }
                 ToastHelper.Success(Window.GetWindow(this), this.lang("App.ExportSuccess"));

--
Gitblit v1.9.1