Python编写Excel:openpyxl最大行数解析与实战
Python写excel多少行最多
简介:今天,首席CTO的笔记在这里分享您有关Excel中Python编写的类的最大数量的相关主题,并且不要忘记解决您现在面临的问题,现在就开始这个博客。
不超过100行
最近;我必须帮助一位RA姐妹整理Excel表格。
源数据是4000多个Excel工作表,分布在9个xlsm文件中。
由于文件内容是中英文数据的组合,所以从每个表中提取出必要的部分,并按类别组合成大表。
寻找工具
决定任务后,第一步是找到合适的库。
?PythonExcel是xlrd;尽管列出了xlwt和xlutils软件包
它们都相当老了,而且xlwt在版本07之后甚至不支持excel
它们的文档不是很有帮助。
您可能需要阅读源代码;除了姐姐的工作要求很高之外,学年末没时间仔细读源码。
再搜索一下。
然后参考有人维护openpyxl就可以快速上手,它支持Excel07+,而且文档清晰易读。
安装
这个这很容易,使用pipinstallopenpyxl或哈哈~
因为我不需要处理图像。
头枕未安装。
一些注意事项
每个源文件大约1~2MB,足够小,可以直接读入内存进行处理。
显然他们整个团队都在win下工作,就像我们处理excel一样(所有数据都存储在excel中==,人家主要从事业务工作...);该脚本应该在win<下运行/p>
此任务根本不需要修改现有文件。
羞耻......读取另一个文件;所有您需要做的和编写的
学习使用
好吧,打开cmd并使用pythonshell来玩它。
让我们开始教程吧...(win下没有安装ipython,羞耻)
基本上,您只需导入两个内容即可创建这个小脚本。
fromopenpyxlimportWorkbookfromopenpyxlimportload_workbook
load_workbook,顾名思义,Workbook是最基本的类,用于创建文件并最终将其写入磁盘。
工作
首先我需要导入这个文件
inwb=load_workbook(filename)
你得到的是一个工作簿对象
然后我们需要创建一个新文件
outwb=Workbook()
然后在这个新文件中,使用create_sheet创建多个新工作表;例如
careerSheet=outwb.create_sheet(0,'career')
这将首先在头部插入一个名为career的工作表(即用法与pythonlis类似)。
t的插入)
接下来我需要遍历输入文件的每个工作表并根据表名进行处理(例如,如果表名不是数字,我不需要处理它)。
openpyxl与使用字典具有相同的帮助,通过工作簿get_sheet_names的工作表名称get_sheet_names获取工作表
forsheetNameininwb.get_sheet_names():ifnotsheetName.isdigit():继续
sheet=inwb[sheetName]
拿到sheet后;单击该列。
贺星关心。
为了让openpyxl根据工作表中数据的实际区域获取行和列,可以像列表一样使用方法sheet.rows和sheet.columns。
例如,如果要跳过数据少于2列的表;我可以写
iflen(sheet.columns)2:继续
如果你想得到对于此工作表数据的前两列,除了使用列和行来获取行之外,您还可以
colA,colB=sheet.columns[:2]
。
您还可以使用Excel处理此工作表的列。
获取区域的单元格代码;比如
cells=sheet['A1':'B20']
这有点像excel自带的拉两个的函数。
维区域~
为了方便操作,当您遇到没有C列的工作表时;我想创建一个与A列长度相同的空C列。
然后你可以使用sheet.cell。
如何通过跳过单元格编号并添加空值来跳过新列。
alen=len(colA)foriinrange(1,alen+1):
sheet.cell('C%s'%(i)).value=None
注意:Excel的单元格命名为1~
要获取单元格的值,单元格值(可以是左值或右值);它的类型是字符串;浮点数整数或时间(datetime.datetime)以及相应的数据类型将输出到excel文件中。
获取每个单元格的值后,就可以进行操作了~openpyxl会自动将字符串编码为unicode,所以字符串是unicode类型的。
除了cell.value可以逐个cell修改值;您还可以逐行追加工作表
sheet.append(strA,dateB,numC)
写入最后一个新文件时;只需直接使用workbook.save保存
outwb.save("test.xlsx")
即使它覆盖现有文件。
您之前读入内存的文件。
一些需要注意的事情
在遍历一列中的每个单元格时,如果想得到这个列对象中当前单元格的总和
foridx,cellinenumerate(colA):#dosome...
如果strip()中有单元格
防止检索到的数据两端出现不可见的空格(Excel文件的常见问题)。
如果工作表单元格中没有数据。
openpyxl会将其值设置为None;所以,如果要根据单元格值进行处理,最好使用
ifnotcell.valuecontinue
这样的语句来预先确定其类型。
ifnotcell.value?继续
如果要处理的excel文件中有很多n个。
例如,当你期待手机时间时,有些表中的数据可以是字符串;在这种情况下,您ifisinstance(cell.value,unicode):break
和另一个语句过程。
如果Win下的cmd已经将代码页简化为utf-8。
您可以使用936(GBK),它将自动从unicode转换。
GBK并输出到终端。
处理中文问题的一些小动作
我正在做的图表有一些超出GBK范围的字符;当您需要打印一些信息时,这是非常困难的。
幸运的是,行动取得了进展。
您可以忽略它们,只需用空格替换它们,然后打印。
noyingseperatorsdot=u'\u00b7'dash=u'\u2014'emph=u'\u2022'dot2=u'\u2027'seps=(u'.',dot,dash,emph,dot2)defget_clean_ch_string(chstring):"""中文字符串去除干扰部分。
用法:
cleanstring=get_clean_ch_string(chstring)?"""
cleanstring=chstringforsepinseps:
?cleanstring=cleanstring.replace(sep,u'')returncleanstring
此外,还有一个要求要改变;英文名[空格]中文名英文姓氏,英文名分为中文姓氏和中文名字。
首先,我需要区分英文和中文。
我的做法是经常使用unicode范围内的常用中英文字符。
英语和中文匹配正则模式如下:
#regexpatternmatchingallasciicharactersasciiPattern=ur'[%s]+'%''.join(chr(i)foriinrange(32,127))#regexpatternmatchingallcommonChinesecharactersandseporatorschinesePattern=ur'[\u4e00-\u9fff.%s]+'%(''.join(sep))
英语被替换为ASCII可打印字符范围。
是\u4e00-\u9ffff,这些sep是前面提到的GBK范围之外的字符。
除了简单的划分之外,只有中文名字,没有英文名字。
我们需要处理没有英文名又没有中文名的情况。
判断逻辑如下:
matches=re.match('(%s)(%s)'%(asciiPattern,chinesePattern)name,)ifmatches-?#英文名+中文名
returnmatches.group(1).strip(),matches.group(2).strip()else-
matches=re.findall('(%s)'%(chinesePattern),name)
matches=''.join(matches).strip()ifmatches-?#Chinesenameonly
returnNone,匹配else:?#Englishnameonly
matches=re.findall('(%s)'%(asciiPattern),name)return''.join(matches).strip(),None
获取中文名后,由于该工作不需要姓名,因此需要将其分为姓氏和名字。
需要明确分开;我将坚持普通中文的名字是根据它们的分解方式来划分的——前两个或三个字符是姓氏,四个字符的前两个字符是姓氏,连字符的名字(少数民族名字)前面有。
姓氏。
(这里使用了之前的get_clean_ch_string函数来去除分隔符。
)如果名称较长并且没有分隔符。
整个字符串被假定为一个名称。
(名字的英文名字指姓氏,姓氏指姓氏。
第2333章,WX将返回为姓氏...WXYZ,全名将返回
?asthelastname。
*Ifthenameis..ABC*XYZ...,beforehelastname
will替换中间名。
用法:
chFirstName,chLastName=split_ch_name(chName)?""
iflen(ch名称)4:?#XYorXYZ
chLastName=chName[0]
chFirstName=chName[1:]eliflen(chName)==4:?#WXYZ
?ch姓氏?=chName[:2]
chFirstName=chName[2:]else:?#longer
?cleanName=get_clean_ch_string(chName)
?nameParts=ceanName.split()printu''.join(nameParts)iflen(nameParts)2:?#...WXYZ
returnNone,nameParts[0]
?LastName,chFirstName=nameParts[:2]?#..ABC*XYZ...
returnchFirstName,chLastName
用空格分隔英文名非常简单。
部分是名字;第二部分是姓氏,其余部分暂时可以忽略。
EXCELpython处理超过65536行的Excel表格应该怎么做?2007及更高版本可以添加EXCEL2007或1,048,576行。
2.对于EXCEL2003以下的版本,它有256列和65536行。
对于EXCEL2007,有16384列和1048576行。
需要检查最大行数和列数;您可以使用Ctrl+向下箭头键和向右箭头键。
请开始使用我,不明白。
我也经历过,而且当我改用win32com使用excel时,写起来非常舒服。
您可以在百度搜索
附件是使用xlwt生成excel2003和3007的完美示例~。
PS:花一大笔钱,值了绝对值得。
如果对您有帮助,请采纳。
结论:如果你想进一步了解Python可以编写多少个Excel类,上面CTO笔记介绍的所有主题对大家都有帮助。
记得收藏并关注本站。
python用input只能输入单行文本。那么,如何输入多行文本?
通过使用iter()函数结合输入和for循环,您可以输入多行文本。具体操作如下:在命令行中连续输入多行文本,输入完每行后按回车键。
输入最后一行文本后,再按两次Enter键即可结束输入。
例如:123456789输入结果如下:123456789注意,for循环中使用了forlineiniter(input,'')结构体。
该结构体每次将输入的字符内容赋给一个字符串,并自动在字符串中换行。
当连续输入两次回车键时,会触发异常,表示输入操作结束。