1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import xlwt
import xlrd
from xlutils.copy import copy
#styleBoldRed = xlwt.easyxf('font: color-index red, bold on')
#headerStyle = styleBoldRed
#wb = xlwt.Workbook()
#ws = wb.add_sheet('sheetName')
#ws.write(0, 0, "Col1",headerStyle)
#ws.write(0, 1, "Col2", headerStyle)
#ws.write(0, 2, "Col3",headerStyle)
#wb.save('fileName.xls')
#open existed xls file
oldWb = xlrd.open_workbook("fileName.xls", formatting_info=True)
oldWbS = oldWb.sheet_by_index(0)
newWb = copy(oldWb)
newWs = newWb.get_sheet(0)
inserRowNo = 1
newWs.write(inserRowNo, 0, "value1")
newWs.write(inserRowNo, 1, "value2")
newWs.write(inserRowNo, 2, "value3")
for rowIndex in range(inserRowNo, oldWbS.nrows):
for colIndex in range(oldWbS.ncols):
newWs.write(rowIndex + 1, colIndex, oldWbS.cell(rowIndex, colIndex).value)
newWb.save('fileName.xls')
print "save with same name ok"
Python中的模块也称为库,在Python中 *** 作Excel的模块有很多。
优缺点如下:
**1、Pandas模块**
Pandas是Python的一一个开源数据分析模块,可用于数据挖掘和数据分析,同时也提供数据清洗功能,可以说它是日前Python数据分析的必备工具之一。Pandas能够处理类似电子表格的数据,用于数据快速加载、 *** 作、对齐、合并、数据预处理等。
Pandas通过对Excel文件的读写实现数据输入、输出,Pandas支持.xls和.xlsx格式文件的读写,支持只加载每个表的单一工作页。
import pandas as pd
df=pd.read_excel(r'E:ban.xlsx') #pandas 导入库获取excel表的数据内容
df`
**2、xlwings模块**
xlwings模块可以实现Python中调用Excel,也可以从Excel调用Python,这个模块支持支持.xls和.xlsx格式文件的读写,支持对这类文件的 *** 作,还支持使用VBA,具有强大的转换功能,并且可以处理大部分数据类型。
**3、Xlrd模块**
xlrd模块可以读取Excel文件,其对Excel文件的读取可以实现比较精细的控制。虽然现在使用Pandas模块读取和保存Excel文件往往更加方便快捷,但在某些场景下,依然需要xlrd这种更底层的模块来实现对Excel文件读取的控制。
xlrd模块支持.xls、.xlsx格式文件的读取,但不支持写信息。
**4、xlwt模块**
前面xlrd模块可以读取Excel文件,但不能写。而xlwt模块可以写、可以修改Excel文件,但不能读,且只支持.xls格式文件的写 *** 作。
**5、xlutils模块**
xlutils也是一个处理Excel文件的模块,但它不能对Excel文件进行读和写的 *** 作,但依赖于xlrd模块和xlwt模块。xlutils模块支持.xls格式文件,不支持.xlsx格式文件。
**6、openpyxl模块**
openpyxl模块可以对.xlsx格式的Excel文件进行读写 *** 作,特点是读取快、写入慢,且不能 *** 作.xls格式文件。
**7、xlsxwriter模块**
xlsxwriter模块支持多种Excel功能,可以写.xlsx格式的Excel文件,而且速度快、占用内存空间小,但不支持读或者修改现有的Excel文件。
**8、win32com模块**
win32com模块支持.xls、.xlsx格式的Excel文件的读、写和修改,读写速度快。但win32com模块存在于pywin32的模块中,自身没有完善的文档,使用起来不太方便。
**9、分析总结**
Pandas模块把Excel当作数据读写的容器,为其强大的数据分析服务,因此读写性能的表现中规中矩。xlwings和win32com这两个模块都拥有很好的读写性能,强大的转换器可以处理大部分数据类型,同时,可以在程序运行时,在打开的Excel文件中进行实时 *** 作,实现过程的可视化。另外,xlwings模块的数据结构转换器使其可以快速地为Excel文件添加二维数据结构,而不需要在Excel文件中重定位数据的行和列,因此笔者认为,从读写的便捷性来看,xlwings模块比较好用一些。
xlwingsapi要如何导入起初我发现python的flask模块结合excel函数WEBSERVICE,ENCODEURL可以实现在excel中调用python实现一些功能,比如md5,sha1加密,后来发现python可以直接用xlrd/xlwt这类模块 *** 作excel,但xlrd/xlwt连xlsx都不支持,便转到了openpyxl,openpyxl的缺点是不能在文件打开状态写入,不好调试,文件被写坏了都不知道。于是选择了xlwings这个可以“代替VB成为Excel后台”的插件,个人认为差强人意,最大的缺点是官方文档很多说的并不清楚
xlwings中文文档
插件安装:
xlwings安装使用
安装python
cmd:pip install xlwings
cmd:xlwings addin install
重启excel可以在功能区看到xlwings一栏如图
在这里插入图片描述
建议是用cmd安装,用户文件夹名必须是英文不然xlwings addin install会报错
ps:我安装插件就花了一天,就因为上面这个。xlwings addin install一直失败,百度搜索无果,(中途直接在github里下载插件,虽然插件导入成功,但导入函数会有关于pywin32报错,这是我推荐cmd命令安装的原因)查看报错文件里代码才定位问题,寻法修改为英文,不成,最后还是创建了一个英文账户(无奈~)
如果一切顺利(希望如此) 基本上按照xlwings: *** 作Excel,通过宏调用Pyhton(VBA调Python)[@author qcyfred]一文所述就可以调用python来 *** 作excel啦,
记录我所遇到的坑:
RunPython ("from xw import say_hisay_hi()")
1
1
!!!这我是在其评论区发现的(感谢@longnershot):vba中这段代码里的xw是python文件名,要多加注意
解析json的python代码
主要用到递归思想:
# -*- coding: utf-8 -*-
import copy
import itertools
import json
import urllib.request
import xlwings as xw
import json
from openpyxl.utils import get_column_letter
def pyFunc():
resp = urllib.request.urlopen(
"https://api.bilibili.com/x/v2/reply?pn=2&type=1&oid=455803935&sort=2")
pending_data = json.loads(resp.read())["data"]["replies"]
def getkey(data):
def get_tree_list(data, lst,tr_lsts):
for idx, item in enumerate(data) if isinstance(data, list) else data.items():
_lst = copy.deepcopy(lst)
_lst.append(idx)
if (isinstance(item, dict) and item.keys()) or (isinstance(item, list) and len(item) >0):
get_tree_list(item, _lst, tr_lsts)
else:
tr_lsts.append(_lst)
lst = []
tr_lsts = []
get_tree_list(data, lst, tr_lsts)
return tr_lsts
tl = []
for i in pending_data:
keys = getkey(i)
for j in keys:
jlen = len(j)
if len(list(filter(lambda x: len(x) >= jlen and x[:jlen] == j, tl))) == 0:
for m in range(jlen):
if j[0:m] in tl:
tl.remove(j[0:m])
tl.append(j)
tl.sort()
wb = xw.Book.caller()
sht = wb.sheets[0]
def get_tree_dict(ptl, ptree, pdlen,pcol, prow):
dst =[list(g) for k,g in itertools.groupby(ptl,lambda x:x[pdlen])]
ctree = ptree["child"] = {}
mlen = max(list(map(lambda x: len(x), ptl)))
st=pcol
cdlen = pdlen+1
for ctl in dst:
title = ctl[0][pdlen]
ctd = ctree[title] = {}
cmlen = max(list(map(lambda x: len(x), ctl)))
ccol=st
nst=st+len(ctl)
crow =prow+mlen-cmlen+1
ctd["start"] = get_column_letter(ccol)
ctd["end"] = get_column_letter(nst-1)
rg = sht.range(ctd["start"]+str(prow) +
":"+ctd["end"]+str(crow-1))
rg.merge()
rg.value = title
if cmlen >cdlen:
get_tree_dict(ctl, ctd, cdlen,ccol, crow)
st +=len(ctl)
ptree = {}
get_tree_dict(tl, ptree, 0, 1, 1)
def insertData(cdata, _ptree, xs):
for idx, item in enumerate(cdata) if isinstance(cdata, list) else cdata.items():
_ctree=_ptree["child"][idx]
if (isinstance(item, dict) and item.keys()) or (isinstance(item, list) and len(item) >0):
insertData(item, _ctree,xs)
else:
ys=_ctree["start"]
ye=_ctree["end"]
rg = sht.range(ys+str(xs) +
':'+ye+str(xs))
rg.merge()
rg.value = str(item)
# if isinstance(item, str):
# rg.api.Font.Color = 0x0000FF #b/g/r
# elif isinstance(item, int):
# rg.api.Font.Color = 0xFF0000
# else:
# rg.api.Font.Color = 0x00FF00
tlmlen=max(list(map(lambda x: len(x),tl)))
for i,v in enumerate(pending_data):
insertData(v, ptree,
其中pending_data即为待处理的json,是一个dict列表[{},{},....]
wb = xw.Book.caller() sht = wb.sheets[0] 按照个人需要修改sht 如sht=wb.active等等
修改for idx, item in enumerate(cdata) if isinstance(cdata, list) else cdata.items()以及(isinstance(item, dict) and item.keys()) or (isinstance(item, list) and len(item) >0)可以只对dict类型解析,list则直接转str
调用range api,必须用字符串表示区间:range(“A1:D5”)有效,相对本与之等价的range((1,1),(5,4))无效,openpy.utils中的get_column_letter可以实现列数字转列字符串
# if isinstance(item, str):
# rg.api.Font.Color = 0x0000FF #b/g/r
# elif isinstance(item, int):
# rg.api.Font.Color = 0xFF0000
# else:
# rg.api.Font.Color = 0x00FF00
1
2
3
4
5
6
1
2
3
4
5
6
尾述
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)