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

如何用Pandas read_excel保留货币与百分比的单元格格式信息

读取Excel单元格显示值到DataFrame的解决方案

核心问题在于Pandas的read_excel默认读取的是单元格的底层数值,而非格式化后的显示文本。要捕获带$、%等符号的显示内容,需要直接读取单元格的显示值,以下是几种可行方案:

方案1:用openpyxl直接提取显示文本

openpyxl的单元格对象提供display_value属性,能直接获取单元格格式化后的显示内容,无需依赖Excel客户端,跨平台可用。

import openpyxl
import pandas as pd
import os

# 替换为你的Excel文件目录
file_dir = "path/to/your/excel/files"
all_records = []

for filename in os.listdir(file_dir):
    if not filename.endswith(".xlsx"):
        continue
    file_path = os.path.join(file_dir, filename)
    
    # data_only=False必须设置,否则会忽略格式只取计算后的值
    wb = openpyxl.load_workbook(file_path, data_only=False)
    ws = wb.active
    
    # 提取表头
    headers = [cell.display_value for cell in ws[1]]
    # 提取数据行
    for row in ws.iter_rows(min_row=2):
        row_content = [cell.display_value for cell in row]
        all_records.append(row_content)

# 合并为DataFrame
merged_df = pd.DataFrame(all_records, columns=headers)

方案2:用xlwings读取显示值

xlwings直接和本地Excel交互,能精准获取单元格的显示内容,适合有Excel客户端的Windows/macOS环境,代码更简洁直观。

import xlwings as xw
import pandas as pd
import os

file_dir = "path/to/your/excel/files"
all_records = []

# visible=False让Excel在后台运行,不弹出界面
with xw.App(visible=False) as app:
    for filename in os.listdir(file_dir):
        if not filename.endswith((".xlsx", ".xls")):
            continue
        file_path = os.path.join(file_dir, filename)
        
        wb = xw.Book(file_path)
        ws = wb.sheets[0]
        
        # 一次性获取整个工作表的显示值,自动转成二维列表
        sheet_data = ws.range("A1").expand().value
        headers = sheet_data[0]
        data_rows = sheet_data[1:]
        all_records.extend(data_rows)

merged_df = pd.DataFrame(all_records, columns=headers)

方案3:延续unoconv转换方案

如果是无Excel客户端的Linux服务器环境,unoconv将Excel转成CSV/ODS格式是可行的——转换后的文件会保留格式化后的显示文本,再用Pandas读取即可:

# 单个文件转换
unoconv -f csv your_excel_file.xlsx

# 批量转换(可结合shell循环)
for file in *.xlsx; do unoconv -f csv "$file"; done

转换完成后用Pandas读取CSV:

import pandas as pd
import os

file_dir = "path/to/converted/csv/files"
all_dfs = []

for filename in os.listdir(file_dir):
    if filename.endswith(".csv"):
        df = pd.read_csv(os.path.join(file_dir, filename))
        all_dfs.append(df)

merged_df = pd.concat(all_dfs, ignore_index=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:30:55