V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
huqay
V2EX  ›  Python

求教 pandas 输出到 Excel,=号如何以正常字符串输出并正确显示

  •  
  •   huqay · 2020-08-15 22:02:36 +08:00 · 2935 次点击
    这是一个创建于 1594 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 python 的 pandas 读取 Excel 表格数据,然后进行处理。对 DataFrame 输出成 Excel,然后用 Excel 打开,面对类似于此种数据时(=61-A106-X20 ),Excel 会默认作为公式显示成计算结果,而无法正确显示为字符串型式,需双击单元格后才能正确显示。求解决办法。 尝试使用此种代码对数据格式进行转换仍有问题:

    writer = pd.ExcelWriter('haha.xlsx', engine='xlsxwriter')
    data_cabling.to_excel(writer, sheet_name='Sheet1')
    
    workbook  = writer.book
    worksheet = writer.sheets['Sheet1']
    
    format1 = workbook.add_format({'num_format': '@'})
    worksheet.set_column('A:BA', 18, format1)
    
    writer.save()
    
    15 条回复    2020-08-19 23:43:18 +08:00
    leschans
        1
    leschans  
       2020-08-15 22:05:40 +08:00 via iPhone
    ‘= 呢
    huqay
        2
    huqay  
    OP
       2020-08-15 22:09:50 +08:00
    @leschans 在 A:BA 列的单元格中
    levelworm
        3
    levelworm  
       2020-08-15 22:10:02 +08:00 via Android
    前面加个单引号试试看,在 Excel 里就是这样。
    huqay
        4
    huqay  
    OP
       2020-08-15 22:12:07 +08:00
    @levelworm 这样是可以显示成字符串,但是输出成 Excel 后打开会是‘=61-A106-X20 还是需要一个一个地双击单元格才可以变成=61-A106-X20 。
    levelworm
        5
    levelworm  
       2020-08-16 02:21:01 +08:00 via Android
    @huqay 问题是 Excel 里就是这样吧,你总得先打单引号,然后他会识别。可能我还是没搞清楚你的需求。。。
    fox1751
        6
    fox1751  
       2020-08-16 08:32:12 +08:00 via iPhone
    @huqay 把一个一个双击单元格的操作,改为分列操作
    huqay
        7
    huqay  
    OP
       2020-08-16 10:05:33 +08:00
    @levelworm 可能确实是 Excel 的问题。
    cassidyhere
        8
    cassidyhere  
       2020-08-16 14:38:13 +08:00 via Android
    pd.read_excel 有个可选参数 parse_cols
    volvo007
        9
    volvo007  
       2020-08-16 22:04:43 +08:00
    如果你把这些公式单元格,转化成 text 类型,它们就不显示公式的运算结果,而是直接把公式放在上面了

    如果方便在 Excel 里面预先操作的,可以把这些单元格转为 text (选中非常简单,全选后 按 F5 然后 special 里面只选择公式单元格即可)

    如果要直接用 py 处理,不清楚类似 xlsxwriter,xlrd 或者其他的库,有没有类似的功能——就是不读取计算后的数据,而只读取原来输入的内容
    volvo007
        10
    volvo007  
       2020-08-16 22:08:03 +08:00
    @volvo007 找到了,是 openpyxl 这个库,可以用 data_only 参数决定读取的是公式本身,还是计算后的结果
    huqay
        11
    huqay  
    OP
       2020-08-17 20:48:49 +08:00
    @volvo007 这个参数是用来读取的方法,不是用来写入的~
    volvo007
        12
    volvo007  
       2020-08-17 21:52:10 +08:00
    @huqay 前面已经提到 cell 格式设置为 string,则按照文字显示而非公式

    openpyxl 里面设置你要写入公式的区域为 string……
    volvo007
        13
    volvo007  
       2020-08-17 22:57:09 +08:00
    @huqay 我翻了下 openpyxl 的手册,半天也没看到保存公式为文本的方法。尽管也有个你用到的 number_format 属性可以设置为 @ ,然而结果还是保存了公式计算后的结果为文本,而不是直接把公式保存为文本……

    但如果公式前面加单引号,一样会遇到需要点一下才能识别为文本的问题……好吧……
    huqay
        14
    huqay  
    OP
       2020-08-19 21:33:37 +08:00
    @volvo007 感觉这个问题无解了。逼我用 VBA ~
    多谢你的解答。
    huqay
        15
    huqay  
    OP
       2020-08-19 23:43:18 +08:00
    万万没想到,我还是解决了这个问题。
    用了一个不太优雅的办法:
    首先人工对原 Excel 文件进行格式设置,把所有单元格设置为文本格式。
    然后使用 xlrd 对文件进行写入,只写入值,不改变格式。然后就可以了~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4796 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:00 · PVG 12:00 · LAX 20:00 · JFK 23:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.