使用Pandas与XLSXwriter转CSV至XLSX:数字被识别为文本问题
解决CSV转XLSX后数字为文本格式的问题
问题根源
你当前的代码读取CSV时,把第一行作为列名,第二行(单位行)当成了数据行的一部分,导致整列被识别为字符串类型(object),写入Excel后就变成了文本格式的数字,出现绿色三角提示,无法直接制作图表。
解决方案
方法1:用Pandas直接写入(最简单)
利用Pandas的多级表头功能,将前两行(通道名+单位)设为列索引,让Pandas自动识别第三行及以后的数据类型,再直接导出为XLSX:
import pandas as pd # 读取CSV,指定前两行作为多级表头 csv_file = "file.csv" # 注意sep要和你的CSV实际分隔符一致,示例用逗号,你代码里写的是;,根据实际调整 data = pd.read_csv(csv_file, sep=',', header=[0, 1]) # 导出为XLSX,使用xlsxwriter引擎 excel_file_path = r"file.xlsx" with pd.ExcelWriter(excel_file_path, engine='xlsxwriter', options={"nan_inf_to_errors": True}) as writer: data.to_excel(writer, sheet_name='Data', index=False) # 可选:添加图表工作表 chart_sheet = writer.book.add_worksheet("Chart1")
这样导出的XLSX中,数据列会被Excel正确识别为数字类型,单位行保留在表头位置,不会干扰数据格式。
方法2:手动用XlsxWriter写入(自定义控制)
如果需要更精细的控制,先分离表头、单位和数据,再分别写入并指定数据格式:
import pandas as pd import xlsxwriter csv_file = "file.csv" # 先读取所有行,分离表头、单位和数据 with open(csv_file, 'r') as f: lines = f.readlines() # 提取通道名(第一行)和单位(第二行) channel_names = lines[0].strip().split(',') # 分隔符根据实际调整 units = lines[1].strip().split(',') # 读取第三行及以后的数据,转换为数字类型 data_rows = [] for line in lines[2:]: if line.strip(): row = [float(x) if x.replace('.', '', 1).isdigit() else x for x in line.strip().split(',')] data_rows.append(row) # 创建XLSX文件 excel_file_path = r"file.xlsx" workbook = xlsxwriter.Workbook(excel_file_path, {"nan_inf_to_errors": True}) data_worksheet = workbook.add_worksheet() chart_sheet = workbook.add_worksheet("Chart1") # 定义数字格式(确保Excel识别为数字) num_format = workbook.add_format({'num_format': '0.00'}) # 写入通道名(第一行) for col, name in enumerate(channel_names): data_worksheet.write(0, col, name) # 写入单位(第二行) for col, unit in enumerate(units): data_worksheet.write(1, col, unit) # 写入数据(第三行及以后),对数字列应用格式 for row_idx, row in enumerate(data_rows, start=2): for col_idx, val in enumerate(row): if isinstance(val, (int, float)): data_worksheet.write(row_idx, col_idx, val, num_format) else: data_worksheet.write(row_idx, col_idx, val) workbook.close()
关键说明
- 确保
sep参数和你的CSV实际分隔符一致(示例用逗号,你代码里写的是分号,根据真实文件调整)。 - 方法1利用Pandas的类型自动识别,能完美处理数字、布尔值等不同数据类型,是最推荐的方案。
- 方法2适合需要自定义单元格格式、样式的场景,手动区分数据类型并写入。
内容的提问来源于stack exchange,提问作者Yetti
相关产品推荐
相关产品推荐

