Автофильтр Как в Excel Datagridview c • Сортировка данных

Экспорт в Excel из Silverlight/WPF DataGrid

Работа с Excel из Silverlight 4 и .NET 4

В Silverlight 4 и .NET 4 появились динамические объекты, что дает нам возможность не устанавливать зависимости на библиотеки MS Office, а просто использовать их. То есть, чтобы создать Excel документ в .NET 4 (далее приложение WPF) нам просто нужно написать:

Для начала давайте создадим метод, который позволял бы нам экспортировать в Excel массив данных (я объясню ниже, почему именно массив):

Несколькими строчками выше мы написали как можно создать ссылку на Excel объект, теперь проведем небольшой подготовительный процесс:

Мы сделали так, чтобы Excel не отображал изменения, которые мы будем вносить, пока мы ему об этом не скажем. Данных подход дает нам небольшой прирост в скорости экспорта. Дальше мы создаем новый документ (workbook) и у данного документа берем активную страницу (worsheet), а дальше вычисляем размер области, в которую мы произведем экспорт данных.

Все, наши данные уже в Excel документе, правда данный подход не хочет работать в Silverlight 4, что не может не огорчать. На строчке установки значения я получаю ошибку

У меня получилось только экспортировать одномерные массивы (по одной строчке), думаю это проблема Silverlight, написал о ней в секцию .net 4 на http://connect.microsoft.com (не совсем та тема, посмотрим что ответят).

Итак, чтобы сделать подобное в Silverlight 4 я сделал экспорт по строкам:

Конечно, если вы разрабатываете только под Silverlight, то может имеет смысл отказаться вообще от работы с двумерными массивами, но я писал классы, которые будут работать и в SL4 и в WPF (.NET 4), потому все же оставил работу именно с этим типом данных.

Ну и после экспорта осталось только применить изменения и показать сам Excel:

А перед этим можно сделать немного улучшений внешнего вида экспортируемого документа:

Экспорт данных из DataGrid в двумерный массив

У нас уже есть метод, который позволяет из массива экспортировать данные в Excel, теперь нам нужно из DataGrid экспортировать в двумерный массив. В WPF есть возможность получить коллекцию объектов из свойства Items контрола DataGrid, в Silverlight же это свойство internal, потому лучшим выбором для меня было преобразование ItemsSource в List:

Прежде чем продолжить работу нужно подумать о тех возможностях, которые могут нам понадобиться:

  1. Иногда не все колонки хочется экспортировать в excel, потому имеет смысл сделать возможность запрещать экспорт определенной колонки в xaml разметке.
  2. Не всегда у колонки в DataGrid бывает заголовок, а в excel документе хочется его иметь, либо иметь заголовок с другим текстом, потому тоже имеет смысл иметь возможность задавать определенный заголовок для экспорта.
  3. Легко определить что экспортировать для тех колонок, которые являются производными от DataGridBoundColumn, так как у них есть Binding (путь), при помощи которого можно определить какое свойство экспортировать. В случае DataGridTemplateColumn очень сложно определить что же отображается в данной колонке, потому иногда нужно предоставлять возможность указывать явно путь для экспорта. Так же можно использовать путь прописанный в SortMemberPath.
  4. Форматирование для экспорта в Excel.

Решать эти 4 проблемы мы будем при помощи attached свойств:

Теперь для получения всех колонок для экспорта мы можем написать следующий код:

При помощи данного запроса мы получаем список колонок для которых разрешен экспорт (заметьте, что свойство IsExportedProperty имеет по умолчанию значение true), а так же выбираем только те, для которых мы можем определить, что же экспортировать.

Итак у нас есть список элементов для экспорта и список колонок, которые мы хотим экспортировать, первым делом подготовим двухмерный массив (количество элементов + 1 для заголовка) и запишем в первую строчку заголовки:

Метод GetHeader пробует получить установленное в xaml при помощи свойства HeaderForExportProperty заголовок, и если он не установлен, то берет заголовок из колонки:

Метод GetPath очень прост, поддерживается только проход по свойствам, никаких массивов, статических элементов и т.п., ну и соответственно подразумевается, что Binding прописывается к текущему элементу:

По полученному пути получаем значение данного элемента при помощи метода GetValue:

Пример использования

Для примера напишем простую модель данных и инициализируем список тестовыми данными:

Где ExportToExcel – это extension метод для DataGrid, который запускает экспорт в Excel в отдельном потоке. Вот и все. В Silverlight 4 код будет приблизительно такой же. Ниже есть ссылка с примерами использования в Silveright 4 и WPF 4 (проект для Visual Studio 2010).

Заключение

Скачать пример: ExportToExcelTools.zip

See Also

Знайка, самый умный эксперт в Цветочном городе
Мнение эксперта
Знайка, самый умный эксперт в Цветочном городе
Если у вас есть вопросы, задавайте их мне!
Задать вопрос эксперту
Мне удалось создать полное решение для копирования и сохранения данных из моего DataGridView в файл excel на основе ответа Джейка, поэтому я отправляю свое полное решение в надежде, что он сможет помочь другим новым посетителям С , как я сам. Если же вы хотите что-то уточнить, я с радостью помогу!
​ попробуйте «текстбокс-автомат». Там,​Alex_ST​ опционально возможно его​​ итоги, то итоговая​​ информация за второе​ на значок в​ могут быть хорошо​ несколько оба обязательными​​ и чисел, на​​ точно данные, которые​ фильтрации данных в​ секунд и сообщить,​
Автофильтр Как в Excel Datagridview c • Сортировка данных

Загрузка данных из Microsoft Excel в DataGridView: Справочник по C#

  • Значением критерия является строка, заключенная в кавычки. Есть несколько исключений, когда критерии являются постоянными для периода времени даты и выше / ниже среднего.
  • При указании фильтров для отдельных чисел или дат форматирование чисел должно соответствовать форматированию чисел, применяемому в диапазоне / таблице.
  • Оператор сравнения больше / меньше чем также включен в кавычки перед числом.
  • Кавычки также используются для фильтров для пробелов «=» и не пробелов «».

Я надеюсь, что вы можете использовать эту статью и файл Excel в качестве руководства по написанию макросов для фильтров. Автоматизация фильтров может сэкономить нам и нашим пользователям массу времени, особенно при использовании этих методов в более крупном проекте автоматизации данных.

Автофильтр в EXCEL. Примеры и описание
Фильтрация также может быть трудоемким процессом. Особенно, когда мы применяем фильтры к нескольким столбцам на больших листах или фильтруем данные, чтобы затем копировать / вставлять их в другие листы или книги.
Знайка, самый умный эксперт в Цветочном городе
Мнение эксперта
Знайка, самый умный эксперт в Цветочном городе
Если у вас есть вопросы, задавайте их мне!
Задать вопрос эксперту
Мы можем легко получить код VBA для фильтров, включив макро-рекордер, а затем применив один или несколько фильтров к диапазону таблице. Если же вы хотите что-то уточнить, я с радостью помогу!
​,​​ тексту в столбце,​​Выделите данные, которые требуется​​ горные велосипеды.​
​ не соответствует условию​: ВСЁРАВНО НЕ РАБОТАЕТ!​ нормально работает, изменения​ вообще​Staniiislav​ — уже на​ через:​ бы фильтровал и​Поэтому вмешиваться в​В прилагаемом файле​ для фильтрации данных​ назначаем условие «Элементов​Рядом с заголовками появятся​Больше чем​ введите текст или​
​ отфильтровать.​

Ответ 10

​ мой макрос​Ячейки, включающие фильтр,​Столбцы для фильтрации​ Чистить вручную долго​Назначим фильтр для столбца​ диапазоне имеют одинаковый​Узнайте, как фильтр для​ хотите. Это делается​ Microsoft Excel отображает​ внизу страницы. Для​Снимите флажок​ причём, насколько знаю,​ Ваше внимание.​: Леш,​по которым будет​ случай. Так что​

Оставить отзыв

Публикуя свою персональную информацию в открытом доступе на нашем сайте вы, даете согласие на обработку персональных данных и самостоятельно несете ответственность за содержание высказываний, мнений и предоставляемых данных. Мы никак не используем, не продаем и не передаем ваши данные третьим лицам.