Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

Урок 13 из 25 ~20 мин +20 XP

Диаграммы: AddChart, серии и оси

Запрос addchart excelize приходит от руководства: цифры в таблице правильные, но картинку из них хочется видеть рядом с данными, а не отдельно. Excelize диаграмму не рисует — она записывает в xlsx описание графика со ссылками на ячейки, и диаграмму отрисовывает Excel при открытии. В уроке разберём AddChart с типом excelize.Col и excelize.Line, серии, заголовок и подписи осей, легенду, размеры и честную границу темы: где живёт диаграмма в файле и что произойдёт с ней при правке данных.

Содержание урока · 9 разделов

Всё, что собрано в предыдущих уроках, — данные, оформление, формулы, акценты — живёт в ячейках. Диаграмма первый элемент, который стоит рядом с ячейками, но не является ими: в xlsx она лежит отдельным объектом в пакете, а лист хранит лишь якорь — ячейку, у которой график приписан. Механика знакомая по условному форматированию: Go пишет описание, Excel рендерит. Из этого следует несколько практических выводов, которые проходят через весь урок. Первый: диаграмма ссылается на диапазоны, а не копирует значения — правка числа в Excel сразу меняет график, и это главное её достоинство перед скриншотом. Второй: excelize не отдаёт готовую картинку — PNG или JPEG из диаграммы библиотека не сделает, и если картинка нужна в письме, рисуйте график отдельной библиотекой, а excelize оставьте для файла. Третий вывод добавится на длинных листах: место под график стоит закладывать при проектировании отчёта, потому что область диаграммы перекроет несколько колонок, и данные под ней читать будет трудно. Разберём, как описание графика выглядит в коде: тип, серии, оси и легенда соберутся в одну структуру Chart.

AddChart: excelize диаграмма из ссылок на ячейки#

Вызов f.AddChart принимает три аргумента: лист, координату якоря и указатель на структуру Chart — и возвращает пару (string, error), где строка это идентификатор вставленного графика. Якорь — верхний-левый угол области диаграммы: AddChart("Отчёт", "F2", ...) поставит график справа от таблицы. Внутри Chart ключевые поля: Type — вид диаграммы константой вроде excelize.Col или excelize.Line, Dimension — размер в пикселях шириной и высотой, Series — список серий, Title — заголовок, Legend и оси. Серия ChartSeries состоит из трёх строк: Name — имя ряда, Categories — ссылка на подписи, Values — ссылка на значения. Ссылки пишутся абсолютные, с долларами и именем листа: "Отчёт!$A$2:$A$21" — диапазон категорий по колонке A. Диапазоны именно ссылочные: диаграмма читает ячейки при рендере, поэтому обновите данные в Excel — график перерисуется сам, без пересборки файла. Запрос excelize диаграмма в коде выглядит одинаково для всех видов: та же структура Chart меняет только Type.

Столбчатая диаграмма рядом с таблицей

GO
chartID, err := f.AddChart("Отчёт", "F2", &excelize.Chart{
    Type: excelize.Col,
    Dimension: excelize.ChartDimension{Width: 520, Height: 300},
    Series: []excelize.ChartSeries{
        {
            Name:       "Продажи",
            Categories: "Отчёт!$A$2:$A$21",
            Values:     "Отчёт!$B$2:$B$21",
        },
    },
    Title:  []excelize.RichTextRun{{Text: "Продажи по регионам"}},
    Legend: excelize.ChartLegend{Position: "bottom"},
})
if err != nil {
    panic(err)
}

Тип excelize.Col — столбчатая диаграмма: регионы по оси категорий, продажи столбцами. Категории и значения — абсолютные ссылки с именем листа; заголовок и легенда снизу собраны в той же структуре. chartID нужен, если график потом удаляют по якорю.

Типы диаграмм: excelize.Col, Line и соседи#

Константа Type определяет всё остальное. excelize.Col — столбцы, рабочий выбор для сравнения категорий: регионы, месяцы, товары. excelize.Line — линейный график для рядов во времени: продажи по дням и накопительные итоги читаются линией лучше, чем столбцами, и две серии на одном графике показывают прошлый год против текущего. excelize.Pie — круговая для долей одного ряда, у которой смысл держится на шести-восьми категориях: тридцать секторов никто не различит. excelize.Bar — та же столбчатая, но полосы идут горизонтально: длинные подписи категорий помещаются лучше. excelize.Scatter показывает связь двух величин точками, а excelize.Doughnut — кольцевой вариант круговой. Практическое правило: сравнение — Col, время — Line, доля — Pie, и этого набора хватает подавляющему числу отчётов; остальное — вкусовые вариации. Удаление графика делается по якорю: f.DeleteChart("Отчёт", "F2") снимет диаграмму с этой ячейки — приём перегенерации, когда файл пересобирается на живом листе.

Линейный график с двумя сериями

GO
if err := f.AddChart("Отчёт", "F20", &excelize.Chart{
    Type: excelize.Line,
    Dimension: excelize.ChartDimension{Width: 520, Height: 300},
    Series: []excelize.ChartSeries{
        {
            Name:       "Прошлый год",
            Categories: "Отчёт!$A$2:$A$13",
            Values:     "Отчёт!$B$2:$B$13",
        },
        {
            Name:       "Текущий год",
            Categories: "Отчёт!$A$2:$A$13",
            Values:     "Отчёт!$C$2:$C$13",
        },
    },
    Title: []excelize.RichTextRun{{Text: "Продажи по месяцам"}},
    Legend: excelize.ChartLegend{Position: "bottom"},
    XAxis: excelize.ChartAxis{Title: []excelize.RichTextRun{{Text: "Месяц"}}},
    YAxis: excelize.ChartAxis{Title: []excelize.RichTextRun{{Text: "Тыс. руб"}}},
}); err != nil {
    panic(err)
}

Две серии живут на одних категориях: колонка B — прошлый год, колонка C — текущий. Оси получили подписи через ChartAxis с RichTextRun, легенда снизу различает линии по Name. Один диапазон категорий на две серии — обычная схема для сравнения периодов.

Оси и легенда в addchart excelize#

Оси описываются структурами XAxis и YAxis: Title принимает подпись как RichTextRun, и в диаграммах без времени ось X часто остаётся без заголовка — категории говорят сами за себя. Легенда Legend соберёт имена серий из полей Name: название ряда — это то, что Excel покажет в легенде, поэтому Name пишут по-человечески, а не B2:B13. Позиция легенды задаётся строкой: bottom экономит ширину, right — пригодится для длинных имён серий, top_right ставит легенду в угол. Подписи значений прямо на столбцах и сетка настраиваются внутри Excel, если пользователю захочется — excelize пишет базовое описание, а тонкую доводку оставляет пользователю.

Размер и якорь: где диаграмма встанет#

Размер управляется полем Dimension: пятьсот на триста пикселей закрывает большинство отчётных задач, и помните, что рядом с таблицей график займёт несколько колонок — якорь F2 для листа с четырьмя колонками данных означает именно это. Якорь ставят в пустую зону справа или под таблицей: диаграмма ляжет поверх ячеек, и данные под ней станут нечитаемыми, так что место для графика резервируют заранее — пустые колонки между таблицей и якорем или отдельный лист для графиков. Вторая стратегия — отдельный лист диаграмм: таблица остаётся чистой, а графики собираются колонкой на листе Дашборд, и такой файл проще читать на печати. Запрос addchart excelize честнее считать способом поставить график в файл, а не способом нарисовать его под пиксель: фирменные цвета и корпоративные шаблоны доводят в Excel руками или отдельным инструментом.

Виды диаграмм excelize на выбор#

КонстантаЧто рисуетКогда берут
excelize.Colстолбцы по категориямсравнение регионов, месяцев, товаров
excelize.Lineлинии по рядамдинамика во времени, два периода
excelize.Pieкруговые секторадоля одного ряда, 6-8 категорий
excelize.Barгоризонтальные полосыдлинные подписи категорий
excelize.Scatterточки по парам значенийсвязь двух величин
excelize.Doughnutкольцо с секторамидоля с отверстием в центре

Чек-лист диаграмм#

  • AddChart принимает лист, якорь и Chart, возвращает (string, error) — идентификатор графика.
  • Серии ссылаются на ячейки: Categories и Values с именем листа и долларами.
  • Значения пишите числами: текстовые числа Excel отрисует нулевыми столбцами.
  • Type — константа: Col для сравнения, Line для времени, Pie для доли.
  • Легенда собирает имена серий из Name, оси подписываются ChartAxis.
  • DeleteChart по якорю снимает график — приём перегенерации живого листа.

Кейс про график, который копировали руками. Ежемесячный отчёт отдела продаж собирался excelize, а диаграмму аналитик вставлял в Excel сам: строил по колонке, копировал в шаблон письма, пересохранял. Каждый месяц повторялись две ошибки: график строился на прошлом диапазоне и терял последний месяц, а после правки данных пересборка графика забывалась — письмо уходило со старыми числами. Диаграмму перенесли в генератор: AddChart с якорем справа от таблицы, серии на фиксированные диапазоны, а диапазоны стали считать по числу строк с запасом в десять строк под рост. Письмо упростили: файл прикладывают целиком, картинка из него не выкусывается — потому что excelize PNG не отдаёт, а скриншоты возвращали ручную работу. Спорная сторона осталась у маркетинга: для презентаций нужен фирменный стиль диаграммы, который excelize не описывает, поэтому те же данные у них собираются в отдельном инструменте, и двойная работа сохранилась — но уже не в ежемесячном цикле, а раз в квартал.

Проверка: что возвращает AddChart

Что возвращает f.AddChart("Отчёт", "F2", &excelize.Chart{...})?

Проверка: ссылка на значения

Как правильно указать значения серии по колонке B листа Отчёт, строки 2-21?

Что напечатает код после AddChart?

Прочитайте код и выберите, что он выведет:

chartID, err := f.AddChart("Отчёт", "F2", &excelize.Chart{
    Type: excelize.Col,
    Series: []excelize.ChartSeries{
        {
            Name:       "Продажи",
            Categories: "Отчёт!$A$2:$A$21",
            Values:     "Отчёт!$B$2:$B$21",
        },
    },
})

fmt.Println(err)

Соберите столбчатую диаграмму

Допишите вызов AddChart, тип, структуру серии и поле значений.

id, err := f.("Отчёт", "F2", &excelize.Chart{ Type: excelize., Series: []excelize.{ { Name: "Продажи", Categories: "Отчёт!$A$2:$A$21", : "Отчёт!$B$2:$B$21", }, }, }) if err != nil { panic(err) }

Соберите лист с диаграммой

Расставьте строки в порядке выполнения: записать данные, поставить формулу итога, вставить диаграмму, проверить ошибку, напечатать идентификатор, сохранить файл.

Строки

Ваша программа

Нажимайте на строки слева, чтобы собрать программу

Карточки: диаграммы

Термин

AddChart

нажмите, чтобы перевернуть
Определение

Вставляет диаграмму: лист, якорь, Chart; возвращает (string, error). Якорь — верхний-левый угол области графика.

1 / 6

Диаграмма встала рядом с таблицей: тип выбран, серии ссылаются на ячейки, оси подписаны, удаление по якорю под контролем. Файл почти готов к отправке наверх: в уроке про картинки в шапку встанет логотип через AddPicture, а в уроке про закрепление областей и автофильтры шапка перестанет уезжать на длинных списках. Данные для серий вы записываете теми же вызовами из урока про запись ячеек, а формулы в итоговой строке из урока про формулы диаграмму не трогают: график смотрит на данные, не на итоги. Обе техники — диаграмма и акценты — сходятся в итоговом проекте генератора отчётов, где график встаёт в собранный отчёт продаж. Домашнее задание — столбчатая диаграмма по своей колонке данных с подписанными осями.

Песочница урока

Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.

Вывод

Запустите код, чтобы увидеть вывод.

Коротко: что запомнить

  • AddChart ставит диаграмму по якорю и возвращает (string, error) — идентификатор.
  • Серии ссылаются на ячейки: Categories и Values с именем листа и абсолютными адресами.
  • Значения для диаграмм пишутся числами: текстовые числа Excel нарисует нулями.
  • Type определяет вид: Col — сравнение, Line — время, Pie — доля из шести-восьми категорий.
  • Легенда берёт имена серий из Name; подписи осей задаются ChartAxis с RichTextRun.
  • Excelize описание записывает, а рисует Excel: правка данных обновляет график сама.

Домашнее задание

Добавьте в свой отчёт столбчатую диаграмму по колонке данных: якорь справа от таблицы, размер 520 на 300, легенда снизу, подписи обеих осей. Затем постройте линейный график с двумя сериями — два периода или два показателя на одних категориях — и проверьте в Excel, что правка одного числа в колонке значений меняет столбец без пересборки файла.

Личные заметкиПусто
Хранятся только в вашем браузере (Excelize · Диаграммы: AddChart, серии и оси)

Вопросы и ответы по уроку

Почему диаграмма получилась пустой, хотя данные на листе есть?

Две типовые причины: ссылки без имени листа или без долларов, из-за которых Excel не нашёл диапазон, и значения, записанные строками, — текстовые числа рисуются нулевыми столбцами. Проверьте ссылки Отчёт!$B$2:$B$21 и то, что данные записаны через SetCellValue числами.

Можно ли получить из диаграммы готовую картинку PNG?

Нет: excelize записывает описание диаграммы в файл, а отрисовку выполняет Excel при открытии. Если картинка нужна для письма или презентации, рисуйте график отдельной библиотекой на тех же данных, а диаграмму в xlsx держите для интерактивной работы с файлом.

Как расширить диапазон диаграммы, когда строк стало больше?

Диапазон в описании фиксирован, и новые строки за его границей график не увидит. При генерации считайте диапазон по числу строк данных и закладывайте запас, либо собирайте ссылку через Sprintf — как формулы в уроке про формулы; на готовом листе диапазон правится вручную в Excel.

Термины курса

Понятия, на которых строится этот курс, — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылок на практику.

Следующая ступень учебного пути

Cron25 уроков~9 чпрактика25 уроков уже доступны

Фоновые задачи в Go: планировщик на robfig/cron

Курс по cron в Go: robfig/cron v3, синтаксис выражений, пояса, wrappers, конкурентность и graceful shutdown. 25 уроков с примерами и проектом.

  • Собирать планировщик на robfig/cron v3 и запускать задачи по расписанию
  • Читать и писать cron-выражения: пять полей, спецсимволы, @daily
  • Управлять жизненным циклом: Start, Stop, Entry, Remove
  • Держать часовые пояса и секундные расписания под контролем