如何用Python的win32com保留Excel转CSV时的列格式(如0100)
解决Excel转CSV时前导零丢失的问题
问题根源
CSV格式仅保存单元格的实际值,而非Excel中的显示格式。如果Excel里的单元格是数值类型(比如显示为0100但实际值是100),保存为CSV后就会丢失前导零。要保留前导零,必须先将对应列的单元格设置为文本格式,并确保单元格的实际值是带前导零的字符串。
修改后的代码
以下代码会先将指定列转换为文本格式,重新写入带前导零的内容,再保存为CSV:
import win32com.client as client path = "你的Excel文件路径.xlsx" xl = client.Dispatch("Excel.Application") xl.visible = False xl.Interactive = False wb = xl.Workbooks.Open(Filename=path, ReadOnly=1) # 切换到目标工作表,可替换为具体表名,比如wb.Worksheets("Sheet1") ws = wb.ActiveSheet # 定义需要处理的列号(A列=1,B列=2,以此类推) columns_to_process = [1, 3] for col in columns_to_process: # 选中整列并设置为文本格式 column = ws.Columns(col) column.NumberFormat = "@" # 遍历列中已使用的单元格,将数值转为指定位数的带前导零文本 for cell in column.Cells: if cell.Value is not None and isinstance(cell.Value, int): # 这里按4位补零,可根据实际需求调整格式(比如"{:06d}"对应6位) cell.Value = "{:04d}".format(cell.Value) # 保存为CSV,FileFormat=6是CSV格式的官方常量 wb.SaveAs( Filename="name.csv", FileFormat=6, ) wb.Close(True) xl.Quit()
关键注意事项
- 必须确保单元格的实际值是带前导零的文本,仅靠Excel的自定义显示格式无法让CSV保留前导零。
- 如果知道单元格的范围(比如
A1:A100),可以缩小遍历范围提升效率,替换为ws.Range("A1:A100")。 FileFormat=6是CSV格式的正确数值标识,比字符串"6"更稳妥。
内容的提问来源于stack exchange,提问作者Amine Deflaoui
相关产品推荐
相关产品推荐

