Как импортировать таблицу из 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 файл может быть любым.


Ответы (0 шт):