Excel中不存在\_VALIGN属性,垂直居中必须使用VerticalAlignment标准接口:VBA用xlCenter或-4108,xlwings用-4108,openpyxl用Alignment(vertical="center")。

Excel 中没有名为 _VALIGN 的公开属性,直接设置该字段会报错或被忽略。垂直居中必须通过标准对齐接口实现,不是靠手动赋值内部字段。
为什么找不到 _VALIGN 或设置无效
Excel 对象模型(如 Range、Cell)不暴露 _VALIGN 这类底层私有字段。它可能是某些旧版 VBA 插件、第三方库(如早期 xlwings 0.x 版本)的非标准别名,或用户误记了 VerticalAlignment。直接访问或赋值 _VALIGN 会导致:
-
AttributeError(Python + openpyxl / xlwings) -
Run-time error '1004'(VBA 中尝试写入不存在的属性) - 静默失败:值被丢弃,单元格对齐无变化
VerticalAlignment 才是正确属性名(VBA / xlwings / openpyxl)
所有主流 Excel 自动化工具都用 VerticalAlignment 控制垂直对齐,值为常量而非字符串:
- VBA:
Range("A1").VerticalAlignment = xlCenter - xlwings(Python):
sheet.range("A1").api.VerticalAlignment = -4108(-4108是xlCenter的数值) - openpyxl(Python):
cell.alignment = Alignment(vertical="center"),注意这里是字符串"center",不是数字
⚠️ 不要写成 cell._VALIGN = "center" —— openpyxl 根本没有这个属性;也不要传 "xlCenter" 字符串给 xlwings,它只认整数。
常见错误场景与修复
以下操作看似合理,实则容易出错:
- 在 openpyxl 中写
cell.alignment.vertical = "center"→ 错!alignment是只读属性,必须新建Alignment实例并整体赋值 - 用 xlwings 设置整列但忘了激活工作表:
sheet.range("A:A").api.VerticalAlignment = -4108可能不生效,加sheet.api.Activate()更稳妥 - VBA 中混用常量名和数值:
xlCenter需提前声明或用-4108,否则报Compile error: Variable not defined - WPS 表格兼容模式下,部分 VBA 常量值不同,建议统一用数值
-4108提高兼容性
批量设置时性能差异明显
一次性设整列/整行比循环每个单元格快得多,但要注意范围边界:
- ✅ 推荐:
sheet.range("A1:C100").api.VerticalAlignment = -4108(xlwings) - ❌ 避免:
for cell in sheet.range("A1:C100"): cell.api.VerticalAlignment = -4108(慢 50 倍以上) - openpyxl 同理:先构建
Alignment实例,再用worksheet.column_dimensions["A"].alignment = ...只影响列默认值,不会覆盖已有单元格设置
真正容易被忽略的是:openpyxl 的 alignment 不继承。即使设置了列默认对齐,已写入内容的单元格仍保持原对齐方式,必须显式遍历或重设范围。

















