206 lines
5.2 KiB
C#
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
|
|
}
|