PyPython学习Python

python操作excel

2018-12-21  本文已影响129人  你就像只铁甲小宝

今天学习了下xlwings这个库,目的是为了让计算机自动化操作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']

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']
 import xlwings as xw
             def my_macro():
                wb = xw.Book.caller()
                wb.sheets[0].range('A1').value = 1

当需要在调试的时候可以使用xw.set_mock_caller()函数。
*close():在没有保存的情况下关闭。

*fullname:以字符串的形式返回对象的名称跟路径。

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.

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']

5.sheet中Range对象

选了A1单元格
>>>r = sht.range('A1')
>>>r
<Range [工作簿1]Sheet1!A1>


看看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']
   >>> 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
>>> app.range('A4').formula`
'=SUM(A1:A3)'
formula
>>> 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'
>>> import xlwings as xw
        >>> wb = xw.Book()
        >>> xw.Range('A1').value
        'www.xlwings.org'
        >>> xw.Range('A1').hyperlink
        'http://www.xlwings.org'

如果单元格里没有超链接会报错。

>>> app.range('A1','C3').last_cell
<Range [工作簿1]Sheet1!$C$3>
>>> app.range('C1','C3').left
108.0

如果我把第一列拉长
拉长第一列
>>> app.range('C1','C3').left
138.0
现在是第一行,第一列
>>> 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):偏移到左上方一个单元格。

>>> 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]]

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.选定单元格两种方式:

当然还有一些问题,自己也没弄懂,希望下次可以解决。

如果有错误或者疑问的话,欢迎指点。
最后最后,如果有帮助的话,不妨点个喜欢!!!

上一篇 下一篇

猜你喜欢

热点阅读