ExcelHelper/Views/ViewModels/ImportViewModel.cs

206 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Controls;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using ExcelHelper.Message;
using MiniExcelLibs;
namespace ExcelHelper.Views.ViewModels;
public partial class ImportViewModel : ObservableRecipient, IViewModel
{
public void FileDrop(string[] files)
{
IsLoading = true;
ExcelFiles.Clear();
SelectedSheetName = null;
Sheets.Clear();
MaxRow = 0;
foreach (var item in files)
{
ExcelFiles.Add(item);
}
//ReadForExcel(ExcelFiles.First());
CurrentFilePath = ExcelFiles.FirstOrDefault();
IsLoading = false;
}
public async void ReadForExcel(string path)
{
IsLoading = true;
//await Task.Factory.StartNew(async () =>
//{
try
{
if (string.IsNullOrEmpty(path)) return;
var excelData = await MiniExcel.QueryAsync(path, sheetName: SelectedSheetName, useHeaderRow: UseHeaderRow, startCell: StartCell);
if (MaxRow != 0)
{
ExcelData = excelData.Take(Math.Min(MaxRow, 300));
}
else
{
ExcelData = excelData.Take(300);
}
var columns = MiniExcel.GetColumns(path, useHeaderRow: UseHeaderRow, startCell: StartCell, sheetName: SelectedSheetName);
GenColumns(columns);
GetSheets(path);
MaxRow = ExcelData.Count();
}
catch (Exception ex)
{
WeakReferenceMessenger.Default.Send(new ErrorDialogMessage($"出现了异常!{ex}"));
}
IsLoading = false;
//}).ContinueWith(x =>
// {
// });
}
private void GenColumns(IEnumerable<string> columns)
{
ExcelColumns.Clear();
if (UseHeaderRow)
{
foreach (var columnName in columns)
{
var column = new DataGridTextColumn
{
Header = columnName,
Binding = new System.Windows.Data.Binding($"{columnName}"),
Width = DataGridLength.Auto
};
ExcelColumns.Add(column);
}
}
else
{
for (var i = 'A'; i < 'Z'; i++)
{
var column = new DataGridTextColumn
{
Header = $"{i}",
Binding = new System.Windows.Data.Binding($"{i}"),
Width = DataGridLength.Auto
};
ExcelColumns.Add(column);
}
}
if (ExcelColumns.Count > 0)
WeakReferenceMessenger.Default.Send(new UpdateDataGridColumnsMessage([.. ExcelColumns]));
else
{
WeakReferenceMessenger.Default.Send(new ErrorDialogMessage("未读取到列信息!"));
}
}
[RelayCommand]
private void OnReLoadExcel()
{
ReadForExcel(CurrentFilePath);
}
[RelayCommand]
private void OnReadSheets()
{
if (string.IsNullOrWhiteSpace(CurrentFilePath))
{
GetSheets(CurrentFilePath);
}
}
private void GetSheets(string excelPath)
{
if (Sheets == null)
{
Sheets = new ObservableCollection<string>();
}
else
{
Sheets.Clear();
}
MiniExcel.GetSheetNames(excelPath)?.ForEach(sheetName =>
{
Sheets.Add(sheetName);
});
SelectedSheetName = Sheets.FirstOrDefault();
}
#region Props
[ObservableProperty]
private IEnumerable<dynamic> _excelData;
[ObservableProperty]
private ObservableCollection<string> _excelFiles = [];
[ObservableProperty]
private ObservableCollection<DataGridColumn> _excelColumns = [];
/// <summary>
/// 是否正在加载
/// </summary>
[ObservableProperty]
private bool _isLoading = false;
/// <summary>
/// 使用首行作为表头
/// </summary>
[ObservableProperty]
private bool _useHeaderRow = false;
/// <summary>
/// 选中的Sheet
/// </summary>
[ObservableProperty]
private string _selectedSheetName;
/// <summary>
/// Sheets列表
/// </summary>
[ObservableProperty]
private ObservableCollection<string> _sheets = [];
/// <summary>
/// 起始位置
/// </summary>
[ObservableProperty]
private string _startCell = "A1";
/// <summary>
/// 结束位置
/// </summary>
[ObservableProperty]
private string _endCell;
/// <summary>
/// 最大行数
/// </summary>
[ObservableProperty]
private int _maxRow = 0;
/// <summary>
/// 当前文件路径
/// </summary>
private string _currentFilePath;
public string CurrentFilePath
{
get => _currentFilePath;
set
{
SetProperty(ref _currentFilePath, value);
ReadForExcel(value);
}
}
/// <summary>
/// Excel文件密码
/// </summary>
[ObservableProperty]
private string _excelPassword;
#endregion
}