using HMI.Base; using HMI.Core.Util; using HMI.DataViewer.Entity; using HMI.UI.Util; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Forms; using System.Windows.Media; namespace HMI.DataViewer { /// /// UserControl1.xaml 的交互逻辑 /// public partial class DataViewer : PluginControl { public DataViewer() { DataContext = this; InitializeComponent(); } private string SourceFilePath; private ObservableCollection settings = new ObservableCollection(); public ObservableCollection Settings { get => settings; set { Set(ref settings, value); } } private ObservableCollection datas = new ObservableCollection(); public ObservableCollection Datas { get => datas; set { Set(ref datas, value); } } private Dictionary Map = new Dictionary(); private void Button_Click(object sender, RoutedEventArgs e) { System.Windows.Controls.Button btn = sender as System.Windows.Controls.Button; switch (btn.Name) { case "addBtn": OpenSettingModal(-1, new DataBase_Setting()); break; case "editBtn": EditSettingModal(); break; case "rfhBtn": LoadData(); break; case "delBtn": DeleteDatasource(); break; case "srhBtn": SearchData(); break; case "resetBtn": ResetDataTable(); break; case "exportBtn": ExportData(); break; default: break; } } private void DeleteDatasource() { try { var key = programInput.Text; if (string.IsNullOrEmpty(key)) { ToastHelper.Warning(Window.GetWindow(this), this.lang("Dv.SelectDatasourceFirst")); return; } if (!Map.ContainsKey(key)) { ToastHelper.Error(Window.GetWindow(this), this.lang("App.ParameterException")); return; } DataBase_Setting setting = Map[key]; if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), this.lang("HMI.MakeSureDeleteSingle", setting.Program)) == MessageBoxResult.OK) { var temp = XmlHelper.DeepClone(Settings); temp.RemoveAt(Settings.IndexOf(setting)); XmlHelper.SerializeToXml(SourceFilePath, temp); ToastHelper.Success(Window.GetWindow(this), this.lang("App.DeleteSuccess")); LoadData(); } } catch (Exception ex) { log.Error("Delete Datasource Failed.", ex); ToastHelper.Success(Window.GetWindow(this), $"{this.lang("App.DeleteFailed")}: {ex.Message}"); } } private void EditSettingModal() { var key = programInput.Text; if (string.IsNullOrEmpty(key)) { ToastHelper.Warning(Window.GetWindow(this), this.lang("Dv.SelectDatasourceFirst")); return; } if (!Map.ContainsKey(key)) { ToastHelper.Error(Window.GetWindow(this), this.lang("App.ParameterException")); return; } DataBase_Setting setting = Map[key]; OpenSettingModal(Settings.IndexOf(setting), setting); } private void OpenSettingModal(int index, DataBase_Setting data) { DbSettingModal modal = new DbSettingModal(log) { Title = this.lang("Dv.AddDatasource"), Owner = Window.GetWindow(this) }; if (modal.Open(index, data, Settings, SourceFilePath) == true) { LoadData(); } } private void ResetDataTable() { startTimeInput.SelectedDateTime = null; endTimeInput.SelectedDateTime = null; dataTable.ItemsSource = null; foreach (var data in Datas) { data.Value = null; } } public override void SetBaseFolder(string folder) { base.SetBaseFolder(folder); SourceFilePath = Path.Combine(BaseFolder, "SourceData.setting"); } private void PluginControl_Loaded(object sender, RoutedEventArgs e) { LoadData(); Loaded -= PluginControl_Loaded; } private void LoadData() { ObservableCollection settings = new ObservableCollection(); if (File.Exists(SourceFilePath)) { settings = XmlHelper.DeserializeFromXml>(SourceFilePath); } List names = new List(); Map.Clear(); foreach (var data in settings) { Map.Add(data.Program, data); names.Add(data.Program); } programInput.ItemsSource = names; //ResetInput(); UpdateAdvanced(); Settings = settings; } private void ResetInput() { programInput.Text = string.Empty; Datas.Clear(); var temp = dataTable.Columns[0]; HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null); dataTable.Columns.Clear(); dataTable.Columns.Add(temp); currentColumns?.Clear(); } private void UpdateAdvanced() { var key = programInput.Text; if (!Map.ContainsKey(key)) { ResetInput(); return; } DataBase_Setting setting = Map[key]; Datas = new ObservableCollection( setting?.Condition?.Select(d => new QueryData { Key = d.Key, Name = d.Desc, Condition = "=" }).ToList()); var temp = dataTable.Columns[0]; HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null); dataTable.Columns.Clear(); dataTable.Columns.Add(temp); List columns = new List(); foreach (var data in Datas) { columns.Add(AddDataGridTextColumn(data.Name, data.Key)); } currentColumns = columns; } private void programInput_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems == null || e.AddedItems.Count <= 0) return; var key = e.AddedItems[0].ToString(); if (!Map.ContainsKey(key)) { ToastHelper.Error(Window.GetWindow(this), this.lang("App.ParameterException")); programInput.Text = string.Empty; return; } DataBase_Setting setting = Map[key]; Datas = new ObservableCollection( setting?.Condition?.Select(d => new QueryData { Key = d.Key, Name = d.Desc, Condition = "=" }).ToList()); var temp = dataTable.Columns[0]; HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null); dataTable.Columns.Clear(); dataTable.Columns.Add(temp); List columns = new List(); foreach (var data in Datas) { columns.Add(AddDataGridTextColumn(data.Name, data.Key)); } currentColumns = columns; } private List currentColumns; private DataGridTextColumn AddDataGridTextColumn(string header, string bindingPath) { DataGridTextColumn textColumn = new DataGridTextColumn { Header = header, Binding = new System.Windows.Data.Binding(bindingPath), Width = new DataGridLength(1, DataGridLengthUnitType.Star) }; dataTable.Columns.Add(textColumn); return textColumn; } private void dataTable_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { // 获取点击的元素 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); if (dep is DataGridColumnHeader columnHeader) { // 获取列索引 int columnIndex = columnHeader.Column.DisplayIndex; // 清除已有选择 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); 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 datas) { string fields = string.Join(",", Datas?.Select(d => $"[{d.Key}]").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}'"; } if (!string.IsNullOrEmpty(endTimeInput.Text)) { conditon += $" AND {timeCol} < '{endTimeInput.Text}'"; } conditon = string.IsNullOrEmpty(conditon) ? string.Empty : $" WHERE {conditon}"; SqliteHelper helper = null; string sql = string.Empty; try { 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; } catch (Exception ex) { log.Error($"Select Data Failed. SQL: {sql}", ex); throw ex; } finally { helper?.Close(); } } private void SearchData() { string program = programInput.Text; if (!Map.ContainsKey(program)) { ToastHelper.Error(Window.GetWindow(this), this.lang("App.ParameterException")); return; } var datas = Datas?.Where(d => !string.IsNullOrEmpty(d.Value)).ToList(); if (datas == null || datas.Count <= 0) { ToastHelper.Warning(Window.GetWindow(this), this.lang("Dv.QueryCantBeEmpty")); return; } DataBase_Setting setting = Map[program]; try { DoSearchData(setting, datas); } catch (Exception ex) { ToastHelper.Error(Window.GetWindow(this), $"{this.lang("App.QueryFailed")}: {ex.Message}"); } } private void ExportData() { try { string program = programInput.Text; if (string.IsNullOrEmpty(program)) { ToastHelper.Warning(Window.GetWindow(this), this.lang("Dv.SelectDatasourceFirst")); return; } if (!Map.ContainsKey(program)) { ToastHelper.Error(Window.GetWindow(this), this.lang("App.ParameterException")); return; } var datas = Datas?.Where(d => !string.IsNullOrEmpty(d.Value)).ToList(); if (datas == null || datas.Count <= 0) { ToastHelper.Warning(Window.GetWindow(this), this.lang("Dv.QueryCantBeEmpty")); return; } DataBase_Setting setting = Map[program]; DataTable dt; try { dt = DoSearchData(setting, datas); } catch (Exception ex) { ToastHelper.Error(Window.GetWindow(this), $"{this.lang("App.QueryFailed")}: {ex.Message}"); return; } if (currentColumns == null) return; var dataView = dt?.DefaultView; if (dataView == null) return; string fname = string.Empty; SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = ""; sfd.DefaultExt = "xls"; sfd.FileName = setting.Program; if (sfd.ShowDialog() == DialogResult.OK) { fname = sfd.FileName; } /*导出当前dataGridView中的所有数据到xls文件 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)) { workbook.Write(fs); } ToastHelper.Success(Window.GetWindow(this), this.lang("App.ExportSuccess")); } catch (Exception ex) { log.Error("Export Data Failed.", ex); ToastHelper.Error(Window.GetWindow(this), $"{this.lang("App.ExportFailed")}: {ex.Message}"); } } private void MenuItem_Click(object sender, RoutedEventArgs e) { DataGridColumn column = HMI.UI.DpUtil.DataGridHelper.GetSelectedColumn(dataTable); } } }