Всё, что собрано в предыдущих уроках, — данные, оформление, формулы, акценты — живёт в ячейках. Диаграмма первый элемент, который стоит рядом с ячейками, но не является ими: в 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.
Столбчатая диаграмма рядом с таблицей
GOchartID, 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 нужен, если график потом удаляют по якорю.
Ссылки в Categories и Values пишутся с именем листа и долларами: Отчёт!$B$2:$B$21. Без имени листа или с относительной ссылкой график может встать пустым — excelize не проверит, что за ячейки вы указали, а Excel при рендере не найдёт данные. Вторая частая пустота: колонка значений записана строками. Если числа попадают в лист через SetCellValue текстом вроде "1200", Excel посчитает столбцы нулевыми — данные для диаграмм пишите числами из урока про запись ячеек.
Типы диаграмм: excelize.Col, Line и соседи#
Константа Type определяет всё остальное. excelize.Col — столбцы, рабочий выбор для сравнения категорий: регионы, месяцы, товары. excelize.Line — линейный график для рядов во времени: продажи по дням и накопительные итоги читаются линией лучше, чем столбцами, и две серии на одном графике показывают прошлый год против текущего. excelize.Pie — круговая для долей одного ряда, у которой смысл держится на шести-восьми категориях: тридцать секторов никто не различит. excelize.Bar — та же столбчатая, но полосы идут горизонтально: длинные подписи категорий помещаются лучше. excelize.Scatter показывает связь двух величин точками, а excelize.Doughnut — кольцевой вариант круговой. Практическое правило: сравнение — Col, время — Line, доля — Pie, и этого набора хватает подавляющему числу отчётов; остальное — вкусовые вариации. Удаление графика делается по якорю: f.DeleteChart("Отчёт", "F2") снимет диаграмму с этой ячейки — приём перегенерации, когда файл пересобирается на живом листе.
Линейный график с двумя сериями
GOif 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 | кольцо с секторами | доля с отверстием в центре |
График ссылается на диапазоны: пользователь правит число в колонке B — столбец и линия обновляются без пересборки файла. Поэтому диаграмму ставят на данные, а не на снимок: добавьте строки за пределы диапазона — и график их не увидит, диапазон в описании придётся расширить при генерации с запасом или через именованный диапазон.
Чек-лист диаграмм#
- AddChart принимает лист, якорь и Chart, возвращает (string, error) — идентификатор графика.
- Серии ссылаются на ячейки: Categories и Values с именем листа и долларами.
- Значения пишите числами: текстовые числа Excel отрисует нулевыми столбцами.
- Type — константа: Col для сравнения, Line для времени, Pie для доли.
- Легенда собирает имена серий из Name, оси подписываются ChartAxis.
- DeleteChart по якорю снимает график — приём перегенерации живого листа.
AddChart требует книги на диске, поэтому в браузерной песочнице не запускается: там доступны fmt, strings, strconv, math, sort, errors и time без файлового ввода-вывода. Потренируйте сборку ссылок на диапазоны: Sprintf строки Отчёт!$B$2:$B$21 из номера колонки и границ — логика ссылок пригодится и в координатах листа, файл соберите локально.
Кейс про график, который копировали руками. Ежемесячный отчёт отдела продаж собирался 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, тип, структуру серии и поле значений.
Соберите лист с диаграммой
Расставьте строки в порядке выполнения: записать данные, поставить формулу итога, вставить диаграмму, проверить ошибку, напечатать идентификатор, сохранить файл.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Карточки: диаграммы
Диаграмма встала рядом с таблицей: тип выбран, серии ссылаются на ячейки, оси подписаны, удаление по якорю под контролем. Файл почти готов к отправке наверх: в уроке про картинки в шапку встанет логотип через AddPicture, а в уроке про закрепление областей и автофильтры шапка перестанет уезжать на длинных списках. Данные для серий вы записываете теми же вызовами из урока про запись ячеек, а формулы в итоговой строке из урока про формулы диаграмму не трогают: график смотрит на данные, не на итоги. Обе техники — диаграмма и акценты — сходятся в итоговом проекте генератора отчётов, где график встаёт в собранный отчёт продаж. Домашнее задание — столбчатая диаграмма по своей колонке данных с подписанными осями.
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.
Запустите код, чтобы увидеть вывод.
Коротко: что запомнить
- AddChart ставит диаграмму по якорю и возвращает (string, error) — идентификатор.
- Серии ссылаются на ячейки: Categories и Values с именем листа и абсолютными адресами.
- Значения для диаграмм пишутся числами: текстовые числа Excel нарисует нулями.
- Type определяет вид: Col — сравнение, Line — время, Pie — доля из шести-восьми категорий.
- Легенда берёт имена серий из Name; подписи осей задаются ChartAxis с RichTextRun.
- Excelize описание записывает, а рисует Excel: правка данных обновляет график сама.
Домашнее задание
Добавьте в свой отчёт столбчатую диаграмму по колонке данных: якорь справа от таблицы, размер 520 на 300, легенда снизу, подписи обеих осей. Затем постройте линейный график с двумя сериями — два периода или два показателя на одних категориях — и проверьте в Excel, что правка одного числа в колонке значений меняет столбец без пересборки файла.
Личные заметкиПусто
Вопросы и ответы по уроку
Почему диаграмма получилась пустой, хотя данные на листе есть?
Две типовые причины: ссылки без имени листа или без долларов, из-за которых Excel не нашёл диапазон, и значения, записанные строками, — текстовые числа рисуются нулевыми столбцами. Проверьте ссылки Отчёт!$B$2:$B$21 и то, что данные записаны через SetCellValue числами.
Можно ли получить из диаграммы готовую картинку PNG?
Нет: excelize записывает описание диаграммы в файл, а отрисовку выполняет Excel при открытии. Если картинка нужна для письма или презентации, рисуйте график отдельной библиотекой на тех же данных, а диаграмму в xlsx держите для интерактивной работы с файлом.
Как расширить диапазон диаграммы, когда строк стало больше?
Диапазон в описании фиксирован, и новые строки за его границей график не увидит. При генерации считайте диапазон по числу строк данных и закладывайте запас, либо собирайте ссылку через Sprintf — как формулы в уроке про формулы; на готовом листе диапазон правится вручную в Excel.
Термины курса
Понятия, на которых строится этот курс, — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылок на практику.
Изучайте дальше
Следующая ступень учебного пути
Фоновые задачи в Go: планировщик на robfig/cron
Курс по cron в Go: robfig/cron v3, синтаксис выражений, пояса, wrappers, конкурентность и graceful shutdown. 25 уроков с примерами и проектом.
- Собирать планировщик на robfig/cron v3 и запускать задачи по расписанию
- Читать и писать cron-выражения: пять полей, спецсимволы, @daily
- Управлять жизненным циклом: Start, Stop, Entry, Remove
- Держать часовые пояса и секундные расписания под контролем