You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用xlwings阻止Excel日期自动转换的问题求助

解决xlwings读取Excel时保留日期格式文本原样的问题

针对你遇到的Remarks列(AX列)日期格式内容被自动转换、无法保留"1/8/24"原样的问题,以下是几个可行的解决方案:

方案1:读取时直接获取单元格显示文本(推荐)

如果原始Excel中这些日期已经是被格式化显示为"1/8/24"的单元格,直接读取单元格的显示文本而非底层值,就能精准拿到你看到的内容:

import xlwings as xw

# 打开只读源文件
with xw.Book("source_file.xlsx", read_only=True) as source_book:
    source_sheet = source_book.sheets[0]
    ax_range = source_sheet.range("AX1").expand("down")
    # 提取单元格显示的文本内容
    remarks_data = [cell.api.Text for cell in ax_range]

# 创建新工作簿写入数据
with xw.Book() as new_book:
    new_sheet = new_book.sheets[0]
    # 先将目标列设置为文本格式
    new_sheet.range("AX1").expand("down").api.NumberFormat = "@"
    # 写入处理后的数据
    new_sheet.range("AX1").value = [[item] for item in remarks_data]
    new_book.save("output_file.xlsx")

cell.api.Text会直接返回Excel单元格显示的文本,不管底层是日期序列号还是纯文本,完美匹配你要的"1/8/24"或备注内容。

方案2:将datetime对象格式化为指定字符串后写入

如果读取时仍拿到datetime对象,手动将其格式化为目标样式,再写入文本格式单元格:

import xlwings as xw
from datetime import datetime

with xw.Book("source_file.xlsx", read_only=True) as source_book:
    source_sheet = source_book.sheets[0]
    ax_values = source_sheet.range("AX1").expand("down").value
    processed_remarks = []
    for val in ax_values:
        if isinstance(val, datetime):
            # Windows系统用%-m/-d去掉前导零,Mac用%_m/_d
            formatted = val.strftime("%-m/%-d/%y")
            processed_remarks.append(formatted)
        else:
            processed_remarks.append(val if val is not None else "")

with xw.Book() as new_book:
    new_sheet = new_book.sheets[0]
    new_sheet.range("AX1").expand("down").api.NumberFormat = "@"
    new_sheet.range("AX1").value = [[item] for item in processed_remarks]
    new_book.save("output_file.xlsx")

方案3:模拟手动分列操作

完全还原你手动有效的分列流程,用Excel API实现格式转换:

import xlwings as xw

with xw.Book("source_file.xlsx", read_only=True) as source_book:
    source_sheet = source_book.sheets[0]
    ax_values = source_sheet.range("AX1").expand("down").value

with xw.Book() as new_book:
    new_sheet = new_book.sheets[0]
    # 先写入数据(日期会自动转为Excel日期格式)
    new_sheet.range("AX1").value = [[item] for item in ax_values]
    # 执行分列操作,将列转为文本格式
    ax_range = new_sheet.range("AX1").expand("down")
    ax_range.api.TextToColumns(
        Destination=ax_range.api,
        DataType=xw.constants.XlColumnDataType.xlDelimited,
        FieldInfo=[(1, 2)]  # 第1列设为文本格式(2=xlTextFormat)
    )
    new_book.save("output_file.xlsx")

为什么你之前的方法无效?

  • 直接用str(cell.value):cell.value返回的是datetime对象,str()会将其转为Python默认的日期字符串(如"2024-08-01 00:00:00"),不是目标格式。
  • 先写入再设置NumberFormat="@":此时Excel已将datetime转为日期序列号(如45299),设置文本格式只会显示数字而非原始日期文本。

内容的提问来源于stack exchange,提问作者AlphabetsAlphabets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:43:15