Для вывода графических схем в отчеты используется привязка типа "Файл". При этом выводится графика, которая уже существует в бизнес-модели (диаграмма процессов, оргструктуры). Не существует привязок, которые бы выводили различные диаграммы на основе цифровых данных бизнес-модели. Для решения подобных задач могут использоваться средства MS Word.
В статическом отчете формата Word необходимо вывести диаграмму с отображением количества непосредственно подчиненных должностей. Исходная информация для построения диаграммы будет представлена в таблице, формируемой привязкой.
Решение описывается с момента, когда в шаблоне отчета существует таблица – привязка типа "Фильтр" с отображением необходимых данных.
На основе таблицы необходимо построить диаграмму. Т.е. необходимо написать код, который вручную делался бы так:
Все решение сводится к написанию макроса.
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) 'ВВОДНАЯ BookmarkName = "НепосредственныеПодчинен_a5acb153" 'название привязки-таблицы для диаграммы Dim ColumnStart As Integer ColumnStart = 2 'с какого столбца брать данные (и до конца таблицы) Dim TableForChart As Table 'Проверка на корректность названия привязки Dim BookmarkIs As Boolean 'сначала считаем, что нужной закладки нет Dim Bkm As Bookmark 'переменная типа Закладка For Each Bkm In ActiveDocument.Bookmarks 'перебираем все закладки в документе If Bkm.Name = BookmarkName Then 'если нашли закладку с нашим именем BookmarkIs = True 'отмечаем, что закладка есть 'получаем таблицу по названию привязки Set TableForChart = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1) End If Next 'ПРОЦЕДУРНАЯ ЧАСТЬ If BookmarkIs Then 'если в документе закладка есть countColumns = TableForChart.Columns.Count 'количество столбцов таблицы countRows = TableForChart.Rows.Count ' количество строк таблицы 'Выделяем нужные столбцы таблицы, на основании которых будет создана диаграмма Dim DataColumns As Range With ActiveDocument Set DataColumns = .Range(Start:=TableForChart.Cell(1, ColumnStart).Range.Start, _ End:=TableForChart.Cell(countRows, countColumns).Range.End) DataColumns.Select End With WordBasic.InsertChart 'вставляем диаграмму с параметрами, указанными ниже With Application.ActiveDocument For i = 1 To Shapes.Count If (Shapes(i).Type = msoEmbeddedOLEObject) Then Shapes(i).Width = MillimetersToPoints(172.5) 'ширина диаграммы 17.25см Selection.ShapeRange.WrapFormat.Type = 3 'обтекание вокруг рамки Selection.ShapeRange.Left = wdShapeCenter 'горизонтальное выравнивание - по центру Set gr = Shapes(i).OLEFormat.Object.Application gr.Visible = False gr.PlotBy = XlRowCol.xlColumns 'данные берутся из колонок With gr.Chart Set axX = .Axes(XlAxisType.xlValue) 'горизонтальные линии сетки-линия-другая (короткий пунктир) axX.MajorGridlines.Border.LineStyle = XlLineStyle.xlDot With axX.TickLabels .AutoScaleFont = False .Font.FontStyle = "полужирный" .Font.Size = 12 End With Set axY = .Axes(XlAxisType.xlCategory) With axY.TickLabels .AutoScaleFont = False ' .Font.FontStyle = "полужирный" .Font.Size = 10 .Orientation = xlUpward End With .ChartArea.Border.LineStyle = 0 'без рамки для всей области диаграммы 'гистограмма столбиковая, не объемная, столбцы значений рядом .ChartType = XlChartType.xlColumnClustered 'цвет фона для столбиков '.PlotArea.Interior.Color = RGB(255, 255, 255) 'белый .PlotArea.Fill.Visible = False 'или удаляем фон 'цвет общего фона диаграммы '.ChartArea.Interior.Color = RGB(255, 255, 255) 'белый .ChartArea.Fill.Visible = False 'или удаляем .Legend.Delete 'не нужна легенда, иначе надо писать то, что ниже 'With .Legend 'настройка легенды '.Position = XlLegendPosition.xlLegendPositionBottom 'снизу по центру '.AutoScaleFont = False '.Font.FontStyle = "полужирный" '.Font.Size = 9 'End With End With Shapes(i).ConvertToInlineShape End If Next i End With End If End Sub