1, xlwt最多只能寫(xiě)入65536行數(shù)據(jù), 所以在處理大批量數(shù)據(jù)的時(shí)候沒(méi)法使用
2, openpyxl 這個(gè)庫(kù), 在使用的時(shí)候一直報(bào)錯(cuò), 看下面代碼
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')
報(bào)錯(cuò)信息如下
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
有沒(méi)有人知道是什么原因呀? 惆悵!!!
got invalid input value of type class ‘xml.etree.ElementTree.Element'>, expected string or Element
出現(xiàn)這個(gè)問(wèn)題好久了, 不知道怎么解決, 也去google 和baidu搜索, 一篇文章提到了可能是包沖突的問(wèn)題, 抱著試一試的心態(tài), 沒(méi)想到解決了
lxml 這個(gè)包和openpyxl 起沖突, 解決辦法, 先卸掉lxml
pip uninstall lxml
最后運(yùn)行上面處理excel的代碼, 運(yùn)行成功, 無(wú)錯(cuò)誤!!! 困擾了我很長(zhǎng)時(shí)間的問(wèn)題得以解決!!!
由于lxml 包經(jīng)常要用到, 所以每次卸載掉再安裝實(shí)在是麻煩, 所以我有下面的想法
例如下面的代碼, 從數(shù)據(jù)庫(kù)中取數(shù)據(jù)存入表格
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 '區(qū)域',year as '年份',data as '數(shù)據(jù)',unit as '單位' from table where catalog_1 = "農(nóng)業(yè)" 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()
這時(shí)候, 我們不選擇to_excel() 這個(gè)函數(shù), 而是選擇使用to_csv() ; 即可避免openpyxl 和lxml 的沖突
df.to_csv(r'C:\Users\Administrator\Desktop\test.csv',index=False) # 經(jīng)過(guò)驗(yàn)證, 此種方法是行得通的
最后得到的csv 文件用Excel 可以直接打開(kāi), 也可以另存為*.xlsx文件
今天發(fā)現(xiàn)我使用的openpyxl版本是3.0.2, 卸載此版本, 安裝3.0.0版本
最新更新于2020-3-16, 經(jīng)過(guò)測(cè)試, 此報(bào)錯(cuò)解除!
補(bǔ)充:Python—使用Openpyxl的dataframe_to_rows的一個(gè)小坑
一般我們把dataframe直接寫(xiě)到Excel文件,直接 df.to_excel即可。不過(guò)如果想把多個(gè)表格寫(xiě)入同一個(gè)工作表呢,那就需要用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 #打開(kāi)工作表 #把df1寫(xiě)入工作表 for row in dataframe_to_rows(df1): ws.append(row) #換行 ws.append([]) #把df2寫(xiě)入工作表 for row in dataframe_to_rows(df2): ws.append(row) wb.save('text.xlsx')
這段代碼就是把df1,df2都寫(xiě)入到一個(gè)工作表,但一看結(jié)果,傻了,怎么標(biāo)題行和內(nèi)容之間多了空行啊
看看空行是如何產(chǎn)生的呢
原來(lái)多了一個(gè)None啊,難怪是空行,目測(cè)None是index帶來(lái)的,那就把index去掉唄
這回None是沒(méi)有了,但是index的內(nèi)容也想要顯示,怎么辦呢,這么辦:
哈哈,這樣就完美了。這里reset_index的意思就是把index列,變成普通列,比如:
如上圖,如果直接reset_index,index列變成普通列,但是列頭自動(dòng)變成了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 #打開(kāi)工作表 df1.index.name='code1' df2.index.name='code2' #把df1寫(xiě)入工作表 for row in dataframe_to_rows(df1.reset_index(),index=False): ws.append(row) #換行 ws.append([]) #把df2寫(xiě)入工作表 for row in dataframe_to_rows(df2.reset_index(),index=False): ws.append(row) wb.save('text.xlsx')
結(jié)果,哈哈,完美
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
標(biāo)簽:西寧 梅州 錫林郭勒盟 石家莊 文山 昆明 懷化 浙江
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解決使用openpyxl時(shí)遇到的坑》,本文關(guān)鍵詞 解決,使用,openpyxl,時(shí),遇到,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。