А это для чего? Может проще не мучить целое приложение Эксель и взять библиотеку для работы с файлами его формата типа ClosedXML?
Мне нужен excel шаблон, там уже всё сделано (дизайн) и нужно чисто пару строк вставить
Через библиотеку не запускающую целый эксель такое обычно делается проще, быстрее и надежнее.
Я впрочем не понял в чем вообще проблема со строкой. В определении текущей строки в датагриде что ли?
Например DataGrid.SelectedCells Property (System.Windows.Controls) | Microsoft Docs
Но вообще в WPF обычно используют биндинги и MVVM.
Я немного новичок в этом деле, объясните пожалуйста поподробней)
Хочу выделить определенную строку и нажать на кнопку экспорта, чтобы эта сточка вывелась там, да где угодно уже, лишь бы получить её)
Ну надо почитать что пишут в документации об этом свойстве и использовать его как-то так:
foreach (var cell in oladushkinDatagrid.SelectedCells)
{
// вывести cell.Item
}
Спасибо! Так я понял что мы получили индекс каждой строки, но как поставить условие? Типо если выделил эту строку, то после нажатия на кнопку - именно она экспортируется в 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
<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)”, а не кнопка
Так а биндинг к чему тут?
и т.д. это откуда?