Не зберігайте повторно 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 буде видалено після завантаження та збереження за замовчуванням. Такі об’єкти, як діаграми та фігури, також можуть ігноруватися під час читання.
Це не баги, а функціональні межі самої бібліотеки. Працюючи з файлами робочого рівня, вам слід явно оголосити політику збереження, а не припускати, що інструмент автоматично збереже всі функції.
Синтетичні приклади та підготовка тестового файлу
Щоб безпечно продемонструвати цей механізм, рекомендується побудувати синтетичний сценарій, який не покладається на дані реальних клієнтів.
Підготувати тестові файли
- Створіть нову книгу Excel.
- Вставте порожній модуль у редактор VBA (Alt+F11).
- Введіть формулу
='[ExternalBook.xlsx]Sheet1'!$A$1у клітинку A1. Немає необхідності створювати справжній зовнішній файл, просто збережіть цю еталонну структуру. - Збережіть у форматі
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_links | True | Зберегти визначення зв'язку в XML | Немає гарантії, що зовнішні кеші даних залишаться дійсними після повторного зберігання |
| keep_vba | False | За замовчуванням проєкти VBA не зберігаються | Встановлення true не означає, що макроконтент безпечний чи дійсний |
| read_only | False | Завантаження в режимі лише для читання | У цьому режимі 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 з зовнішніми посиланнями), завантажити та зберегти їх відповідно за стандартними та зарезервованими параметрами, а фактичні результати записати у наведену вище таблицю. Лише коли ви розумієте наслідки кожного параметра у вашому файловому наборі, доцільно розгортати скрипти у виробничий процес.
Досвід зараз: завантажте документ, щоб почати переклад, зберігаючи оригінальне форматування


