使用openpyxl时遇到的坑

最近在用python处理Excel表格是遇到了一些问题
  • 1, xlwt最多只能写入65536行数据, 所以在处理大批量数据的时候没法使用
  • 2, openpyxl 这个库, 在使用的时候一直报错, 看下面代码
from openpyxl import Workbook
import datetime

wb = Workbook()
ws = wb.active 
ws['A1'] = 42  
ws.append([1,2,3]) 
ws['A2'] = datetime.datetime.now()
wb.save('test.xlsx')
  • 报错信息如下

File "src\lxml\serializer.pxi", line 1652, in lxml.etree._IncrementalFileWriter.write TypeError: got invalid input value of type <class 'xml.etree.ElementTree.Element'>, expected string or Element

  • 有没有人知道是什么原因呀? 惆怅!!!
  • got invalid input value of type <class ‘xml.etree.ElementTree.Element’>, expected string or Element
填坑:
  • 出现这个问题好久了, 不知道怎么解决, 也去googlebaidu搜索, 一篇文章提到了可能是包冲突的问题, 抱着试一试的心态, 没想到解决了
  • lxml 这个包和openpyxl 起冲突, 解决办法, 先卸掉lxml
  • pip uninstall lxml
  • 最后运行上面处理excel的代码, 运行成功, 无错误!!! 困扰了我很长时间的问题得以解决!!!
还有另一种方法:
  • 由于lxml 包经常要用到, 所以每次卸载掉再安装实在是麻烦, 所以我有下面的想法
  • 例如下面的代码, 从数据库中取数据存入表格
import pymysql
import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://user:password@ip:port/database",encoding='utf-8')

sql = """SELECT catalog_1 as '目录一',catalog_2 as '目录二',catagory as '目录三',
        region as '区域',year as '年份',data as '数据',unit as '单位' from table
        where catalog_1 = "农业" limit 100
"""
df = pd.read_sql_query(sql, con=engine)


# writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test.xlsx')
# df.to_excel(writer)
# writer.save()
  • 这时候, 我们不选择to_excel() 这个函数, 而是选择使用to_csv() ; 即可避免openpyxllxml 的冲突
df.to_csv(r'C:\Users\Administrator\Desktop\test.csv',index=False)
# 经过验证, 此种方法是行得通的
  • 最后得到的csv 文件用Excel 可以直接打开, 也可以另存为*.xlsx文件
最终解决办法
  • 今天发现我使用的openpyxl版本是3.0.2, 卸载此版本, 安装3.0.0版本
  • 最新更新于2020-3-16, 经过测试, 此报错解除;
  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值