Python *** 作Excel,怎么插入一行或一列

Python  *** 作Excel,怎么插入一行或一列,第1张

就是把插入行之后值重新输出来。

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

尾述


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11405894.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存