解决使用openpyxl时遇到的坑
作者:景霄之上 发布时间:2022-09-03 09:25:37
最近在用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
填坑:
出现这个问题好久了, 不知道怎么解决, 也去google 和baidu搜索, 一篇文章提到了可能是包冲突的问题, 抱着试一试的心态, 没想到解决了
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() ; 即可避免openpyxl 和lxml 的冲突
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, 经过测试, 此报错解除!
补充:Python—使用Openpyxl的dataframe_to_rows的一个小坑
这个坑说大不大,说小遇到了也头疼。
一般我们把dataframe直接写到Excel文件,直接 df.to_excel即可。不过如果想把多个表格写入同一个工作表呢,那就需要用openpyxl的dataframe_to_rows功能。
看下面一段代码。
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
df1=pd.DataFrame([[1,4],[2,5],[3,6]] ,index=['a','b','c'],columns=['a','b'])
df2=pd.DataFrame([[1,4],[2,5],[3,6],[7,8]] ,index=['d','e','f','g'],columns=['a','b'])
wb=Workbook()
ws=wb.active #打开工作表
#把df1写入工作表
for row in dataframe_to_rows(df1):
ws.append(row)
#换行
ws.append([])
#把df2写入工作表
for row in dataframe_to_rows(df2):
ws.append(row)
wb.save('text.xlsx')
这段代码就是把df1,df2都写入到一个工作表,但一看结果,傻了,怎么标题行和内容之间多了空行啊
看看空行是如何产生的呢
原来多了一个None啊,难怪是空行,目测None是index带来的,那就把index去掉呗
这回None是没有了,但是index的内容也想要显示,怎么办呢,这么办:
哈哈,这样就完美了。这里reset_index的意思就是把index列,变成普通列,比如:
如上图,如果直接reset_index,index列变成普通列,但是列头自动变成了index,这可不好,所以先给index列赋值,也就是df1.index.name=‘code'
最后代码如下
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
df1=pd.DataFrame([[1,4],[2,5],[3,6]] ,index=['a','b','c'],columns=['a','b'])
df2=pd.DataFrame([[1,4],[2,5],[3,6],[7,8]] ,index=['d','e','f','g'],columns=['a','b'])
wb=Workbook()
ws=wb.active #打开工作表
df1.index.name='code1'
df2.index.name='code2'
#把df1写入工作表
for row in dataframe_to_rows(df1.reset_index(),index=False):
ws.append(row)
#换行
ws.append([])
#把df2写入工作表
for row in dataframe_to_rows(df2.reset_index(),index=False):
ws.append(row)
wb.save('text.xlsx')
结果,哈哈,完美
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/weixin_44285988/article/details/103886101


猜你喜欢
- 一 方法汇总在 Python 进程中,有几种方法可以实现数据交互:共享内存:这是一种用于进程间通信的高效方式。多个进程可以访问同一个共享内存
- 当一个应用的数据量大的时候,我们用单表和单库来存储会严重影响操作速度,如mysql的myisam存储,我们经过测试,200w以下的时候,my
- 准备工作创建一个应用添加应用到配置创建一个html编写视图函数from django.shortcuts import render# Cr
- 最近使用pymysql写脚本的情况越来越多了,刚好整理,简单封装一个pymysql的操作类import pymysqlclass Mysql
- 当在设计中我们讨论到,对于一个功能或元素是否应该添加的时候,秉承“如无所需、勿增实体”的原则,我们通常会放弃只有小众/小部分人群才会使用的功
- 一、MySQL Workbench简介MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。
- 本文实例讲述了python网络编程之读取网站根目录的方法,分享给大家供大家参考。具体实现方法如下:import socket, sys po
- 一、urllib 和 urllib2的关系在python2中,主要使用urllib和urllib2,而python3对urllib和urll
- 本文介绍了python opencv之SIFT算法示例,分享给大家,具体如下:目标:学习SIFT算法的概念 学习在图像中查找SIFT关键的和
- 前言subprocess库提供了一个API创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准
- MySQL 5.7.9版本sql_mode=only_full_group_by问题用到GROUP BY 语句查询时com.MySQL.jd
- 但是Class这个东西,如果用得比较少,充其量只是一个大模块的包装方式. 只有大规模地用它来开发,才能显出它对项目管理的优越性来. 所谓的意
- 1.场景问题说明mysql中一般的update写法支持的方式是,update 表 set 字段名=修改后的字段值 where 条件1 and
- 要达到二级名的效果,必须一下条件以及流程:1、必须有一个顶级域名,而且此域名必须做好泛解析并做好指向。2、必须有一台属于你的独立的服务器。泛
- 本文实例为大家分享了React实现表格选取的具体代码,供大家参考,具体内容如下在工作中,遇到一个需求,在表格中实现类似于Excel选中一片区
- 1.按需加载第三方库例如 ElementUI、lodash 等a, 装包npm install babel-plugin-component
- 在记忆里,关于时间方面常的SQL也就下面这两个了,大多数朋友问题中所涉及到的数据库都ACCESS的,在些,也就写出这两SQL了。年代久远,目
- 第一节:WAP的潜能 这些日子,我们常听到WAP技术,一种手机上网的技术。从技术上讲,移动电话不可能和PC来竞争,移动电话的屏幕只能容下很少
- 目录先通过一个实例来了解下接口到底解决什么问题。定义一个接口定义类,继承接口Python 抽象基类的介绍 (PEP3119)软件行业,唯一不
- 使用APPLY运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。 表值函数作为右输入,外部表表达式作为左输入。 通过对右输入求