python操作excel

今天学习了下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就跟下图的结果.

    api方法

  • 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)的集合。


    sheets返回的对象

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。

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

    color

  • column:返回Range对象的第一列编号。

    column

  • 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
  • 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循环,来进行读取。

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容