使用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
相关产品推荐
相关产品推荐

