Wpf таблицы как в excel
В следующих примерах показано, как программным способом создать Table и заполнить его содержимым. Содержимое таблицы делится на пять строк (представленные TableRow объектами, содержащимися в RowGroups объекте) и шесть столбцов (представленных TableColumn объектами). Строки используются для различных целей представления, включая строку названия, предназначенную для заголовка всей таблицы, строку заголовка для описания столбцов данных в таблице и строку нижнего колонтитула для сводной информации. Обратите внимание, что строки "title", "header" и "footer" не встроены в таблицу. Это просто строки с разными характеристиками. Ячейки таблицы содержат фактическое содержимое, которое может состоять из текста, изображений или практически любого другого пользовательский интерфейс элемента.
Пример
FlowDocumentВо-первых, создается для размещения Table , а новый Table создается и добавляется к содержимому FlowDocument .
Пример
Затем создается шесть TableColumn объектов и добавляется в Columns коллекцию таблицы с применением определенного форматирования.
Обратите внимание, что в Columns коллекции таблицы используется стандартная индексация, начинающаяся с нуля.
Пример
Затем создается строка заголовка и добавляется в таблицу с определенным форматированием. Строка названия содержит одну ячейку, охватывающую все шесть столбцов таблицы.
Пример
Далее создается и добавляется в таблицу строка заголовка, а ячейки в строке заголовка создаются и заполняются содержимым.
Пример
Затем создается и добавляется в таблицу ряд данных, а ячейки в этой строке создаются и заполняются содержимым. Построение этой строки аналогично построению строки заголовка с применением немного другого форматирования.
Пример
Наконец, создается, добавляется и форматируется строка нижнего колонтитула. Как и строка названия, нижний колонтитул содержит одну ячейку, которая включает все шесть столбцов в таблице.
В предыдущих главах для вывода текста использовался элемент TextBlock. Однако этого элемента недостаточно для создания насыщенных приложений с большими объемами текста со сложным форматированием и встроенными изображениями. Для этого нам надо использовать документы .
Итак, все документы в WPF деляться на две группы:
Фиксированные документы (fixed documents) . Формат и расположение содержимого таких документов фиксировано и не может быть изменено. На различных устройствах с различным разрешением экрана содержимое будет выглядеть одинаково и не будет оптимизировано. Такие документы преимущественно предназначены для печати. Для фиксированных документов WPF использует стандарт XPS (XML Paper Specification)
Потоковые документы (flow documents) . Эти документы предназначены для просмотра на экране монитора. А WPF выполняет оптимизацию документа под конкретные параметры среды.
Потоковые документы
Потоковые документы в WPF представлены классом FlowDocument, который может включать в себя разлиные потоковые элементы (flow elements). Все эти элементы не являются стандартными элементами управления, как, например, Button или TextBlock, а наследуются от базового класса FrameworkContentElement и поэтому поддерживают такие механизмы, как привязка, анимация и другие, но не используют компоновку. В итоге всю иерархию потоковых элементов можно представить следующим образом:
Создание потоковых документов
Для использования объекта FlowDocument мы должны поместить его в один из контейнеров - FlowDocumentReader, FlowDocumentPageViewer или FlowDocumentScrollViewer. Например:
Содержимое потоковых документов
В качестве содержимого FlowDocument принимает один или несколько потоковых элементов. Все эти элементы являются наследниками класса TextElement и могут быть блочными (block) и строчными (inline).
Блочные элементы
К блочным элементам относят следующие : Paragraph , List , Table , BlockUIContainer и Section .
Элемент Paragraph
Элемент Paragraph содержит коллекцию Inlines , которая в свою очередь включает строковые элементы, причем не только текст. Чтобы параграф отображал текст, надо использовать строчный элемент Run :
Хотя мы можем не использовать Run и напрямую писать текст в содержимое параграфа, однако в этом случае элемент Run все равно будет создан, только неявно. Поэтому чтобы в данном случае получить в коде содержимое параграфа, нам надо получить текст элемента Run:
Элемент List
Блочный элемент List представляет собой список. Он содержит коллекцию элементов ListItem , которые и представляют элементы списка. Каждый из элементов ListItem , в свою очередь, может включать другие блочные элементы, например, Paragraph :
С помощью свойства MarkerStyle можно задать формат списка:
Disc : стандартный черный кружочек. Значение по умолчанию
Box : черный квадратик, как в примере выше
Circle : кружок без наполнения
Square : квадратик без наполнения
Decimal : десятичные цифры от 1, то есть обычный нумерованный список
LowerLatin : строчные латинские буквы (a, b, c)
UpperLatin : заглавные латинские буквы (A, B, C)
LowerRoman : латинские цифры в нижнем регистре (i, iv, x)
UpperRoman : латинские цифры в верхнем регистре (I, IV, X)
None : отсутствие маркера списка
Элемент Table
Элемент Table организует вывод содержимого в виде таблицы. Он имеет вложенный элемент TableRowGroup . Этот элемент позволяет задать однообразный вид таблицы и содержит коллекцию строк - элементов TableRow (строку таблицы). А каждый элемент TableRow содержит несколько элементов TableCell (ячейка таблицы). В элементе TableCell затем уже размещаются блочные элементы с содержимым, например, элементы Paragraph:
Для определения столбцов в элементе применяется коллекция Table.Columns . Каждый столбец представляет элемент TableColumn, у которого мы можем задать ширину.
Элемент Section
Элемент Section предназначен для группировки других блочных элементов и предназначен прежде всего для однобразной стилизации этих элементов:
Элемент BlockUIContainer
Элемент BlockUIContainer позволяет добавить в документ различные элементы управления, которые не являются блочными или строчными элементами. Так, мы можем добавить кнопку или картинку к документу. Такая функциональность особенно полезна, когда необходимо добавить интерактивную связь с пользователем:
Строчные элементы
Выше мы уже использовали элемент Run , который хранит некоторый текст, выводимый в блочном элементе, например, в элементе Paragraph.
Элемент Span объединяет другие строчные элементы и применяет ним определенное форматирование:
Чтобы задать для текста отдельные способы форматирования, применяются элементы Bold , Italic и Underline , которые позволяют создать текст полужирным шрифтом, курсивом и подчеркнутый текст соответственно.
Элемент Hyperlink позволяет вставить в документ ссылку для перехода и может использоваться в навигационных приложениях:
Элемент LineBreak задает перевод строки:
InlineUIContainer подобен элементу BlockUIContainer и также позволяет помещать другие элементы управления, например, кнопки, только является строковым.
Элементы Floater и Figure позволяют вывести плавающее окно с некоторой информацией, текстом, картинками и прочим:
Остальной текст будет обтекать элемент Floater, заданный таким образом, справа.
Figure
Figure во многом аналогичен элементу Floater за тем исключением, что дает больше возможностей по контролю за позиционированием. Так, следующая разметка будет создавать эффект, аналогичный примеру с Floater:
С помощью свойства HorizontalAnchor мы можем управлять позиционированием элемента по горизонтали. Так, значение ContentLeft позволяет выравнить текст по левой стороне, ContentRight - по правой стороне, а значение ContentCenter - по центру.
Другое свойство VerticalAnchor позволяет выравнить содержимое Figure по вертикали.
Table— это элемент уровня блока, поддерживающий представление Flow документа на основе сетки. Гибкость этого элемента делает его очень полезным, но также и более сложным для понимания и правильного использования.
В этом разделе содержатся следующие подразделы.
Основные сведения о таблицах
Отличие таблицы от сетки
Table и Grid обладают некоторыми общими функциями, но они лучше всего подходят для различных сценариев. Tableкомпонент предназначен для использования в содержимом нефиксированного формата (дополнительные сведения о содержимом нефиксированного формата см. в Flow документе ). Сетки лучше всего использовать внутри форм (по сути, в любом месте вне потокового содержимого). В среде FlowDocument Table поддерживает поведение нефиксированного содержимого, например разбивку на страницы, перекомпоновку столбцов и выбор содержимого, а не в Grid . А с Grid другой стороны лучше использовать за пределами, FlowDocument по многим причинам Grid , включая добавление элементов на основе индекса строк и столбцов Table . GridЭлемент разрешает разслойировать дочернее содержимое, допуская наличие в одной "ячейке" более одного элемента. Table не поддерживает разслойное размещение. Дочерние элементы объекта Grid могут быть абсолютно расположены относительно области их границ "ячейка". Table не поддерживает эту функцию. Наконец, Grid требуется меньше ресурсов, а затем Table рекомендуется использовать Grid для повышения производительности.
Основная структура таблицы
Table предоставляет представление на основе сетки, состоящее из столбцов (представленных TableColumn элементами) и строк (представленных TableRow элементами). TableColumn элементы не размещают содержимое; они просто определяют столбцы и характеристики столбцов. TableRow элементы должны размещаться в TableRowGroup элементе, который определяет группирование строк для таблицы. TableCell элементы, которые содержат реальное содержимое, которое должно быть представлено таблицей, должны размещаться в TableRow элементе. TableCell может содержать только элементы, производные от Block . Допустимые дочерние элементы для TableCell include.
TableCell элементы не могут напрямую размещать текстовое содержимое. дополнительные сведения о правилах включения для элементов растягиваемого содержимого, таких как TableCell , см. в разделе Flow документ общие сведения.
Table функция похожа на Grid элемент, но имеет больше возможностей и, следовательно, требует большего объема ресурсов.
В следующем примере определяется простая таблица 2 x 3 с XAML.
На следующем рисунке показано, как этот пример отрисовывается.
Вложения таблицы
Table является производным от Block элемента и соответствует общим правилам для Block элементов уровня. TableЭлемент может содержаться в любом из следующих элементов:
Группирование строк
TableRowGroupЭлемент предоставляет возможность произвольного группирования строк в таблице; каждая строка в таблице должна принадлежать к группированию строк. Строки в группе часто имеют общее назначение и могут быть стилизованы в виде группы. Обычно группирование строк используется для отделения строк специального назначения, например строк названия, заголовка и нижнего колонтитула, от основного содержимого, находящегося в таблице.
В следующем примере XAML используется для определения таблицы со строками верхнего и нижнего колонтитулов.
На следующем рисунке показано, как этот пример отрисовывается.
Приоритет отрисовки фона
Элементы таблицы отрисовываются в следующем порядке (z-порядок от нижнего к верхнему). Этот порядок нельзя изменить. Например, для этих элементов не существует свойства "Z-порядок", которое можно использовать для переопределения этого установленного порядка.
Рассмотрим следующий пример, в котором задается цвет фона для каждого из этих элементов в таблице.
На следующем рисунке показана отрисовка этого примера (показаны только фоновые цвета).
Объединение строк или столбцов
Ячейки таблицы могут быть настроены на охват нескольких строк или столбцов с помощью RowSpan ColumnSpan атрибутов или соответственно.
Рассмотрим следующий пример, в котором ячейка включает три столбца.
На следующем рисунке показано, как этот пример отрисовывается.
Построение таблицы с помощью кода
В следующих примерах показано, как программным способом создать Table и заполнить его содержимым. Содержимое таблицы делится на пять строк (представленные TableRow объектами, содержащимися в RowGroups объекте) и шесть столбцов (представленных TableColumn объектами). Строки используются для различных целей представления, включая строку названия, предназначенную для заголовка всей таблицы, строку заголовка для описания столбцов данных в таблице и строку нижнего колонтитула для сводной информации. Обратите внимание, что строки "title", "header" и "footer" не встроены в таблицу. Это просто строки с разными характеристиками. Ячейки таблицы содержат фактическое содержимое, которое может состоять из текста, изображений или практически любого другого пользовательский интерфейс элемента.
FlowDocumentВо-первых, создается для размещения Table , а новый Table создается и добавляется к содержимому FlowDocument .
Затем создается шесть TableColumn объектов и добавляется в Columns коллекцию таблицы с применением определенного форматирования.
Обратите внимание, что в Columns коллекции таблицы используется стандартная индексация, начинающаяся с нуля.
Затем создается строка заголовка и добавляется в таблицу с определенным форматированием. Строка названия содержит одну ячейку, охватывающую все шесть столбцов таблицы.
Далее создается и добавляется в таблицу строка заголовка, а ячейки в строке заголовка создаются и заполняются содержимым.
Затем создается и добавляется в таблицу ряд данных, а ячейки в этой строке создаются и заполняются содержимым. Построение этой строки аналогично построению строки заголовка с применением немного другого форматирования.
Наконец, создается, добавляется и форматируется строка нижнего колонтитула. Как и строка названия, нижний колонтитул содержит одну ячейку, которая включает все шесть столбцов в таблице.
Вывод в datagrid из Excel по условию
Имеется грид от devexpressa данные грузятся из oracle но есть другая колонка которую необходимо.
DataGrid в Excel
Здравствуйте, нужно данные из DataGrid'a внести в Excel. Сейчас пишу программу с использованием.
Datagrid в Excel
Коллеги, добрый день! Такая ситуация: Создал программу в Excel для получения данных из баз данных.
DataGrid to Excel
Добрый день! Есть данные в datagrid заполненные по средствам выполнение хранимой процедуры на SQL.
А где ItemsSource у datagrid? Где Вы храните данные?
Я пользуюсь ClosedXML (загружается через NuGet). Вот пример сохранения в Excel:
Проблем с выводом данных в приложении нет Hugonavy, Если бы можно было как-то задать DataGrid в DataTable, думаю, было бы проще
Находил такой пример и пытался осуществить:
Проблема в том, что нельзя объявить напрямую в Void обозначить DataGrid Kreonator12, чем вызвано использование Excel для хранения данных? Элд Хасп, Да, хоть какое-то средство хранения данных, вывода. Это у меня всё для проекта используется, поэтому требование такое. На WinForms с этим проблем не было.
Если у вас есть предложение с хоть каким-либо выводом таблицы в любое расширение, буду очень рад услышать.
Excel очень желательно, но не обязательно Если у вас есть предложение с хоть каким-либо выводом таблицы в любое расширение, буду очень рад услышать.
Рекомендую SQLite и Репозиторий данных через EF.
Такую связку очень удобно использовать в WPF+MVVM Решении.
Добавлено через 1 минуту
Основной способ получения данных в WPF - это Контекст Данных.
В концепции MVVM он называется ViewModel.
Элд Хасп, Спасибо, пойду изучать.
Добавлено через 4 минуты
Элд Хасп, Но также, может по настоящее время есть другой способ, в какой формат можно вывести таблицу?
Наверняка есть.
Но надо разбираться как получать/возвращать данные в Excel.
Для меня это уже давно забытый этап.
Несколько лет к этому не прибегал.
Что касается прямого "стыкования" WPF и Excel - вообще, такого никогда не делал.
Может кто с этим и сможет вам помочь.
Но только не я.
Экспорт из DataGrid в Excel
Подскажите пожалуйста, как можно организовать автоматический вывод информации из DataGrid в EXCEL.
Экспорт из Datagrid в Excel
Пытаюсь изменить предварительно открытый в datagrid файл Excel формата xlsx. Когда я нажимаю кнопку.
Экспорт с DataGrid в Excel
При нажатии на кнопку экспортирую DataGrid в Excel. Проблема в том, что ширина столбцов в Excel не.
Экспорт datagrid в Excel
Добрый день. Очень нужна помощь. Есть шаблон в Excel'e нужно экспортировать таблицу из dataGrid'a.
Экспорт DataGrid в Excel, Null
Добрый день! По нижеследующему коду, экспортирую данные из datagrid в таблицу Excel, но столкнулся.
Читайте также: