alielie
2026-03-02 12e606635c42ea20f4b7c2bdda5204237a4b4c96
HMI.DataViewer/DataViewer.xaml.cs
@@ -2,22 +2,40 @@
using HMI.Core.Util;
using HMI.DataViewer.Entity;
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
{
    public class DefaultValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is DateTime date)
            {
                return date.ToString("yyyy-MM-dd HH:mm:ss");
            }
            return value.ToString();
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }
    /// <summary>
    /// UserControl1.xaml 的交互逻辑
    /// </summary>
@@ -27,6 +45,7 @@
        {
            DataContext = this;
            InitializeComponent();
            DefaultDate();
        }
        private string SourceFilePath;
@@ -46,6 +65,8 @@
        }
        private Dictionary<string, DataBase_Setting> Map = new Dictionary<string, DataBase_Setting>();
        private IValueConverter defaultConverter = new DefaultValueConverter();
        private void Button_Click(object sender, RoutedEventArgs e)
        {
@@ -141,10 +162,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 +203,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 +283,10 @@
            DataGridTextColumn textColumn = new DataGridTextColumn
            {
                Header = header,
                Binding = new System.Windows.Data.Binding(bindingPath),
                Binding = new System.Windows.Data.Binding(bindingPath)
                {
                    Converter = defaultConverter
                },
                Width = new DataGridLength(1, DataGridLengthUnitType.Star)
            };
            dataTable.Columns.Add(textColumn);
@@ -265,41 +295,41 @@
        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)
@@ -326,26 +356,73 @@
                conditon += $" AND {timeCol} < '{endTimeInput.Text}'";
            }
            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()
@@ -370,7 +447,7 @@
            try
            {
                DoSearchData(setting, datas);
                dataTable.ItemsSource = DoSearchData(setting, datas).DefaultView;
            }
            catch (Exception ex)
            {
@@ -380,6 +457,7 @@
        private void ExportData()
        {
            int maxRow = 1048575;
            try
            {
                string program = programInput.Text;
@@ -396,7 +474,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;
@@ -422,7 +501,7 @@
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "";
                sfd.DefaultExt = "xls";
                sfd.DefaultExt = "xlsx";
                sfd.FileName = setting.Program;
                if (sfd.ShowDialog() == DialogResult.OK)
                {
@@ -433,29 +512,38 @@
                1.引入库文件,新建lib文件夹,复制相关文件  
                2.在项目中添加对这几个dll的引用  
                3.在内存中建立 excel表文件  */
                XSSFWorkbook workbook = new XSSFWorkbook();
                workbook.CreateSheet("sheet1");////新建一个工作表
                XSSFSheet SheetOne = (XSSFSheet)workbook.GetSheet("Sheet1"); ////获取名称为Sheet1的工作表,创建标题头
                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"));