数据读写

不同应用程序之间进行混合编程,数据交换是个很重要的问题。入乡随俗,在哪山唱哪歌。用Python处理Excel数据,需要首先将Excel数据按Python的要求来保存。同样,将Python数据显示到Excel工作表,也要按照Excel的要求来。[大谦Excel,dqexcel点com]

Excel工作表与Python列表之间的数据读写

Excel数据与Python列表之间的读写包括读取Excel数据到Python列表和将Python列表数据写入到Excel工作表。

一、读取Excel数据到Python列表

对于图2-27中工作表内的行数据,将它们读取到Python列表中。

Document Image

图2-27 Excel数据

实现如下:

【xlwings】

code.python
>>> 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】

code.python
>>> 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】

code.python
>>> lst=sht.range("A1:A5").value
>>> lst
[1.0, 2.0, 3.0, 4.0, 5.0]

【xlwings API】

code.python
>>> 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循环把二维元组转换为二维列表或一维列表。下面转换为一维列表:

code.python
>>> 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】

code.python
>>> 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】

code.python
>>> 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所示。

Document Image

图2-28 Python列表数据写入到Excel工作表

如果希望Python列表数据写入到Excel工作表中的某列,分两种情况,一种是列表数据是二维列数据,可直接写入;第二种是列表数据为一维行数据,写入的时候进行转置。

【xlwings】

code.python
>>> import xlwings as xw
>>> bk=xw.Book()
>>> sht=bk.sheets(1)
>>> lst=[[1],[2],[3],[4],[5]]
>>> sht.range("C1").value=lst  #直接写入

code.python
>>> 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】

code.python
>>> 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  #直接写入

code.python
>>> 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所示。

Document Image

图2-29 列数据写入到Excel工作表

将二维列表数据写入到Excel工作表区域中,使用xlwings方式可以使用选项工具指定expand参数的值为"table",指定目标区域左上角的单元格即可写入。使用另外两种方式需要指定满足大小要求的单元格区域。

【xlwings】

code.python
>>> sht.range("A5:B6").value=[[1,2],[3,4]]
>>> sht.range("A1").options(expand="table").value=[[1,2],[3,4]]

【xlwings API】

code.python
>>> 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:

Document Image

图2-30 Excel工作表数据

编写代码如下:

code.python
>>> 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所示。

code.python
>>> 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小节详细介绍,请参阅。