Não salve novamente o Excel fornecido diretamente pelo cliente: verifique primeiro os links externos
keep_vba=True é uma política de retenção, não uma evidência de "macro detectada". O seguinte verifica apenas se o pacote ZIP existe vbaProject.bin e componentes de link externo; a presença de componentes não significa que o conteúdo seja seguro, que as macros sejam válidas ou que os alvos externos sejam acessíveis. Macros não serão executadas nem links visitados.
O Excel enviado pelo cliente abre normalmente localmente, mas após ser processado por um script Python ou carregado no sistema, a fórmula pode mudar para #REF!, o menu suspenso desaparece ou até mesmo não pode ser aberto. Geralmente, isso não é uma corrupção do arquivo, mas sim uma ferramenta automatizada que não preservou o cache do link externo ou as macros VBA intactas ao salvar novamente.
Este artigo foi escrito para desenvolvedores e operadores que precisam usar scripts para processar em lote o Excel. A seguir irá explicar quais informações serão perdidas pelo carregamento padrão do openpyxl, dar uma ideia de inspeção de amostra sintética e listar os limites que requerem revisão manual durante a aceitação. Depois de ler isto, você será capaz de determinar o que precisa ser verificado antes de um documento ser salvo.
Conclusão em uma frase: Faça um inventário de links externos e componentes VBA antes de salvar novamente o Excel
Primeiro, confirme se há projetos VBA e componentes de link externo no pacote de arquivos, depois decida sobre os parâmetros de carregamento e mantenha o processo de revisão manual durante a aceitação.
| sua situação | Práticas recomendadas | razão |
|---|---|---|
| O pacote de arquivos está localizado em vbaProject.bin | Avise que contém conteúdo que precisa ser revisado separadamente e a macro não será executada. | A presença de um componente não significa que a macro seja válida ou que o conteúdo seja seguro |
| Existem componentes de link externo no pacote de arquivos | Registra sua localização dentro do pacote, não acessa o alvo | O script apenas faz inventário e não verifica se o destino está acessível. |
| Carregar com keep_vba=True | Pense nisso como uma estratégia de carregamento | keep_vba=True é uma política de retenção, não uma evidência de detecção de macro |
##Por que o carregamento padrão perderá informações importantes
A documentação oficial do openpyxl afirma que load_workbook tem limites claros para o processamento de dados não celulares. O padrão keep_links é True, que retém a definição do link em XML, mas não garante que o cache de dados externo (valores em cache) ainda será válido após o recarregamento. Depois de sair do ambiente de rede original ou do caminho do arquivo de origem, o Excel ainda poderá relatar um erro durante a atualização.
keep_vba é padronizado como False. Se o arquivo original contiver macros, o projeto VBA será removido após carregar e salvar por padrão. Objetos como gráficos e formas também podem ser ignorados durante a leitura.
Estes não são bugs, mas limites funcionais da própria biblioteca. Ao trabalhar com arquivos de nível de produção, você deve declarar explicitamente uma política de retenção em vez de presumir que a ferramenta reterá automaticamente todos os recursos.
Exemplos sintéticos e preparação de arquivos de teste
Para demonstrar este mecanismo com segurança, recomenda-se construir um cenário sintético que não dependa de dados reais do cliente.
Preparar arquivos de teste
- Crie uma nova pasta de trabalho do Excel.
- Insira um módulo em branco no editor VBA (Alt+F11).
- Insira a fórmula
='[ExternalBook.xlsx]Sheet1'!$A$1na célula A1. Não há necessidade de criar um arquivo externo real, apenas mantenha esta estrutura de referência. - Salve no formato habilitado para macro
input_check.xlsm.
Erros comuns e entrada de limites
- O código VBA é descartado silenciosamente ao carregar arquivos habilitados para macro usando o
load_workbook('input_check.xlsm')padrão e depois salvá-los como.xlsx. - Se
keep_vba=Truenão for especificado durante o carregamento, mas for salvo à força como.xlsm, o Excel poderá se recusar a abrir porque o cabeçalho do arquivo não corresponde ao conteúdo real. - No modo somente leitura (
read_only=True), os parâmetroskeep_linksekeep_vbasão inválidos e qualquer tentativa de preservar as características falhará.
Código de verificação reservado para links externos e macros
O exemplo a seguir constrói lógica de verificação na memória para demonstrar a função dos parâmetros.
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"]
Este código é apenas um exemplo de ensino, não uma ferramenta completa de reparo de arquivos e não foi executado em um ambiente de produção real. Certifique-se de ter input_check.xlsm preparado conforme acima antes de executar.
📊 Comparação principal: parâmetros padrão e parâmetros reservados
| parâmetro | valor padrão | efeito | limite |
|---|---|---|---|
| manter_links | Verdadeiro | Preservar definições de link em XML | Não é garantido que o cache de dados externo seja válido após recarregar |
| keep_vba | Falso | Projetos VBA não são retidos por padrão | Definir como True também não significa que o conteúdo da macro seja seguro ou válido |
| read_only | False | Carregar em modo somente leitura | keep_links e keep_vba são inválidos neste modo |
Critérios de aceitação e limites de revisão manual
A automação não pode cobrir todos os casos extremos do Excel. A tabela a seguir é usada para distinguir quais situações são entregues ao inventário de script e quais situações requerem interceptação ou processamento manual.
| observar | o que fazer | não deve ser inferido |
|---|---|---|
| O componente VBA existe | O prompt contém conteúdo que requer revisão adicional | Não execute macro |
| widget de link externo | Registre a localização dentro do pacote | Não acesse o alvo |
| Manter os parâmetros ativados | considerada como estratégia de carregamento | Não considerado como evidência de que uma macro foi detectada |
O script pode verificar se os parâmetros são válidos, mas não pode garantir que o arquivo de saída esteja disponível no nível comercial. Por exemplo, keep_links=True retém com êxito a definição de link. Se o servidor de destino estiver offline, o usuário ainda receberá um erro ao atualizar no Excel. Tais questões estão além do escopo da biblioteca de processamento de documentos e exigem revisão manual no processo de aceitação.
Referências
Use esta lista de verificação para tradução de documentos
Ao processar tabelas contendo fórmulas e códigos comerciais, primeiro distinga quais conteúdos são texto e quais são fórmulas, identificadores e códigos comerciais e, em seguida, traduza-os. A verificação pós-tradução não apenas verifica se o chinês foi convertido para o idioma de destino, mas também confirma se as fórmulas, identificadores e relações de referência não foram alteradas.
OmniDoc (portal de produtos) fornece um portal de tradução de documentos multiformato e o site oficial apresenta funções de OCR, glossário e comparação bilíngue. Para equipes que desejam começar a trabalhar diretamente a partir de arquivos, esse caminho pode ser avaliado com exemplos reais. Use arquivos dessensibilizados que você tem permissão para carregar e use os itens de verificação neste artigo para revisar os resultados. Não há nenhuma alegação de que o OmniDoc use as bibliotecas de código aberto ou algoritmos internos mencionados neste artigo, nem o exemplo substitui o teste de desempenho do produto.
🎯 Qual método é adequado para você?
Se você precisar processar em lote arquivos contendo macros
Primeiro use keep_vba=True para esclarecer a política de retenção e, em seguida, compare os resultados de saída no ambiente de teste. Não presuma que as macros serão retidas automaticamente.
Se o seu Excel contém links externos
Registre primeiro a localização do componente do link no pacote e não acesse o destino do link no script. Após salvar novamente, confirme manualmente se a atualização está normal.
Se você só precisa ler os dados
O modo somente leitura pode ser considerado, mas esteja ciente de que os parâmetros keep_links e keep_vba são inválidos neste modo.
Se o arquivo vier de um cliente e contiver conteúdo confidencial
Guarde primeiro os originais, use amostras dessensibilizadas para teste e depois revise os resultados de acordo com os itens de aceitação.
❓ Perguntas frequentes (FAQ)
1. keep_links=True significa que links externos devem estar disponíveis?
não. keep_links mantém a definição do link em XML. Não há garantia de que o cache de dados externo ainda será válido após o novo armazenamento em cache. A atualização ainda pode relatar um erro quando o destino estiver inacessível.
2. O que acontecerá com a macro se ela for carregada e salva por padrão?
O padrão de keep_vba é False e o projeto VBA no arquivo original será removido ao salvar. Se a retenção for necessária, keep_vba=True deverá ser definido explicitamente.
3. O componente VBA foi detectado. O script pode determinar se a macro é segura?
não pode. A existência do componente não significa que o conteúdo seja seguro ou que a macro seja válida. O script não deve executar a macro e deve solicitar que ela seja revisada separadamente.
4. Links e macros podem ser preservados no modo somente leitura?
não pode. No modo read_only=True, os parâmetros keep_links e keep_vba não têm efeito.
📝 Resumo
Antes de salvar novamente o Excel, faça um inventário do VBA e dos componentes do link externo, esclareça os parâmetros de carregamento e mantenha o processo de revisão manual. Na próxima etapa, você pode preparar três arquivos de amostra (dados puros .xlsx, macros .xlsm e links externos .xlsx) no ambiente de teste, carregá-los e salvá-los com parâmetros padrão e parâmetros reservados, respectivamente, e registrar os resultados reais de acordo com a tabela acima. Somente se você souber as consequências de cada parâmetro em seu conjunto de arquivos será apropriado implantar o script no processo de produção.
Experimente agora: carregue o documento para iniciar a tradução, mantendo o layout original


