Как импортировать таблицу из Excel в DataGrid avalonia MVVM
Мне необходимо импортировать таблицу Excel в DataGrid, это затем чтобы пользователь затем выбрал столбец из таблицы, текст из который появится в программе. Я придумал что лучше сделать через коллекцию в объекте класса. Получится что типа двумерного массива. Использую MSInterop.
VM:
public class MainWindowViewModel : ViewModelBase
{
public ReactiveCommand<Unit, Unit> Export { get; set; }
private ObservableCollection<ExportTable> _exportTables;
public ObservableCollection<ExportTable> ExportTables
{
get => _exportTables;
set => this.RaiseAndSetIfChanged(ref _exportTables, value);
}
public MainWindowViewModel()
{
ExportTables = new ObservableCollection<ExportTable>(new List<ExportTable>());
Export = ReactiveCommand.Create(ImportFromExcel);
}
string? _path; //путь к файлу (исправить костыль*)
private static FilePickerFileType Excel { get; } = new("All xls")
{
Patterns = new[]
{
"*.xlsx",
"*.xls"
},
MimeTypes = null,
AppleUniformTypeIdentifiers = null,
};
//функция вызова окна для испорта из Excel
private async void ImportFromExcel()
{
//вызов диалогового окна для поиска пути к файлу
var topLevel = TopLevel.GetTopLevel(new MainWindow());
var files = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
{
Title = "Открыть Excel файл",
AllowMultiple = false,
FileTypeFilter = new[] { Excel },
SuggestedStartLocation = await topLevel.StorageProvider.TryGetFolderFromPathAsync("C:\\")
});
if (files.Count >= 1)
{
// Open reading stream from the first file.
await using var stream = await files[0].OpenReadAsync();
using var streamReader = new StreamReader(stream);
// Reads all the content of file as a text.
_path = files[0].Path.LocalPath; // путь к файлу
Console.WriteLine(_path);
}
else
{
return;
}
//обработка файла и запись данных внутрь маркировок
var excelApp = new Microsoft.Office.Interop.Excel.Application();
if (excelApp != null)
{
Workbook excelWorkbook = excelApp.Workbooks.Open(Filename: _path, 0, true,
5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true,
1, 0);
Worksheet excelWorksheet = (Worksheet)excelWorkbook.Sheets[1];
Range excelRange = excelWorksheet.UsedRange;
int rowCount = excelRange.Rows.Count;
int colCount = excelRange.Columns.Count;
string cellValue = "";
for (int i = 1; i <= colCount; i++)
{
for (int j = 1; j <= rowCount; j++)
{
Range? range = (excelWorksheet.Cells[j, i] as Range);
try
{
cellValue = range.Value2.ToString();
}
catch (Exception e)
{
cellValue = "";
}
ExportTables.Add(new ObservableCollection<ExportTable>
{
new ()
{
Txts = new List<ExportTable.Txt>()
{
new ExportTable.Txt()
{
Cells = cellValue
}
}
}
});
}
}
excelWorkbook.Close();
excelApp.Quit();
}
}
}
Models:
public class ExportTable : ViewModelBase
{
public List<Txt> Txts { get; set; }
public class Txt
{
public string Cells { get; set; }
}
}
View:
<Grid ColumnDefinitions="*, *" RowDefinitions="40,500">
<Button Grid.Column="0" Grid.Row="0" Content="Export from excel" Command="{Binding Export}" />
<DataGrid Grid.Column="0" Grid.Row="1" ItemsSource="{Binding ExportTables}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Txts[0].Cells}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
На данный момент получается выгрузить все данные только в одну строку, не пойму как сделать чтобы dg была динамичной и чтобы мой List заполнялся не только по первому индексу. Excel файл может быть любым.