不同应用程序之间进行混合编程,数据交换是个很重要的问题。入乡随俗,在哪山唱哪歌。用Python处理Excel数据,需要首先将Excel数据按Python的要求来保存。同样,将Python数据显示到Excel工作表,也要按照Excel的要求来。[大谦Excel,dqexcel点com]
Excel工作表与Python列表之间的数据读写
Excel数据与Python列表之间的读写包括读取Excel数据到Python列表和将Python列表数据写入到Excel工作表。
一、读取Excel数据到Python列表
对于图2-27中工作表内的行数据,将它们读取到Python列表中。
图2-27 Excel数据
实现如下:
【xlwings】
>>> import xlwings as xw
>>> bk=xw.Book()
>>> sht=bk.sheets(1)
>>> lst=sht.range("A1:E1").value #从工作表读取数据
>>> lst
[1.0, 2.0, 3.0, 4.0, 5.0]
【xlwings API】
>>> import xlwings as xw
>>> bk=xw.Book()
>>> sht=bk.api.Sheets(1)
>>> ls=sht.Range("A1:E1").Value #从工作表读取数据
>>> lst
((1.0, 2.0, 3.0, 4.0, 5.0),)
>>> list(lst[0])
[1.0, 2.0, 3.0, 4.0, 5.0]
使用xlwings API方式得到的首先是元组,用list函数转换成列表。
如果Excel数据是列数据,比如第1列中前5个数为1, 3, 5, 7和9,使用xlwings方式和另外两种方式处理得到的结果完全不同。
【xlwings】
>>> lst=sht.range("A1:A5").value
>>> lst
[1.0, 2.0, 3.0, 4.0, 5.0]
【xlwings API】
>>> lst=sht.api.Range("A1:A5").Value
>>> lst
((1.0,), (3.0,), (5.0,), (7.0,), (9.0,))
>>> lst2=[]
>>> for i in range(len(lst)):
lst2.append(list(lst[i]))
>>> lst2
[[1.0], [3.0], [5.0], [7.0], [9.0]]
可见,使用xlwings方式,引用列数据得到的仍然是一维列表;使用其他两种方式,得到的是二维元组。可用for循环把二维元组转换为二维列表或一维列表。下面转换为一维列表:
>>> lst3=[]
>>> for i in range(len(lst)):
lst3.append(list(lst[i][0]))
>>> lst3
[1.0, 3.0, 5.0, 7.0, 9.0]
二、将Python列表数据写入到Excel工作表
把列表数据写入到Excel工作表,在xlwings使用方式下,指定区域的第1个单元格写入即可,使用其他两种方式,需要指定整个区域。下面把一维列表行数据写入到Excel工作表sht中。
【xlwings】
>>> import xlwings as xw
>>> bk=xw.Book()
>>> sht=bk.sheets(1)
>>> lst=[1,2,3,4,5]
>>> sht.range("A1").value=lst #将Python数据写入Excel工作表
【xlwings API】
>>> import xlwings as xw
>>> bk=xw.Book()
>>> sht=bk.sheets(1)
>>> lst=[1,2,3,4,5]
>>> sht.api.Range("A3:E3").Value=lst #将Python数据写入Excel工作表
结果如图2-28所示。
图2-28 Python列表数据写入到Excel工作表
如果希望Python列表数据写入到Excel工作表中的某列,分两种情况,一种是列表数据是二维列数据,可直接写入;第二种是列表数据为一维行数据,写入的时候进行转置。
【xlwings】
>>> import xlwings as xw
>>> bk=xw.Book()
>>> sht=bk.sheets(1)
>>> lst=[[1],[2],[3],[4],[5]]
>>> sht.range("C1").value=lst #直接写入
或
>>> import xlwings as xw
>>> bk=xw.Book()
>>> sht=bk.sheets(1)
>>> lst=[1,2,3,4,5]
>>> sht.range("E1").options(transpose=True).value=lst #转置
【xlwings API】
>>> import xlwings as xw
>>> app=xw.App()
>>> bk=app.books(1)
>>> sht=bk.sheets(1)
>>> lst=[[1],[2],[3],[4],[5]]
>>> sht.api.Range("C1:C5").Value=lst #直接写入
或
>>> import xlwings as xw
>>> app=xw.App()
>>> bk=app.books(1)
>>> sht=bk.sheets(1)
>>> lst=[1,2,3,4,5]
>>> sht.api.Range("E1:E5").Value=app.api.WorksheetFunction.Transpose(lst) #转置
结果如图2-29所示。
图2-29 列数据写入到Excel工作表
将二维列表数据写入到Excel工作表区域中,使用xlwings方式可以使用选项工具指定expand参数的值为"table",指定目标区域左上角的单元格即可写入。使用另外两种方式需要指定满足大小要求的单元格区域。
【xlwings】
>>> sht.range("A5:B6").value=[[1,2],[3,4]]
>>> sht.range("A1").options(expand="table").value=[[1,2],[3,4]]
【xlwings API】
>>> sht.api.Range("A5:B6").Value=[[1,2],[3,4]]
Excel工作表与Python字典之间的数据读写
使用xlwings提供的字典转换器,可以轻松实现Excel数据与Python字典之间的读写操作。下面将图2-30所示的工作表中区域A1:B2和A4:B5内的数据转换为字典。 A4:B5内的数据是行方向,使用transpose参数,设置它的值为True:
图2-30 Excel工作表数据
编写代码如下:
>>> sht=xw.sheets.active
>>> sht.range("A1:B2").options(dict).value
{'A': 1.0, 'B': 2.0}
>>> sht.range("A4:B5").options(dict, transpose=True).value
{'A': 1.0, 'B': 2.0}
也可以反过来,将给定的字典数据写入到Excel工作表。对于下面代码中的字典dic,写入列和写入行后的效果如图2-32所示。
>>> dic={ "a": 1.0, "b": 2.0}
>>> sht.range("A1:B2").options(dict).value=dic
>>> sht.range("A4:B5").options(dict, transpose=True).value=dic
Excel工作表与Python DataFrame之间的数据读写
使用xlwings包,可以实现将Excel工作表数据转换为Python DataFrame数据类型,也可以将一个或多个DataFrame类型数据写入到Excel工作表。这部分内容将在第9章9.3.4小节详细介绍,请参阅。