Документы

anthropics/xlsx

Позволяет открывать, читать, редактировать и создавать файлы электронных таблиц (.xlsx, .xlsm, .csv, .tsv), а также очищать и преобразовывать табличные данные. Полезен для работы с формулами, форматированием, диаграммами и исправлением ошибок в таблицах.

Оцените навык первым

SKILL.md

Перевод инструкции, которую получает агент при подключении навыка. Агент всегда использует оригинал.

Создание, редактирование и анализ XLSX

Задача Подход
Создать или редактировать с формулами/форматированием openpyxl — см. особенности ниже
Массовый ввод/вывод данных pandas (read_excel, to_excel)
Быстрый просмотр листа markitdown file.xlsx## SheetName для каждого листа; читает также .xlsm. Нет координат ячеек, поэтому не планируйте редактирование по нему
Прочитать модель (формулы и значения) два прохода load_workbook — см. особенности

openpyxl, pandas и markitdown предустановлены — не запускайте pip install заранее; пишите скрипт и импортируйте напрямую. Только если импорт не удаётся (или отсутствует команда markitdown): установите недостающий пакет через pip install.

Пути к скриптам ниже относительно директории этого навыка.

Требования к каждому результату

  • Профессиональный шрифт (Arial, Times New Roman) по всему документу, если пользователь не указал иное.
  • Нулевые ошибки формул. Никогда не отправляйте файл, если recalc.py сообщает errors_found. Если считаете, что ошибка была до вас, докажите это: загрузите оригинал с data_only=True и посмотрите на эту ячейку. Ошибка, которую вы внесли, выглядит точно так же, как унаследованная.
  • Используйте формулы, а не жёстко заданные результаты. Пишите sheet['B10'] = '=SUM(B2:B9)', а не вычисленное в Python число. Таблица должна пересчитываться при изменении входных данных.
  • Строго следуйте спецификации пользователя. Точные имена вкладок, точные заголовки столбцов и формулы, которые он указал. Переработка, вычисляющая что-то другое, — провал, как бы элегантно ни было.
  • Документируйте каждое предположение и жёстко заданное число там, где это увидит читатель — комментарий к ячейке или соседняя ячейка в конце таблицы. Указывайте реальный источник, если он есть (Источник: Company 10-K, FY2024, Страница 45, Примечание по выручке, [SEC EDGAR URL]); если число дал пользователь — скажите об этом прямо.
  • Рабочая книга, которую вы создаёте для заполнения кем-то, должна содержать короткую легенду с указанием, какие ячейки редактировать, и один пример строки с реалистичными значениями, показывающий ожидаемый формат. Никогда не добавляйте такую строку в файл, который вас попросили отредактировать.
  • Редактируя существующий файл: строго соблюдайте его конвенции. Они имеют приоритет над всеми этими правилами. Сначала найдите назначенные для ввода ячейки — их выделяют особым цветом шрифта, заливкой или штриховкой — пишите только туда и не трогайте существующие формулы.

Пересчёт (обязательно, если в файле есть формулы)

openpyxl записывает формулы как строки без кэшированных значений. Пока вы не пересчитаете, каждая ячейка с формулой при чтении кэшированных значений возвращает None — для pandas, load_workbook(data_only=True) и большинства просмотрщиков.

python scripts/recalc.py output.xlsx [timeout_seconds]   # по умолчанию 30

LibreOffice вычисляет все формулы, файл перезаписывается на месте, и вы получаете JSON: status (success | errors_found), total_formulas, total_errors и error_summary с указанием до 100 ячеек на тип ошибки (locations_truncated говорит, сколько пропущено — доверяйте total_errors, а не длине списка). Исправьте указанные ошибки и запустите снова. JSON с ключом error вместо status означает, что пересчёт не произошёл, и только в этом случае возвращается ненулевой код — errors_found возвращает 0, поэтому никогда не считайте успешный выход признаком чистой книги.

Зелёный пересчёт доказывает, что формулы вычисляются, но не что они правильны. Сдвиг диапазона на одну ячейку или ссылка на неправильную строку дают чистый, без ошибок файл с неверными числами. Сначала напишите 2–3 формулы и проверьте, что они дают ожидаемые значения, прежде чем строить всю таблицу.

Рабочая книга с ссылками на другой файл теряет эти ссылки, если вы сохраняете её через openpyxl, а потом пересчитываете. Такая формула выглядит как ='[1]Returns Analysis'!$B$2[1] — индекс во внешнем списке ссылок книги, указывающий на отдельный файл на диске, а не лист. Обычно этот файл здесь отсутствует, поэтому кэшированное значение ячейки — единственное, что хранит данные. openpyxl удаляет это значение при сохранении; LibreOffice пытается разрешить ссылку, не удаётся, пишет #NAME? и удаляет все ссылки. recalc.py отказывается работать в таком состоянии — скопируйте значения этих ячеек из оригинала перед сохранением (--force принудительно перезапишет и примет потерю).

Выбор формул, которые проходят проверку

LibreOffice поддерживает меньше функций, чем Excel, и функция, которую он не может вычислить, становится в файле буквальным #NAME?.

  • Предпочитайте функции эпохи Excel 2007SUMIFS, INDEX, MATCH, IFERROR, SUMPRODUCT — которые не требуют префикса.
  • Шесть функций после 2007 года работают, но только с префиксом _xlfn., потому что openpyxl записывает формулу в XML дословно, а Excel хранит новые имена с префиксом (UI скрывает его): _xlfn.TEXTJOIN, _xlfn.CONCAT, _xlfn.IFS, _xlfn.SWITCH, _xlfn.MAXIFS, _xlfn.MINIFS. Без префикса каждая даёт #NAME?.
  • Никогда не используйте XLOOKUP, XMATCH, SORT, FILTER, UNIQUE или SEQUENCE. LibreOffice в рантайме не может вычислить их ни с каким префиксом. Новые версии могут, но это функции с «выплескивающимся» массивом, а openpyxl не пишет метаданные о выплеске, поэтому только верхняя левая ячейка диапазона получает значение — и recalc.py сообщает total_errors: 0 на усечённом результате. Используйте INDEX/MATCH для поиска, а сортировку, фильтрацию и удаление дубликатов делайте в Python перед записью.
  • Формула, которую LibreOffice не смог распарсить, записывается обратно в нижнем регистре — быстрый признак рядом с #NAME?.

Особенности openpyxl

  • Чтение модели требует двух загрузок. data_only=True возвращает кэшированные значения без формул; по умолчанию — формулы без значений. Одним проходом нельзя получить и то, и другое.
  • data_only=True разрушительно при сохранении. Такая книга не содержит формул, поэтому сохранение заменяет их на литералы — навсегда.
  • data_only=True для файла, только что записанного openpyxl, возвращает None везде — сначала запустите recalc.py. (Формула с результатом "" тоже читается как None.)
  • Объединённые ячейки: записывайте только верхний левый якорь. Все остальные ячейки диапазона — MergedCell с доступным только для чтения .value.
  • .xlsm теряет макросы, если не передать keep_vba=True в load_workbook.
  • Имя листа с пробелом должно быть в кавычках в ссылках на другие листы: ='Assumptions Inputs'!$B$5. Без кавычек будет #VALUE!.

Финансовые модели

Если пользователь не сказал иное или существующий файл не делает что-то другое.

Цвета: синий текст (0,0,255) — жёстко заданные входные данные и рычаги сценария · чёрный — формулы · зелёный (0,128,0) — ссылки на другой лист · красный (255,0,0) — ссылки на другой файл · жёлтая заливка (255,255,0) — ключевые предположения и ячейки для заполнения пользователем.

Числа: валюта $#,##0, с единицей в заголовке (Revenue ($mm)) · нули отображаются как -, включая проценты ($#,##0;($#,##0);-) · отрицательные в скобках · проценты 0.0%, хранятся как дроби (0.15 отображается как 15.0%; хранение 15 даёт 1500.0%) · мультипликаторы оценки 0.0x · годы как текст ("2024", никогда не 2,024).

Структура: каждое предположение в отдельной подписанной ячейке, на которую ссылаются формулы (=B5*(1+$B$6), а не =B5*1.05) · формулы одинаковы для каждого периода прогноза, так как одиночная изменённая ячейка в середине строки — самая частая тихая ошибка · защитите делители, которые могут быть нулём.

Зависимости

openpyxl, pandas, markitdown (pip, предустановлены — устанавливайте только если импорт не удаётся или команда отсутствует) · LibreOffice (soffice, автонастройка для изолированных сред через scripts/office/soffice.py)