Вывод строки datagrid в excel по нажатию

Всем привет! Ребят, хочу реализовать такую штуку: выделить строчку из datagrid (c#, wpf), нажать на кнопку и открывается exel и выдается данные именно этой строки. Пока что реализовал открытие excel, осталось только чтобы выводил именно эту строчку, а не весь список. Мне сказали использовать паттерн, но я вообще не могу понять его замысел и по итогу выходит ошибка. Заранее огромное вам спасибо за помощь!
Первый скрин: Настроил перенос в excel, но вкладки “продавец” и “клиент” не заполнены, ибо хочу чтобы они брались из определенной строки datagrid

А это для чего? Может проще не мучить целое приложение Эксель и взять библиотеку для работы с файлами его формата типа ClosedXML?

Мне нужен excel шаблон, там уже всё сделано (дизайн) и нужно чисто пару строк вставить

Через библиотеку не запускающую целый эксель такое обычно делается проще, быстрее и надежнее.

Я впрочем не понял в чем вообще проблема со строкой. В определении текущей строки в датагриде что ли?
Например DataGrid.SelectedCells Property (System.Windows.Controls) | Microsoft Docs
Но вообще в WPF обычно используют биндинги и MVVM.

Я немного новичок в этом деле, объясните пожалуйста поподробней)

Хочу выделить определенную строку и нажать на кнопку экспорта, чтобы эта сточка вывелась там, да где угодно уже, лишь бы получить её)

Ну надо почитать что пишут в документации об этом свойстве и использовать его как-то так:

foreach (var cell in oladushkinDatagrid.SelectedCells)
{
    // вывести cell.Item
}
1 лайк

Спасибо! Так я понял что мы получили индекс каждой строки, но как поставить условие? Типо если выделил эту строку, то после нажатия на кнопку - именно она экспортируется в excel. Просто хочу взять фамилию этого сотрудника из этой строки

где?)

SelectedCells это ж и есть ВыделенныеЯчейки. И в cell.Item то, что в ячейке.

foreach (var cell in DGridOlad.SelectedCells)
            {
                xlSht.Range["A1:A10"].UnMerge();
                xlSht.Range["A1:BE62"].Copy(); // Копируем диапазон ячеек

                xlSht.Range["G11"].Value = cell.Item; // Фамилия Сотрудника
                xlSht.Range["G12"].Value = cell.Item; // Имя Сотрудника
                xlSht.Range["G13"].Value = cell.Item // Отчество Сотрудника

                xlApp.Visible = true; // Отображаем Excel
                GC.Collect();
            }

Порылся в интернете, пока что не понимаю как именно после этого вывести определенные поля, кажется у меня уже в голове что-то подорвалось)

Непонятно о чем скриншот, но делать всё это на каждой итерации цикла по ячейкам (то есть выводить каждую ячейку во все 3 поля о сотрудниках) это явно не то.
C# и .NET | Циклы

А как тогда можно сделать? Чтобы сильно не парится с созданием интерфейсов и пересобирать программу

Так а причем тут это?

Если есть датагрид и в нем выделена строка, то для получения значений из ячеек этой строки можно например пройти циклом по

и записать эти значения куда надо. Так же как и с любыми другими массивами/коллекциями.

Просто надо разобраться-то что и куда записывать надо, а не тупо всё подряд в цикл засунуть )

Если непонятно как работают циклы, то надо сначала с этим разобраться по любому учебнику, например

Ну и без цикла тоже можно, у SelectedCells вроде есть доступ по индексу, так что по SelectedCells[0].Item достанется значение первой ячейки строки и т.д.

Но для просто копирования всей строки обычно цикл удобнее, только может быть удобнее цикл со счетчиком типа for (int i = 0; i < DGridOlad.SelectedCells.Count; i++) вместо foreach. И тогда например в столбец экселя с номером 11 + i писать SelectedCells[i].Item.

По итогу на строку с “xlSht.Range[“G11”].Value = cell[3].Item;” выводится такая ошибка:
Помощник по отладке управляемого кода “NonComVisibleBaseClass” : "Был произведен вызов QueryInterface, запрашивающий используемый по умолчанию интерфейс IDispatch видимого управляемого COM-класса “System.Data.Entity.DynamicProxies.Реализация_829DD4CE649599C98CB80E56A6453D64F7DE11A76EBCF12B8801CF4B12A5D266”.

Так а в коде что сейчас? Что за cell?

XAML

Это скорее всего что-то про сам датагрид и его биндинги.

Скиньте весь код, и текстом, а не скринами.

XAML

<DataGrid x:Name="DGridRealization" AutoGenerateColumns="False" IsReadOnly="True" Margin="5" SelectedCellsChanged="DGridRealization_SelectedCellsChanged">
            <!--Список данных выводится по столбцам-->
            <DataGrid.Columns>
                <DataGridTextColumn Header="Товар" Binding="{Binding Товары.Название}"></DataGridTextColumn>
                <DataGridTextColumn x:Name="klient" Header="Клиент" Binding="{Binding Клиенты.Фамилия}"></DataGridTextColumn>
                <DataGridTextColumn x:Name="sotrudnik" Header="Сотрудник" Binding="{Binding Сотрудники.Фамилия}"></DataGridTextColumn>
                <DataGridTextColumn Header="Количество" Binding="{Binding Количество}"></DataGridTextColumn>
                <DataGridTextColumn Header="Дата" Binding="{Binding Дата, StringFormat={}{0:MM.dd.yyyy}}"></DataGridTextColumn>
                <DataGridTextColumn Header="Замечания" Binding="{Binding Замечания}"></DataGridTextColumn>
                <DataGridTemplateColumn Width="auto">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <!--Кнопка для изменения информации о реализации-->
                            <Button x:Name="BtnEdit" Content="Редактировать" Height="25" Width="120" Click="BtnEdit_Click"></Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

c#, кнопка “Оформить чек”:

var cell = DGridRealization.SelectedCells;

            Excel.Application xlApp = new Excel.Application(); //Excel
            Excel.Workbook xlWB; //рабочая книга откуда будем копировать лист  
            Excel.Worksheet xlSht; //лист Excel
            xlWB = xlApp.Workbooks.Open(@"C:\Users\Фаронов Дмитрий\Desktop\Чек.xlsx"); //название файла Excel откуда будем копировать лист
            xlSht = xlWB.Worksheets["Лист1"]; //название листа или 1-й лист в книге xlSht = xlWB.Worksheets[1];

            xlSht.Range["A1:A10"].UnMerge();
            xlSht.Range["A1:BE62"].Copy(); // Копируем диапазон ячеек
            xlSht.Range["G11"].Value = cell[3].Item; // "Фамилия"

            xlApp.Visible = true; //отображаем Excel
            GC.Collect();

Ой, это действие “private void DGridRealization_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)”, а не кнопка