今天学习了下xlwings这个库,目的是为了让计算机自动化操作excel表,当某天需要做一些很繁琐的事情,就可以派上用场啦。
网上刮来的图,很好。
- 大概就是xlwings中可以有多个excel程序。
- 一个excel程序中可以有多个工作簿。
- 一个工作簿中可以有多张表格。
- 一张表格中的内容就看你写什么了。
####1.包肯定是要导入的
import xlwings as xw
#####2. 先创建一个app对象,就是打开一个excel程序。
>>>app = xw.App(visible=True,add_book=True)
>>>app
<Excel App 39156>
#####提醒:
- 创建一个excel程序,默认会创建一个工作簿(book对象)。
- 里面主要的两个参数,visible可不可见,add_book添不添加book,默认 都是 True 。
看下app有什么方法
[ 'activate', 'api', 'books', 'calculate', 'calculation',
'display_alerts', 'hwnd', 'impl', 'kill', 'macro', 'pid', 'quit', 'range',
'screen_updating', 'selection', 'version', 'visible']
-
activate(steal_focus=False)
:激活工作簿,里面有个参数,steal_focus,默认为False,选择True时,会获取工作簿的焦点。 -
api
:应该是返回本地对象所使用引擎,我是window的office就跟下图的结果.
-
books
:所有book对象的集合。 -
calculate()
:计算所有打开的books。 -
calculation
:选择或设置计算模式:manual(手动),automatic(自动)semiautomatic(半自动)。 -
display_alerts
:默认值为True,但为False时:当excel响应,会选择默认响应。 -
hwnd
:返回window的句柄。 -
kill()
:终止进程,强制退出。 -
macro(name)
:python调用excel中的自定义的Sub和function。 -
pid
:返回app的pid。 -
quit()
:在不保存的情况下,退出excel程序。 -
range
:获取当前工作簿中的当前表格中的范围。
-
screen_updating
:屏幕更新,就是说你在excel表中的操作会实时更新,关闭实时更新可以加快脚本运行。默认是True。 -
selection
:将所选定的单元格(cells)以Range对象返回。
-
version
:显示xlwings版本。 -
visiable
:设置可不可见,默认是True。
####3. app中的book对象
我们就用刚刚app中创建的book对象
>>>wb = app.books[0]
>>>wb
<Book [工作簿1]>
当然也可以这样创建book对象
>>>wb =xw.Book()
比较下两种创建对象方式
| | xw.Book | xw.books |
| ------ | :-----: | :----: |
| 创建工作簿 | xw.Book()
| xw.books.add()
|
| 还没保存的工作簿 | xw.Book('Book1')
| xw.books['Book1']
|
| 根据路径打开工作簿 | xw.Book(r'C:/path/to/file.xlsx')
| xw.books.open(r'C:/path/to/file.xlsx')
|
|已经打开的book数量||xw.books.count
|
在来看看book对象有什么方法
['activate', 'api', 'app', 'caller', 'close',
'fullname', 'impl', 'macro', 'name','names',
'open_template', 'save', 'selection', 'set_mock_caller', 'sheets']
-
activate(steal_focus=False)
:激活book,可以选择获不获取焦点。 -
api
:返回正在使用的引擎的本地对象。 -
app
:返回创建这个book的app对象。 -
caller()
:当通过runpython从excel中调用python函数时,引用这个book,还会将其打包成excel中的函数。
例子:
import xlwings as xw
def my_macro():
wb = xw.Book.caller()
wb.sheets[0].range('A1').value = 1
当需要在调试的时候可以使用xw.set_mock_caller()函数。
*close()
:在没有保存的情况下关闭。
*fullname
:以字符串的形式返回对象的名称跟路径。
-
macro
(name):python调用excel中的自定义的Sub和function。 -
name
:返回book的名称。 -
names
:返回一个Names对象集合。 -
open_template
:创建一个已经包含xlwings VBA模块的Excel文件(必须从交互式python shell中调用此方法) -
save(path=None)
:保存工作簿,若为指定路径,保存在当前工作目录。 -
selection
:将所选定的单元格(cells)以Range对象返回。 -
set_mock_caller
:设置用于调试caller()的excel文件,可以直接在python里运行。
例子:
def my_macro():
sht = xw.Book.caller().sheets[0]
sht.range('A1').value = 'Hello xlwings!'
if __name__ == '__main__':
xw.Book().set_mock_caller()
my_macro()
调用函数会在A1格子上打印,hello xlwings.
- sheets:返回所有的工作表(sheet)的集合。
4.book中的sheet对象
同样的,我们使用上面那个book对象。
>>>sht = wb.sheets[0]
>>>sht
<Sheet [工作簿1]Sheet1>
看下sheet中有什么方法
['activate', 'api', 'autofit', 'book', 'cells',
'charts', 'clear', 'clear_contents', 'delete',
'impl', 'index', 'name', 'names', 'pictures',
'range', 'select', 'shapes', 'used_range']
-
activate(steal_focus=False)
:激活sheet,并返回,可以选择获不获取焦点。 -
api
:返回正在使用的引擎的本地对象。 -
autofit(axis=None)
:自动调整表中的行,列或两者的宽度
wb.sheets[0].autofit(axis=‘r’):自动匹配行
wb.sheets[0].autofit(axis= ‘c’)自动匹配列
wb.sheets[0].autofit() -
book
:返回创建这个表格的book对象。 -
cells
:返回表示Sheet上所有单元格的Range对象(不仅仅是当前使用的单元格)。 -
charts
:sheet中的所有图表集合。 -
clear()
:清除整个sheet的内容和格式。 -
clear_contents()
:清除整个sheet的内容,但格式还在。 -
delete()
:删除sheet。 -
index
:返回sheet的索引。 -
name
:获取或设置sheet的名字。 -
names
:返回一个Names对象集合。 -
pictures
:返回所有Pictures对象的集合。 -
range(cell1,cell2=None)
:在活动的sheet中返回一个Range对象。 -
select()
:选择工作表。 -
shapes
:返回所有Shapes对象的集合。 -
used_range
:返回sheet中所有使用过的Range。
5.sheet中Range对象
选了A1单元格
>>>r = sht.range(‘A1’)
>>>r
<Range [工作簿1]Sheet1!$A$1>
看看Range对象的方法
[ 'add_hyperlink', 'address', 'api', 'autofit', 'clear', 'clear_contents',
'color', 'column', 'column_width', 'columns', 'count', 'current_region', 'end',
'expand', 'formula', 'formula_array', 'get_address', 'height', 'hyperlink',
'impl', 'last_cell', 'left', 'name', 'number_format', 'offset', 'options',
'raw_value', 'resize', 'row', 'row_height', 'rows', 'select', 'shape', 'sheet',
'size', 'top', 'value', 'width']
-
add_hyperlink(address, text_to_display=None, screen_tip=None):
在单元格上添加超链接。
address:‘超链接地址’。
text_to_display:在单元格上显示的文本。
screen_tip:当鼠标悬停时,出现的提示。
-
address
:以字符串的形式返回范围
>>> r.address
‘$A$1’
返回了我们A1这个单元格的名称。 -
api
:返回正在使用的引擎的本地对象。 -
autofit()
:
自动调整Range内所有单元格的宽度和高度
自动调整列宽:xw.Range(‘A2:G9’).columns.autofit()
自动调整行宽:xw.Range(‘A2:G9’).rows.autofit() -
clear()
:删除Range里的内容和格式。 -
clear_contents()
:删除Range里的内容,保留格式。 -
color
:获取或者设置范围里单元额的背景颜色。
设置颜色时,可以使用RGB元组,就像下面这样。
>>> r.color = (0,23,234)
-
column
:返回Range对象的第一列编号。
-
column_width
:获取或设置Range的宽度。
如果范围中的所有列具有相同的宽度,则返回宽度。
如果范围中的列具有不同的宽度,则返回None。 -
columns
:返回一个RangeColumns对象,该对象表示指定范围内的列. -
count
返回单元格数量 -
current_region
:返回一个Range对象。选取的范围跟在window中Ctrl- *
一样。 -
end(direction):
返回一个Range对象。相当于window中的Ctrl+Up
,Ctrl+down
,Ctrl+left
, 或Ctrl+right
. -
expand(mode='table')
:根据选定的模式,扩展范围。
A1单元格选择’right’会扩展成A1~B1。
A1单元格选择down会扩展成A1~A2。>>> import xlwings as xw >>> wb = xw.Book() >>> xw.Range('A1').value = [[None, 1], [2, 3]] >>> xw.Range('A1').expand().address $A$1:$B$2 >>> xw.Range('A1').expand('right').address $A$1:$B$1 >>>xw.Range('A1').expand('down').address $A$1:$A$2
-
formula
:获取或设置Range的公式。
>>> app.range('A4').formula`
'=SUM(A1:A3)'
formula_array
:获取或设置给定Range的数组公式。get_address(row_absolute=True, column_absolute=True, include_sheetname=False, external=False)
:
>>> r.get_address()
'$A$1'
row_absolute :布尔型, 默认为True
设置成False,将不会在地址上返回行的名称。
>>> r.get_address(row_absolute=False)
'$A1'
column_aosolute:布尔型, 默认为True
设置成false,将不会在地址上返回列的名称。
>>> r.get_address(column_absolute=False)
'A$1'
include_sheetname:布尔型,默认为False
设置成True,会在地址上返回表名。
>>> r.get_address(True,True,True)
'Sheet1!$A$1'
external :布尔型, 默认为False
设置成True,会在地址上返回工作簿和表的名称。
>>> r.get_address(external=True)
'[工作簿1]Sheet1!$A$1'
height
:返回Range的高度。hyperlink
: 返回指定Range的超链接地址(仅限单个单元格)
>>> import xlwings as xw
>>> wb = xw.Book()
>>> xw.Range('A1').value
'www.xlwings.org'
>>> xw.Range('A1').hyperlink
'http://www.xlwings.org'
如果单元格里没有超链接会报错。
last_cell
:返回指定Rnage右下角的单元格(只读)
>>> app.range('A1','C3').last_cell
<Range [工作簿1]Sheet1!$C$3>
left
:返回从第一列到Range第一列的距离。
>>> app.range('C1','C3').left
108.0
如果我把第一列拉长
>>> app.range('C1','C3').left
138.0
-
name
:设置或获取Range的名称。 -
number_format
:获取或设置Range的内容格式。 -
offset(row_offset=0, column_offset=0)
:返回一个偏移后的Range
现在是第一行,第一列
>>> r
<Range [工作簿1]Sheet1!$A$1>
A1偏移到右下角,B2
>>> r.offset(1,1)
<Range [工作簿1]Sheet1!$B$2>
A1偏移到下一行,A2
>>> r.offset(1,0)
<Range [工作簿1]Sheet1!$A$2>
也可以输入负数,例如offset(-1,-1):偏移到左上方一个单元格。
options(convert=None, **options)
: 允许设置转换器及其选项. 返Range对象。
参数:
ndim: int类型,维数,比如ndim=1,ndim=2。
numbers:数字类型:比如numbers=int,numbers=float。
>>> app.range('A1','C3').value
[[1.0, 2.0, 3.0], [3.0, 3.0, 3.0], [3.0, 3.0, 3.0]]
>>> app.range('A1','C3').options(numbers=int).value
[[1, 2, 3], [3, 3, 3], [3, 3, 3]]
empty:object,空单元格的转换 。
transpose: 默认为False,转置Range的values。
设置为True,会把矩阵转置了在来获取value。
>>> app.range('A1','C3').options(transpose=Flase) .value
[[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 9.0]]
>>> app.range('A1','C3').options(transpose=True) .value
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
expand:str型,默认为None.可以为:‘table’(右下),‘down’,‘right’。
>>> app.range('A1').options(expand ='right') .value
[1.0, 4.0, 7.0]
>>> app.range('A1').options(expand ='down') .value
[1.0, 2.0, 3.0, ' ']
>>> app.range('A1').options(expand ='table') .value
[[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 9.0], [' ', None, None]]
>>> app.range('A1','A3').options(expand ='right') .value
[[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 9.0]]
>>> app.range('A1','C1').options(expand ='down') .value
[[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 9.0], [' ', None, None]]
-
raw_value:
直接获取或设置传递的值,可以加快速度,但可能会不能跨平台。 -
resize(row_size=None, column_size=None)`:
-
row
:返回指定Range第一行编号。 -
row_height
:获取或设置Range的高度(以磅为单位).如果Range中的所有行具有相同的高度,则返回高度,否则返回None. -
rows
:返回表示指定Range内的RangeRows对象。 -
select()
:选择范围,相当于用鼠标选取范围。 -
shape
:返回Range的维数,以元组的形式,比如:(1,3) 代表1*3的矩阵,(4,2)代表4*2的矩阵。 -
sheet
: 返回Range所属的Sheet对象。 -
size
:Range中元素数量。 -
top
:返回第一行到Range第一行的距离,跟left很像。 -
value
:获取和设置给定Range的值。 -
width
:返回Range的宽度。
6.apps,books,sheets异同
apps:app集合。
books:工作簿集合。
sheets:表格集合。
apps | books | sheets | |
---|---|---|---|
add(增添对象) | √ | √ | √ |
active(激活) | √ | √ | √ |
count(数量) | √ | √ | √ |
keys | √ | × | × |
api | × | √ | √ |
open | × | √ | × |
####7.总结
看了很多函数后,会发现这些对象很多相似的地方,还有事层层递进的 app----book—sheet–Range。
如果有父集可以找到父集,有子集可以找到子集,没有可以创建,能查询名称,能找到对应的集合。
1.要创建excel工作簿:(app对象或book对象)
xw.Book()
xw.App()
要打开已经存在的工作簿:
xw.books.open(路径)
2.选定sheet:(Sheet对象)
xw.books[0].sheets[0]
3.选定单元格两种方式:
- xw.App().books[0].sheets[0].range(cells,cells)
可以构造列表进行excel表的存取。 - xw.App().books[0].sheets[0][0,1]
可以用for循环,来进行读取。
当然还有一些问题,自己也没弄懂,希望下次可以解决。
如果有错误或者疑问的话,欢迎指点。
最后最后,如果有帮助的话,不妨点个喜欢!!!