Не зберігайте повторно Excel, наданий безпосередньо клієнтом: спочатку перевірте зовнішні посилання

keep_vba=Правда — це політика збереження, а не доказ «виявленого макросу». Далі перевіряється лише наявність пакета ZIP vbaProject.bin і зовнішніх компонентів посилання; наявність компонентів не означає, що вміст безпечний, макроси дійсні або зовнішні цілі доступні. Макроси не виконуватимуться, а посилання не переглядатимуться.

Excel, надісланий клієнтом, нормально відкривається локально, але після обробки сценарієм Python або завантаження в систему формула може змінитися на #REF!, спадне меню зникне або його навіть неможливо відкрити. Зазвичай це не пошкодження файлу, а автоматичний інструмент, який не зберіг зовнішній кеш посилань або макроси VBA недоторканими під час повторного збереження.

Ця стаття написана для розробників і операторів, яким потрібно використовувати сценарії для пакетної обробки Excel. Нижче буде пояснено, яку інформацію буде втрачено під час завантаження openpyxl за замовчуванням, надано ідею перевірки синтетичного зразка та перелічено межі, які потребують перегляду вручну під час прийняття. Прочитавши це, ви зможете визначити, що потрібно перевірити перед збереженням документа.

Висновок одним реченням: проведіть інвентаризацію зовнішніх посилань і компонентів VBA перед повторним збереженням Excel

Спочатку перевірте, чи є проекти VBA та зовнішні компоненти посилань у пакеті файлів, потім визначте параметри завантаження та збережіть процес перевірки вручну під час прийняття.

ваша ситуаціяРекомендовані практикипричина
Пакет файлів знаходиться у vbaProject.binПовідомити, що він містить вміст, який потрібно переглянути окремо, і макрос не буде виконано.Наявність компонента не означає, що макрос дійсний або що вміст безпечний
У пакеті файлів є компоненти зовнішніх посиланьЗаписує своє розташування в пакеті, не отримує доступу до ціліСценарій лише проводить інвентаризацію та не перевіряє, чи доступна ціль.
Завантажити з keep_vba=TrueСприймайте це як стратегію завантаженняkeep_vba=True — це політика збереження, а не доказ виявлення макросу

##Чому завантаження за замовчуванням призведе до втрати ключової інформації

В офіційній документації openpyxl зазначено, що load_workbook має чіткі межі для обробки неклітинних даних. keep_links за умовчанням має значення True, що зберігає визначення посилання в XML, але не гарантує, що зовнішній кеш даних (кешовані значення) залишатиметься дійсним після перезавантаження. Після того, як ви залишите початкове мережеве середовище або вихідний шлях до файлу, Excel все ще може повідомляти про помилку під час оновлення.

keep_vba за умовчанням має значення False. Якщо вихідний файл містить макроси, проект VBA буде видалено після завантаження та збереження за замовчуванням. Такі об’єкти, як діаграми та фігури, також можуть ігноруватися під час читання.

Це не баги, а функціональні межі самої бібліотеки. Працюючи з файлами робочого рівня, вам слід явно оголосити політику збереження, а не припускати, що інструмент автоматично збереже всі функції.

Синтетичні приклади та підготовка тестового файлу

Щоб безпечно продемонструвати цей механізм, рекомендується побудувати синтетичний сценарій, який не покладається на дані реальних клієнтів.

Підготувати тестові файли

  1. Створіть нову книгу Excel.
  2. Вставте порожній модуль у редактор VBA (Alt+F11).
  3. Введіть формулу ='[ExternalBook.xlsx]Sheet1'!$A$1 у клітинку A1. Немає необхідності створювати справжній зовнішній файл, просто збережіть цю еталонну структуру.
  4. Збережіть у форматі input_check.xlsm із підтримкою макросів.

Поширені помилки та введення меж

  • Код VBA мовчки скидається під час завантаження файлів із підтримкою макросів за допомогою стандартного load_workbook('input_check.xlsm') і подальшого збереження як .xlsx.
  • Якщо keep_vba=True не вказано під час завантаження, а примусово збережено як .xlsm, Excel може відмовитися відкриватися, оскільки заголовок файлу не відповідає фактичному вмісту.
  • У режимі лише для читання (read_only=True) параметри keep_links і keep_vba недійсні, і будь-яка спроба зберегти характеристики буде невдалою.

Код підтвердження, зарезервований для зовнішніх посилань і макросів

У наступному прикладі побудовано логіку перевірки в пам’яті, щоб продемонструвати роль параметрів.

from io import BytesIO
from zipfile import ZipFile
from openpyxl import Workbook
def inventory(raw):
    with ZipFile(BytesIO(raw)) as z:
        names = set(z.namelist())
    return {"has_vba_part": "xl/vbaProject.bin" in names,
            "external_link_parts": sorted(n for n in names if n.startswith("xl/externalLinks/externalLink") and n.endswith(".xml"))}
out = BytesIO()
Workbook().save(out)
assert inventory(out.getvalue()) == {"has_vba_part": False, "external_link_parts": []}
synthetic = BytesIO()
with ZipFile(synthetic, "w") as z:
    z.writestr("xl/vbaProject.bin", b"not executable VBA; fixture only")
    z.writestr("xl/externalLinks/externalLink1.xml", b"<fixture/>")
result = inventory(synthetic.getvalue())
assert result["has_vba_part"]
assert result["external_link_parts"] == ["xl/externalLinks/externalLink1.xml"]

Цей код є лише навчальним прикладом, а не повним інструментом відновлення файлів і не виконувався в реальному робочому середовищі. Перед запуском переконайтеся, що ви підготували input_check.xlsm, як зазначено вище.

📊 Основне порівняння: параметри за замовчуванням і зарезервовані параметри

параметрзначення за замовчуваннямФункціяКордон
keep_linksTrueЗберегти визначення зв'язку в XMLНемає гарантії, що зовнішні кеші даних залишаться дійсними після повторного зберігання
keep_vbaFalseЗа замовчуванням проєкти VBA не зберігаютьсяВстановлення true не означає, що макроконтент безпечний чи дійсний
read_onlyFalseЗавантаження в режимі лише для читанняУ цьому режимі keep_links і keep_vba неефективні

Критерії прийняття та межі ручного перегляду

Автоматизація не може охопити всі крайні випадки в Excel. Таблиця нижче використовується для розрізнення, які ситуації мають переглядатися скриптами, а які потребують перехоплення або ручної обробки.

СпостереженняЩо слід зробитиі не слід судити
Існує компонент VBAПримітка: містить контент, що потребує окремого переглядуНемає виконання макросів
Компоненти зовнішніх посиланьЗапишіть місцезнаходження всередині пакетаНемає доступу до цілі
Залишити параметри увімкненимиВважайте це стратегією завантаженняЦе не слід вважати доказом виявлення макроелементів

Скрипти можуть перевіряти ефективність параметрів, але не можуть гарантувати, що вихідні файли доступні на бізнес-рівні. Наприклад, keep_links=True успішно зберіг визначення посилання. Якщо цільовий сервер офлайн, користувачі все одно отримуватимуть помилки при оновленні в Excel. Ці питання виходять за межі обов'язків документообробної бібліотеки і потребують ручного перегляду в процесі прийняття.

Джерела

Використовуйте цей чек-лист для перекладу документів

Обробляючи таблиці з формулами та бізнес-кодами, спочатку розрізняйте, який зміст є текстом, а який — формулами, ідентифікаторами та бізнес-кодом, а потім перекладайте. Перевірка після перекладу не лише перевіряє, чи китайська була переведена на цільову мову, а й підтверджує, що формули, ідентифікатори та зв'язки цитування не змінювалися.

OmniDoc (Запис продукту) надає багатоформатні портали перекладу документів, а офіційний вебсайт пропонує OCR, глосарії та двомовні довідкові функції. Для команд, які хочуть почати безпосередньо з файлу, цей шлях можна оцінити за допомогою реальних вибірок. Будь ласка, скористайтеся анонімізованим файлом, який ви дозволили для завантаження, і перевірте результати за допомогою чек-листа в цій статті. Це не означає, що OmniDoc використовує відкриті бібліотеки або внутрішні алгоритми, згадані в цій статті, і не замінює тестування продуктивності продукту прикладами.

🎯 Який метод тобі підходить?

Якщо вам потрібно пакетно робити процесні файли з макросами

Спочатку використовуйте keep_vba=True для уточнення стратегії утримання, а потім порівняйте результати в тестовому середовищі. Не припускайте, що макроси автоматично зберігатимуться.

Якщо ваш Excel містить зовнішні посилання

По-перше, зафіксуйте розташування компонента лінку всередині пакета; не звертайтеся до цільового посилання у скрипті. Після повторного збереження вручну перевірте, чи оновлення нормальне.

Якщо тобі потрібно лише читати дані

Можна розглядати режим лише для читання, але зверніть увагу, що в цьому режимі параметри keep_links і keep_vba є недійсними.

Якщо файл походить від клієнта і містить чутливий контент

Спочатку зберігайте оригінал, використовуйте десенсибілізований зразок для тестування, а потім переглядайте результати відповідно до пунктів прийняття.

❓ Поширені запитання (FAQ)

1. Чи означає keep_links=True означає, що зовнішні посилання завжди доступні?

Ні. keep_links зберігає визначення посилань із XML, але не гарантує, що зовнішні кеші даних залишаться дійсними після повторного зберігання. Оновлення цільової системи все одно може спричинити помилки, коли вона недоступна.

2. Що відбувається з макросами під час завантаження та збереження за замовчуванням?

keep_vba за замовчуванням встановлює False, а VBA-проєкт у оригінальному файлі видаляється при збереженні. Якщо потрібно залишити його, слід чітко встановити keep_vba=True.

3. Якщо виявлено компонент VBA, чи може скрипт визначити, чи є макрос безпечним?

Ні. Наявність компонентів не означає, що вміст безпечний або макроси дійсні; скрипти не повинні виконувати макроси і повинні вимагати подальшого перегляду.

4. Чи можна зберегти посилання та макроси у режимі лише для читання?

Ні. У режимі read_only=True параметри keep_links і keep_vba є недійсними.

📝 Резюме

Перед відновленням Excel спочатку інвентаризуйте VBA та зовнішні пов'язані компоненти, чітко завантажуйте параметри та зберігайте ручні кроки перевірки. Далі ви можете підготувати три файли зразків у тестовому середовищі (чисті дані .xlsx, макрос .xlsm і .xlsx з зовнішніми посиланнями), завантажити та зберегти їх відповідно за стандартними та зарезервованими параметрами, а фактичні результати записати у наведену вище таблицю. Лише коли ви розумієте наслідки кожного параметра у вашому файловому наборі, доцільно розгортати скрипти у виробничий процес.

Досвід зараз: завантажте документ, щоб почати переклад, зберігаючи оригінальне форматування

Оновлено 2026-11-13