| | |
| | | using 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> |
| | |
| | | { |
| | | DataContext = this; |
| | | InitializeComponent(); |
| | | DefaultDate(); |
| | | } |
| | | |
| | | private string SourceFilePath; |
| | |
| | | } |
| | | } |
| | | |
| | | 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) |
| | | { |
| | |
| | | Map.Clear(); |
| | | foreach (var data in settings) |
| | | { |
| | | Map.Add(data.Program, data); |
| | | Map[data.Program] = data; |
| | | names.Add(data.Program); |
| | | } |
| | | programInput.ItemsSource = names; |
| | |
| | | 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); |
| | |
| | | |
| | | 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}'"; |
| | |
| | | { |
| | | 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() |
| | |
| | | } |
| | | |
| | | 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; |
| | |
| | | |
| | | try |
| | | { |
| | | DoSearchData(setting, datas); |
| | | dataTable.ItemsSource = DoSearchData(setting, datas).DefaultView; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | |
| | | private void ExportData() |
| | | { |
| | | int maxRow = 1048575; |
| | | try |
| | | { |
| | | string program = programInput.Text; |
| | |
| | | } |
| | | |
| | | 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; |
| | |
| | | SaveFileDialog sfd = new SaveFileDialog(); |
| | | |
| | | sfd.Filter = ""; |
| | | sfd.DefaultExt = "xls"; |
| | | sfd.DefaultExt = "xlsx"; |
| | | sfd.FileName = setting.Program; |
| | | if (sfd.ShowDialog() == DialogResult.OK) |
| | | { |
| | |
| | | 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")); |