002xw常用语法总结,基本够用了,后面持续更新xlwings

002xlwings基本语法够用总结(后续更新中)

1.基本语法

import xlwings as xw
import os
import pandas as pd
import numpy as np
import random

# 对象层级,xw包->app就是进程->book工作簿->sheet工作表->cell单元格
# jupyter nbconvert --to markdown 1.ipynb,转化为md


def xw_create_apps():
    """创建app,进程管理"""
    app = xw.App(
        visible=False, add_book=True)  # 启动一个excel程序进程,打印内存地址,是否可见,没有book的app没有pid
    pid = app.pid
    print(pid)

    app = xw.App()  # 每次调用APP都会生成一个新的APP,生成一进程
    pid = app.pid
    print(pid)

    apps = xw.apps  # 统计启动程序的个数,所有的进程,查看Apps包含的所有App
    print(apps.count)  # 返回app数量
    # 查看所有app的PID,发现后创建的pid在列表前面,xw.Book()优先使用最后创建,列表最前的pid
    print(xw.apps.keys())

    for i in xw.apps.keys():  # 杀死所有APP进程,注意文件安全性
        i = 'taskkill/pid ' + str(i) + ' -t -f'
        os.system(i)

    print(apps.count)  # 返回app数量
    # 查看所有app的PID,发现后创建的pid在列表前面,xw.Book()优先使用最后创建,列表最前的pid
    print(xw.apps.keys())

    """
    Function MySum(x, y)
        MySum = x + y
    End Function
    """
    my_sum = app.macro('MySum')  # 调用VBA


def xw_create_app():
    """创建引用app,添加book,sheet,写入文件保存退出,是否刷新可见,基本操作"""
    # app1 = xw.apps[19836]  # 指定进程excel程序创建book,根据pid引用app
    app1 = xw.App()  # 上面知道就行,我这里创建一个
    # app1 = xw.apps.active  # 返回当前活动app
    # app1.activate()  # 激活app,是否弹出excel窗口
    # app1.activate(steal_focus=True)  # 激活app,excel变为最前台应用,焦点切换到excel

    # app1.screen_updating  # 返回屏幕更新状态
    app1.screen_updating = False  # 关闭屏幕更新
    # app1.visible  # 返回app可见
    app1.visible = False  # app不可见
    app1.display_alerts = False  # excel中的提示信息是否可见

    wb = app1.books.add()  # app1中添加一个book
    sht = wb.sheets['sheet1']  # 选中sheet
    sht.range('A1').value = 'hahaha python'  # 选中单元格,操作写入内容

    # 保存,关闭文件,杀死进程
    wb.save('001.xlsx')
    wb.close()
    app1.calculate()  # 从新计算所有工作簿里的公式
    # app1.calculation = 'manual' # 模式:'manual', 'automatic','semiautomatic',更改计算模式
    app1.quit()  # 退出程序
    # app1.kill()  # 杀死进程,强制退出,慎用


def xw_create_workbook():
    """book的打开和引用,以及和app的关系,这个地方有点烦"""
    app2 = xw.App()
    # books = xw.books  # 当前活动App的工作簿集合
    # books = app2.books  # 指定App的所有工作簿的集合

    # wb = app2.books.add()  # 在指定的app下新建book
    book = xw.Book()  # 如果有app,在此基础上建立book,否则新建app,建book

    wb = app2.books.open(  # 看一下就好了
        fullname='001.xlsx',
        update_links=None,  # 是否更新链接
        read_only=False,  # 只读模式打开
        format=None,  # 指定分隔符
        password=None,  # 指定工作簿的密码
        write_res_password=None,  # 写入保留写入工作簿的密码
        ignore_read_only_recommended=False,  # 设置True为静音只读推荐消息
        add_to_mru=None,  # 将此工作簿添加到最近添加的工作簿列表中
        local=False,  # 如果是 True, 根据 Excel 的语言保存文件,否则根据 VBA 的语言保存文件
    )  # 在某一app下打开wb文件

    # wb = xw.Book('test.xlsx')  # 如无app,新建app打开wb文件,后面wb.colse()后,自动释放pid

    wb = app2.books('001.xlsx')  # 引用该app下wb,这里引用不要有路径,必须直接写文件名字
    # wb = app2.books(1)  # 引用app下第1个wb
    # wb = app2.books[0]  # 引用切片,第1个wb
    # 优先引用打开该文件的app中的文件,找不到在该app中,打开未打开的文件,打开必须有路径,引用可以用文件名,多个app可打开同一个文件,但是该引用不知道那个会报错
    wb = xw.Book('001.xlsx')
    wb = app2.books.active  # 引用活动工作簿

    wb.activate()  # 激活工作簿
    wb.activate(steal_focus=True)  # 显示上层,并聚焦

    wb.save()  # 保存
    wb.save(path='data.xls', password=None)  # 另存

    wb.to_pdf(  # 导出为pdf
        path='001.pdf',
        include=1,  # 包括哪些sheets
        exclude=None,  # 排除哪些sheets
        layout=None,
        exclude_start_string='#',  # 不打印以#开头的
        show=False,  # 默认程序打开pdf
        quality='standard'  # PDF 文件的质量,可以是’standard’或’minimum’
    )

    wb.close()  # 关闭
    app2.quit()  # 退出app


def xw_open_workbook():
    '''对wb引用,app,pid的理解,以及一些wb属性'''
    # wb = xw.Book(r'001.xlsx')  # 这样打开后面可以直接用同样方式引用

    # app1 = xw.App(add_book=False, visible=True)
    # wb1 = app1.books.open(r'001.xlsx')
    # app2 = xw.App(add_book=False, visible=True)
    # wb2 = app2.books.open(r'001.xlsx')

    # wb11 = app1.books(r'001.xlsx') # 引用app1的001.xlsx
    # wb21 = app2.books(r'001.xlsx') # 引用app2的001.xlsx

    # 多个app下多个同文件名,直接这样引用报错,这种打开引用方式可以保存关闭文件,wb.app.qiut(),才能kill
    wb = xw.Book(r'001.xlsx')

    # wb4=xw.Book(r'001.xlsx')

    print(
        wb.fullname,  # 返回绝对路径
        wb.name,  # wb文件名字
        wb.app,  # 返回app对象,pid
        wb.names,  # 返回wb中所有的命名区域,列表呈现,名称管理器查看
        wb.selection,  # 返回选定单元格区域
        sep='\n',
    )
    # 更改计算模式 manual(手动), automatic(自动), semiautomatic(半自动)
    wb.app.calculation = 'manual'

    print(xw.apps.keys())  # 所有app进程

    app0 = wb.app  # 找到wb所在app
    wb.save()  # 保存
    wb.close()  # 注意wb所在app没有被kill
    app0.quit()  # 这样才能被kill
    # wb1.close()
    # app1.quit()
    # wb2.close()
    # app2.quit()
    print(xw.apps.keys())  # 没有wb的app没有pid


def xw_sheet():
    '''sheet一些操作和属性,添加,从命名,选择'''
    wb = xw.Book(r'001.xlsx')

    sheets = xw.sheets  # 当前活动工作簿所有sheet,包括隐藏,深度隐藏的,在vba中调改
    sheets1 = wb.sheets  # 指定wb工作簿所有sheet,sheet对象,包括隐藏,深度隐藏的,在vba中调改

    # sht = wb.sheets.add('新表1', after='新表')  # sheet名字,位置,无则excel默认,活动sheet之前,sheet名字重复报错
    # sheet名字,位置,无则excel默认,活动sheet之前,sheet名字重复报错
    # sht = wb.sheets.add('新表1', before='sheet2')

    sht1 = wb.sheets('sheet2')  # sheet名字,引用,英文不区分大小写
    # sht1 = wb.sheets['sheet2']  # 这样写也可以
    sht2 = wb.sheets(1)  # 顺序引用,注意,xls用(0)表示第一个sheet,其他(1)表示
    # sht2 = wb.sheets[1]  # 这样写也可以

    sht3 = xw.sheets.active  # 当前活动工作表
    sht3.activate()  # 激活工作表

    for m, n in zip(sheets, sheets1):  # 对比一下效果看看
        print(m, n)

    # 一些属性
    # sht1.visible = -1  # 设置其可见性,-1可见,0不可见

    print(
        '-' * 90,
        sht1.name,  # 返回工作表的名称
        sht1.book,  # 返回指定工作表所属的工作簿
        sht1.cells,  # 工作表上所有单元格的区域对象,包括所有的单元格,不仅仅是那些正在使用中的单元格
        sht1.index,  # 返回工作表的索引值,按照Excel的方式,从1开始的,xls从0
        sht1.names,  # 返回所有与本工作表有关的命名区域,名称管理器中的
        sht1.used_range,  # 返回sheet中使用过的区域,如果整张表为空,则返回A1单元格
        sht2.name,
        sht3.name,
        sht3.tables,  # 返回表对象
        '=' * 90,
        sheets,  # sheet对象
        sheets1,
        sep='\n',
    )
    # sht1.name = '123'  # 从新命名sheet

    # sht3.clear()  # 清除工作表所有内容和格式,不仅可以清除背景色等格式,还可以清除数据有效性和条件格式等,特别提醒:可以清除受保护的工作表的内容
    # sht2.clear_formats()  # 清理格式,保留内容
    # sht1.clear_contents()  # 清除工作表的所有内容但是保留原有格式

    # sheets1.copy(after=sheets1.sheets[0], name='copied')  # sheet的复制
    # sheets1('新表1').delete()  # 删除sheet,慎重

    sht1.autofit('c')  # 自动调整行高列宽,columen
    sht2.autofit('row')  # r,行
    sht3.autofit()  # 自动调整行高列宽

    sht1.select()  # 选定工作表,只能在活动工作簿中选择

    print(
        sht1.name,  # 修改后的名字
        wb.sheets.count,


    )

    wb.save()
    app = wb.app
    print(xw.apps.keys())
    wb.close()
    app.quit()  # 一定要关掉进程
    print(xw.apps.keys())


def xw_range_select():
    """主要是区域的选择和赋值"""
    app = xw.App()
    wb = app.books.open('001.xlsx')
    sht = wb.sheets[2]

    # 1.区域引用的方式通常有
    xw.Range('A1:C3').value = 1  # 赋值方便查看,没有指定操作sheet的都是活动sheet
    xw.Range((4, 4), (5, 5)).value = 2
    xw.Range(xw.Range('A7'), xw.Range('C9')).value = 3
    xw.Range(xw.Range('A10:F12'), xw.Range('B13:D15')).value = 100  # 最大矩形区域
    # xw.Range('name01').value = 120  # 区域名称,默认打开不是名称所在sheet会报错
    app.range("A1").value = 200
    sht.range('A1').value = 300
    xw.books['001.xlsx'].sheets[0].range('A1').value = 123

    ran = sht.range('c20:d25')
    ran1 = ran.offset(row_offset=3, column_offset=5)  # 区域偏移
    # 模式'down','right','table',Crtl+Shift+↓ | → | ↓→
    ran2 = ran.expand(mode='table')
    ran3 = ran.resize(row_size=6, column_size=4)  # 从新调整区域大小,None表示不变
    ran4 = ran.current_region  # 全选,Ctrl+A

    print(
        ran,
        ran1,
        ran2,
        ran3,
        ran4,
        app.selection,  # 返回选中区域
        wb.selection,  # 返回选中区域,鼠标所在地方
        sep='\n'
    )

    # 2.属性

    ran.name = 'name02'  # 设置区域名字

    print(
        '='*100,
        ran.name,  # 获取区域名字
        ran.height,  # 获得高,宽,数量,大小
        ran.width,
        ran.count,  # 这个count和size好像都返回单元格数量
        ran.size,
        # 以区域左上角为始,获得边界单元格 效果同 Ctrl+Up,Ctrl+down,Ctrl+left,Ctrl+right,可能会超出所选区域
        ran.end('up'),
        ran.end('down'),
        ran.end('right'),
        ran.end('left'),
        ran.last_cell,  # 定位到区域中的的右下角单元格
        ran.sheet,  # 返回区域所在工作表
        ran.address,  # 返回区域字符串引用
        ran.get_address(row_absolute=True, column_absolute=True, include_sheetname=True,
                        external=True),  # 行列绝对引用,sheet,wb名字是否包含在内,会excel的不用解释都懂
        ran.left,  # 区域到左的距离
        ran.top,  # 到上的距离
        sep='\n'
    )

    # 3.range的操作

    ran1.select()  # 选中区域,只能在活动的工作表中选,如果rng区域并不属于当前活动工作表,就会报错
    ran1.value = 110  # 赋值
    ran2.raw_value = 900  # 第二种赋值方式,听说更快
    print(
        '='*100,
        ran1.value,  # 获取区域值
        ran2.value,
        sep='\n',
    )

    wb.save()


def xw_range_write():
    """对单元格的操作,主要是写入内容,添加一个table"""
    sht = xw.Book('001.xlsx').sheets[0]
    sht.range('A6').value = 'hello 老师!'  # 写入内容,会覆写原来单元格
    sht.range('b1').value = 'b1'
    sht.range('c2').value = [100, 2, 3]  # 横向填充
    sht.range('d2').options(transpose=True).value = [
        'AAA', 'BBB', 'CCC']  # 纵向填充
    sht.range('E5').options(expand='table').value = [
        (1, 2), (3, 2), (5, 6)]  # 二维表格

    sht.tables.add(  # 添加一个table
        source=xw.sheets[0].range('k3:o15'),  # 数据源
        # name='t2',  # 表名称,默认excel自己生成
        source_type=None,
        link_source=None,
        has_headers=False,  # 是否有列标签,True, False,‘guess’
        destination=None,
        # table_style_name='t1'
    )

    print(
        '='*100,
        sht.tables[0].api,  # sht.tables[0].api
        sht.tables[0].data_body_range,  # 返回一个表示值范围的 xlwings 范围对象,不包括标题行
        sht.tables[0].display_name,  # 返回表示标题行范围的 xlwings 范围对象
        sht.tables[0].header_row_range,  # 标题行,第一行区域对象
        sht.tables[0].name,  # 返回或设置表的名称
        sht.tables[0].parent,  # 返回表的父级
        sht.tables[0].range,  # 返回表的 xlwings 范围对象,包括标题行
        sep='\n',
    )

    sht.tables[0].show_headers = True  # 显示或隐藏标题,字段column
    sht.tables[0].show_autofilter = True  # 打开或关闭自动过滤器,字段筛选否
    sht.tables[0].show_totals = True  # 显示汇总行,是否有汇总否

    # 列是否显示样式(相间,不要True巨丑)
    sht.tables[0].show_table_style_column_stripes = False
    # sht.tables[0].show_table_style_first_column = True  # 首列格式化,加粗,show_table_style_last_column最后一行
    # sht.tables[0].show_table_style_row_stripes = False  # 是否显示行的样式(相间),默认True显示

    # sht.tables[0].table_style = 'TableStyleMedium28'  # 获取或设置表格样式
    sht.tables[0].resize(sht.range('n3:o12'))  # 重新设置表的大小,列必须对其

    print(
        '='*100,
        # 回一个 xlwings 范围对象,表示将要插入数据的行。这仅适用于空表,否则将返回 None
        sht.tables[0].insert_row_range,
        sht.tables[0].range,  # 表全部区域,包括汇总
        sht.tables[0].totals_row_range,  # 返回汇总行区域对象
        sep='\n',
    )
    # sht.book.save()  # 找到上级对象进行操作
    # sht.book.app.quit()


def xw_range_func():
    """公式,数字格式,复制粘贴,清除,删除,合并拆分单元格"""
    app = xw.App()
    wb = app.books.open('001.xlsx')
    sht = wb.sheets[-1]
    ran = sht.range('b3:d8')
    ran1 = ran.offset(0, 4)  # ran后偏移一列,设置新的区域

    # ran.formula = "=1+5"  # 写入公式
    # ran1.formula_array = '=sum(b3:d8)'  # 设置数组公式
    # ran.number_format = '0.00%'  # 设置数字格式

    # 复制,destination 设置目标区域,如果省略,会被拷贝到剪贴板上
    # ran.copy(destination=sht.range('b10:d15'))
    # ran.copy()  # 如果省略,会被拷贝到剪贴板上,这样下面才会选择性粘贴
    # sht.range('b20:d25').paste(  # 将剪贴板里内容粘贴到指定区域
    #     paste='all',  # all(粘贴全部内容),formats(粘贴复制的源格式),formulas(粘贴公式),values(粘贴值)等等有很多
    #     operation=None,  # add(加),divide(除),multiply(乘),subtract(减)
    #     skip_blanks=True,  # 设为 True 时忽略空白单元格
    #     transpose=False  # 设为 True 时对行列转置
    # )
    print(
        '='*100,
        ran.formula,  # 获取公式
        ran1.formula_array,  # 获取数组公式
        ran1.has_array,  # 检测区域内是否包含数组公式,全部都是数组公式返回True,公式没必要全部一样
        ran.number_format,  # 获取数字格式
        sep='\n'
    )

    # ran.copy_picture(appearance='screen', format='picture')  # 范围范围当作图片复制到剪切板
    # ran.clear_contents()  # 清除区域内容,保留格式
    # ran1.clear(),  # 清除区域的内容和格式
    # ran.delete(shift='up') #删除单元格,单元格上移还是左移,up,left,删除后ran就没了,需要从新设置区域
    # 插入单元格,移动方向down,right,后面可以选择单元格格式拷贝源
    # ran.insert(shift='right', copy_origin='format_from_left_or_above')
    # 插入单元格
    # sht.range("C3").insert(shift=None, copy_origin='format_from_right_or_below')
    # sht.api.Rows(3).Insert()  # 在第3行插入空行
    # sht['2:2'].insert()		# 插入行
    # sht['B:B'].insert()		# 插入列
    # sht['B2'].insert()		# 插入单元格 (缺省默认'down', 可选 'right')
    # sht['B2:C3'].insert()	        # 插入区域
    # # 或者调用api
    # sht.api.Rows(1).Insert()    # 插入行
    # sht.api.Rows('2:4').Insert()
    # sht.api.Columns(1).Insert()  # 插入列
    # sht.api.Columns('2:4').Insert()

    ran.row_height = 40  # 设置行高
    ran.rancolumn_width = 60  # 设置列宽
    ran.columns.autofit()  # 宽度自适应
    ran.rows.autofit()  # 高度自适应
    ran.autofit()  # 调节行高列宽
    ran.merge(across=False)  # 合并单元格,True跨越合并,只有列合并,长条
    ran.unmerge()  # 取消单元格合并
    xw.Range('A1').color = (255, 100, 0)  # 设置背景色
    xw.Range('A2').color = None  # 去除背景色
    xw.Range('a3').add_hyperlink(r'www.baidu.com',
                                 '百度', '提示:点击即链接到百度')  # 地址,显示文本,提示信息

    print(
        '='*100,
        ran.row_height,  # 获取行高
        ran.column_width,  # 获取列宽
        # ran.merge_area,  # 返回合并单元格区域,如果ran位于合并单元格内,则返回这个合并单元格,如果ran位于合并单元格外,则返回ran,一半一半报错
        ran.merge_cells,  # 检测区域内是否包含合并单元格
        ran.color,  # 获取指定区域的背景色,
        xw.Range('a3').hyperlink,  # 返回指定区域的超链接(仅适合单个单元格)
        sep='\n',
    )

    wb.save()  # 没有写退出代码,方便查看


def xw_other_object():
    """excel中的其他对象,shape,picture,name,chart等等,具体的大小,边框对其太多了,后面需要去翻官方文档行了,不再赘述"""
    wb = xw.Book('001.xlsx')
    # sht = wb.sheets.add('new')  # 添加个sheet
    sht = wb.sheets('new')
    rng = sht.range('b2:c4')

    rows = rng.rows  # 一个区域内所有的行
    columns = rng.columns  # 一个区域内所有的列
    rows.autofit()  # 自动调整行高,宽
    columns.autofit()

    # 创建集合,收集其中的对象类型
    shapes_dic = sht.shapes  # 自选图形、任意多边形、OLE 对象或图片(可以拖动的形状,试试就知道了)
    charts_dic = sht.charts  # 图表
    pictures_dic = sht.pictures  # 图片
    names_dic = sht.names  # 注意要定义在sheet中,定义在book中找不到
    # 拿出单一对象
    shp = sht.shapes[0]
    chr = sht.charts[0]
    pic = sht.pictures[0]
    name = sht.names[0]  # 注意要定义在sheet中,定义在book中找不到

    print(
        rows.count,  # 返回行数,列数
        columns.count,
        shapes_dic,  # 返回集合
        charts_dic,
        pictures_dic,
        names_dic,
        sht.pictures.count,  # 返回集合中的对象数
        shp,  # 返回集合中的切片元素
        chr,
        pic,
        name,
        sep='\n',
    )

    # 四大对象都有相同性质,以图片为例
    # pic.delete()  # 删除
    pic.height = 200  # 设置高宽,位置,名称
    pic.width = 400
    pic.left = 200
    pic.top = 400
    pic.name = 2222
    print(
        '='*100,
        sht.shapes.count,
        sht.charts.count,
        sht.pictures.count,
        sht.names.count,
        pic.parent,  # 返回所在sht名字
        pic.height,  # 返回高,宽,位置,名字
        pic.width,
        pic.left,
        pic.top,
        pic.name,
        sep='\n',
    )

    # 特有属性

    chr.chart_type = '3d_column'  # 更改(设置)图表类型

    # 新建图表并且设置图表类型,指定数据
    # rng1=sht.range('A1').value = [['Foo1', 'Foo2'], [1, 2]]
    sht.range('k1').value = [['k', 'l', 'm', 'n'], [1, 2, 3, 4], [5, 6, 7, 8]]
    chr1 = charts_dic.add()
    chr1.set_source_data(sht.range('k1').expand())  # 设置数据范围,这里注意用expand(),是个区域
    chr1.chart_type = 'line'
    chr1.name = '图图'

    # 添加名称区域
    name04 = names_dic.add('name04', '=new!$c$7:$e$10')

    print(
        shp.type,  # 返回形状类型
        chr.chart_type,  # 返回图表类型
        chr1.chart_type,
        chr1.name,
        name04,  # 返回名称对象
        name04.refers_to_range,  # 返回区域
        name04.refers_to,  # 返回引用公式
        sep='\n',
    )

    name04.refers_to = "=new!$E$6:$H$8"  # 更改,设置引用公式
    print(name04.refers_to, name04.refers_to_range)  # 查看从新设置后的引用公式,区域

    pictures_dic.add(  # 添加替换图片
        r'D:\Users\Pictures\Saved Pictures\004dog.jpg',  # 文件路径名或者是 Matplotlib图形对象
        link_to_file=False,
        save_with_document=True,
        left=30,  # 位置宽高
        top=30,
        width=None,
        height=None,
        name='dog',  # 命名
        update=False,  # 替换图片的名字
        scale=0.2,  # 缩放
    )
    # 替换图片,原属性完全继承,这里我失败了,兄弟们加油
    pic.update(r"D:\Users\Pictures\Saved Pictures\bear.jpg")


def xw_font():
    """字体设置"""
    df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])

    app = xw.App(add_book='s')
    sht = app.books[0].sheets[0]
    sht.tables.add(
        source=sht.range('a1:d11')
    )
    sht.tables[0].update(df, index=False)  # table中填充df

    sht['A2'].font.bold = True  # 返回或设置粗体属性
    sht['A2'].font.color = (255, 0, 0)  # 返回或设置颜色属性(元组)
    sht['A2'].font.italic = True  # 返回或设置斜体属性
    sht['A2'].font.size = 21.5  # 返回或设置大小(浮点数)

    print(
        '='*100,
        sht['A1'].font,  # 当作值来访问
        # sht.shapes[0].font,  # 当作形状来访问
        sht['A1'].font.api,  # 正在使用的引擎的本机对象(pywin32或appscriptobj)
        sht['A2'].font.name,  # 返回或设置字体的名称
        sep='\n',
    )


def xw_option():
    """转换器和选项,和其他对象numpy,pandas的转换,冻结窗口,批注,更改单元格类型,插入一二维数据,修改窗口大小"""
    # wb=xw.App(add_book='s').books[0]
    # sht=wb.sheets[0]
    app = xw.App(visible=True, add_book=False)
    wb = app.books.open('001.xlsx')
    wb.activate(steal_focus=True)

    sht = wb.sheets[0]
    dic = {'k': [1, 2, 3], 'l': [4, 5, 6]}
    d1 = sht.range('A1:B10').options(dict).value  # 数据是列方向
    d2 = sht.range('A4:k5').options(dict, transpose=True).value  # 数据是行方向
    sht.range('A1').options(transpose=True).value = np.array([8, 2, 3])  # 一维数据
    d3 = sht.range('A1:C3').options(np.array, ndim=2,
                                    dtype=None, copy=True, order=None).value  # 二维数据

    d4 = sht.range('E1').options(pd.Series, expand='table', dtype=None,
                                 copy=False, index=False, header=False).value  # 返回series
    d5 = sht.range('A1:D5').options(pd.DataFrame, header=2,
                                    dtype=None, copy=False, index=1).value  # 返回df
    # 默认数字读取为float,可以修改为int,str
    d6 = sht.range('A1').options(numbers=int).value
    sht.range('f1').options(transpose=True).value = [1, 2, 3]  # 列表写入列
    sht.range('b4').api.NumberFormat = "@"  # 单元格的格式改为文本类型
    print(
        '='*100,
        d1,
        d2,
        d3,
        d4,
        d5,
        d6,
        sep='\n',
    )

    # 冻结窗口
    active_window = wb.app.api.ActiveWindow
    active_window.FreezePanes = False
    active_window.SplitColumn = 3  # 冻结至哪一列
    active_window.SplitRow = 3  # 冻结至哪一行
    # active_window.FreezePanes = True #False,没有冻结的化直接拆分4部分
    active_window.WindowState = -4137  # 最大最小窗口 -4137表示常量xlMaximized
    sht.range("a1").api.AddComment(Text='修改')  # 插入批注


def xw_api():
    """使用xw中的api方法,
    在调用range后的api后面的方法或者属性首字母必须大写,
    表格线条样式,粗细,字体颜色,样式,加粗,倾斜,背景色"""
    app = xw.App(visible=True, add_book=False)
    app.display_alerts = True
    app.screen_updating = True
    wb = app.books.open('005.xlsx')
    sht = wb.sheets[0]
    rng = sht.range('a1:b4')
    rng1 = sht.range('c3:f8')

    # rgn.api.Font.Color = 0xffff00  # 改变颜色,或者16776960.0
    rng.api.Font.ColorIndex = 17  # 都能看懂不再注释了
    rng.api.Font.Size = 25
    rng.api.Font.Bold = True
    rng.api.Font.Name = '宋体'
    rng.api.Font.FontStyle = "倾斜"
    rng.api.Font.Underline = 2

    rng.api.HorizontalAlignment = -4131  # -4108 居中(默认),-4131 靠左,-4152 靠右
    rng.api.VerticalAlignment = -4130  # -4108 居中,-4160 靠上,-4107 靠下,-4130 自动换行对齐
    # -4108 居中,-4160 靠上,-4107 靠下,-4130 自动换行对齐,这里自动换行和对其只能设置一个
    rng.api.VerticalAlignment = -4107

    # 画框,这里就这样吧,不好搞,用到再说,或者直接去学VBA吧,
    # 1代表顶部边框,2代表右侧边框,3代表左侧边框,4代表底部边框,5代表内部横线,6代表内部竖线,
    # 7代表所有四个角的外角,8代表所有四个角的内角,9代表整个单元格的边框(即所有四个角和四条边),
    # 10代表单元格的外部所有边框(即不包括内部横线和内部竖线),
    # 11代表单元格的外部左边和右边的边框(即不包括顶部和底部边框),12代表单元格的外部上边和下边的边框(即不包括左侧和右侧边框)

    # rng.api.Borders(7).LineStyle = 9
    # rng.api.Borders(7).Weight = 3
    # # rgn.api.Borders(10).LineStyle = 2
    # # rgn.api.Borders(10).Weight = 1.5

    # 划底部边框,0(无边框)、1(实线)、2(虚线)、3(点线)、4(点划线)、5(双点划线)
    rng1.api.Borders(9).LineStyle = 1
    rng1.api.Borders(9).Weight = 3  # 参数可以设置为0(自动)、1(细线)、2(中等)、3(粗线)
    rng1.api.Borders(10).LineStyle = 1  # 划右部边框
    rng1.api.Borders(10).Weight = 3
    rng1.api.Borders(11).LineStyle = 1  # 划内部竖线
    rng1.api.Borders(11).Weight = 2
    rng1.api.Borders(12).LineStyle = 1  # 划内部横线
    rng1.api.Borders(12).Weight = 2

    app.display_alerts = False  # 取消警告,把下面合并警告取消
    # rng1.api.Merge()  # 合并
    # rng1.api.UnMerge() # 取消合并

    row_num = sht['A1'].current_region.last_cell.row  # 最后行数
    sht['A2:A{}'.format(row_num)].number_format = 'm/d'  # 设置数字格式
    column_num = sht['A1'].current_region.last_cell.column  # 最后列数
    alpha_column_num = chr(ord("A") + column_num - 1)  # 最后列字母
    sht['b2:b{}'.format(row_num)].number_format = '0.0'  # 设置数字格式
    print(row_num, alpha_column_num)
    sht['a1:{}1'.format(alpha_column_num)].api.Font.Size = 15
    sht['a1:{}1'.format(alpha_column_num)].api.Font.Name = '宋体'
    sht['a1:{}1'.format(alpha_column_num)].api.Font.Bold = True

    # 颜色随机设置
    r = random.randint(0, 255)
    b = random.randint(0, 255)
    g = random.randint(0, 255)
    r1 = random.randint(0, 255)
    b1 = random.randint(0, 255)
    g1 = random.randint(0, 255)
    sht['A1:{}1'.format(alpha_column_num)].api.Font.Color = xw.utils.rgb_to_int(
        (r, b, g))  # 字体颜色
    sht['A1:{}1'.format(alpha_column_num)].color = xw.utils.rgb_to_int(
        (r1, b1, g1))  # 填充背景颜色
    sht['A1:{}1'.format(
        alpha_column_num)].api.HorizontalAlignment = xw.constants.HAlign.xlHAlignCenter  # 设置水平对齐方式为居中
    sht['A1:{}1'.format(
        alpha_column_num)].api.VerticalAlignment = xw.constants.VAlign.xlVAlignCenter  # 设置垂直对齐方式为居中

    for cell in sht.range('f10').expand('table'):  # 画线看看
        # print(cell)  # 每一个单元格
        cell.api.Borders(7).LineStyle = 1  # 1左线,2右,3上,4下,5斜线右下,6斜下左下,自己试吧
        cell.api.Borders(7).Weight = 2

    for i in range(1, 11):  # 循环向里面写数据
        for j in range(1, 6):
            sht.range(i, j).value = '{}-{}'.format(i, j)  # 被excel解读为日期
    values = sht.range((1, 1), (10, 5)).expand().value
    print(values)

    print(
        '='*100,
        rng.api.Font.ColorIndex,  # 都能看懂不再注释了
        rng.api.Font.Size,
        rng.api.Font.Bold,
        rng.api.Font.Name,
        rng.api.Font.Color,
        rng.api.HorizontalAlignment,
        rng.api.VerticalAlignment,
        rng.api.Borders,
        rng.merge_cells,  # 是否是合并单元格
        # rng.api.Borders(7).Weight,
        sep='\n',
    )


def xw_df():
    """使得df在excel中显示"""
    df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
    # xw.view(obj=df, sheet=None, table=True, chunksize=5000)

    app = xw.App(add_book='s')
    sht = app.books[0].sheets[0]
    sht.tables.add(
        source=sht.range('a1:d11')
    )
    sht.tables[0].update(df, index=False)  # table中填充df


def xw_supplement():
    """xw想到的补充"""
    wb = xw.App(visible=True, add_book='s').books[0]
    sht = wb.sheets[0]
    rng = sht.range('a1:d5')
    for r in rng.rows:  # 所有行对象
        print(r)
        for cell in r:  # 遍历单元格
            print(cell)
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值