首页 > 其他分享 >xlwings使用

xlwings使用

时间:2022-09-02 13:44:24浏览次数:58  
标签:sht1 单元格 stacked wb xlwings range api 使用

模块基本介绍与使用

基本介绍:用于Python与Excel之间的交互,可以轻松地从 Excel 调用 Python,也可以利用Python自动化操作Excel,调用VBA,非常方便。

 

 基本使用方法:新建一个excel文件,取名为xlwings_wb.xlsx,并新建一个sheet,取名为first_sht,在其A1单元格内插入字符串Python

# 导入xlwings,并起一个别名 xw,方便操作
import xlwings as xw

# 1、创建一个app应用,打开Excel程序
# visible=True 表示打开操作Excel过程可见 初次接触可以设置为True,了解其过程
# add_book=False 表示启动app后不用新建个工作簿
app = xw.App(visible=True, add_book=False)

# 2、新建一个工作簿
wb = app.books.add()

# 3、新建一个sheet,并操作
# 3.1 新建sheet 起名为first_sht
sht = wb.sheets.add('first_sht')
# 3.2 在新建的sheet表中A1位置插入一个值:Python
sht.range('A1').value = 'Python'
# 3.3 保存新建的工作簿,并起一个名字
wb.save('xlwings_wb.xlsx')

# 4、关闭工作簿
wb.close()

# 5、程序运行结束,退出Excel程序
app.quit()

 基础语法一览

# 基础导入包
import xlwings as xw  # 程序第一步

# 打开关闭Excel程序(理解成excel软件打开、关闭)
# visible=True 表示打开操作Excel过程可见 初次接触可以设置为True,了解其过程
# add_book=False 表示启动app后不用新建个工作簿
app = xw.App(visible=True, add_book=False)  # 程序第二步

# 关闭excel程序
app.close()  # 程序最后一步

工作簿相关操作(理解成excel文件)

# 1、新建一个工作簿
wb = app.books.add()  # 程序第三步

# 2、保存新建的工作簿,并起一个名字
# 程序倒数第三步,非常关键,保存操作数据结果
wb.save('xlwings_wb.xlsx')  

# 3、打开一个已经存在的工作簿
wb = app.books.open('xlwings_wb.xlsx')  # 程序第三步

# 4、关闭工作簿
wb.close()  # 程序倒数第二步

sheet相关操作(理解成工作表)

# 在工作簿中新建一个sheet,起名为 second_sht
sht1 = wb.sheets.add('second_sht')

# 选中已经存在的sheet
sht2 = wb.sheets('first_sht')

# 也可以通过索引选择已存在的sheet
sht3 = wb.sheets[0]  # 选中工作簿中的第一个sheet

# 获取工作簿中工作表的个数
sht_nums = wb.sheets.count
print('工作簿中的sheet个数为:%d'% sht_nums)

# 当前工作表名字
sht1.name

# 获取指定sheet中数据的行数
sht1.used_range.last_cell.row

# 获取指定sheet中数据的列数
sht1.used_range.last_cell.column

# 删除指定的sheet 比如删除:first_sht
wb.sheets('first_sht').delete()

单元格相关操作(就是excel单元格子)

写入

'''
写入
'''
# 在工作表中指定位置插入数据
sht1.range('B1').value = '简说Python'

# 在工作表指定位置插入多个数据 默认是横向插入
sht1.range('B2').value = [1, 2, 3, 4]

# 在工作表指定位置竖向插入多个数据
# 设置options(transpose=True),transpose=True表示转置的意思
sht1.range('B3').options(transpose=True).value = ['老表', '老表Pro', '老表Max', '老表Mini']

# 在工作表指定位置开始插入多行数据
sht1.range('B7').value = [['a', 'b'], ['c', 'd']]

# 在工作表指定位置开始插入多列数据
sht1.range('B9').options(transpose=True).value = [['a', 'b'], ['c', 'd']]

# 向单元格写入公式
sht1.range('F2').formula = '=sum(B2:E2)'

读出

'''
读取
'''
# 在工作表中读取指定位置数据
print('单元格B1=', sht1.range('B1').value)

# 在工作表中读取指定区域数据 一行
print('单元格B2:F2=', sht1.range('B2:F2').value)

# 在工作表中读取指定区域数据 一列
print('单元格B3:B6=', sht1.range('B3:B6').value)

# 在工作表中读取指定区域数据 一个区域 
# 设置options(transpose=True)就可以按列读 不设置就是按行读
print('单元格B7:C10=', sht1.range('B7:C10').options(transpose=True).value)

删除

'''
删除
'''
# 删除指定单元格中的数据
sht1.range('B10').clear()

# 删除指定范围内单元格数据 
sht1.range('B7:B9').clear()

格式修改

'''
格式修改
'''
# 选中已经存在的sheet
sht1 = wb.sheets('second_sht')
# 返回单元格绝对路径
sht1.range('B3').get_address()
# sht1.range('B3').address

# 合并单元格B3 C3
sht1.range('B3:C3').api.merge() 

# 解除合并单元格B3 C3
sht1.range('B3:C3').api.unmerge() 

# 向指定单元格添加带超链接文本 
# address- 超连接地址
# text_to_display- 超链接文本内容
# screen_tip- 鼠标放到超链接上后显示提示内容
sht1.range('C2').add_hyperlink(address='https://pythonbrief.blog.csdn.net/',
                   text_to_display='简说Python CSDN博客',
                   screen_tip='点击查看简说Python CSDN博客')
                   
# 获取指定单元格的超链接地址
sht1.range('C2').hyperlink

# 自动调试指定单元格高度和宽度
sht1.range('B1').autofit()

# 设置指定单元格背景颜色
sht1.range('B1').color = (93,199,221)

# 返回指定范围内的中第一列的编号 数字,如:A-1 B-2
sht1.range('A2:B2').column

# 获取或者设置行高/列宽 
# row_height/column_width会返回行高/列宽 ,范围内行高/列宽不一致会返回None
# 也可以设置一个新的行高/列宽
sht1.range('A2').row_height = 25
sht1.range('B2').column_width = 20

在windows上可以使用以下方法设置单元格文字颜色等格式,如下:

# windows系统下字体设置在 sheet.range().api.Font下
# 颜色
sht1.range('A1').api.Font.Color = (255,0,124)
# 字体名字
sht1.range('A1').api.Font.Name = '宋体'
# 字体大小
sht1.range('A1').api.Font.Size = 28
# 是否加粗
sht1.range('A1').api.Font.Bold = True
# 数字格式
sht1.range('A1').api.NumberFormat = '0.0'
# -4108 水平居中
# -4131 靠左
# -4152 靠右
sht1.range('A1').api.HorizontalAlignment = -4108
# -4108 垂直居中(默认)
# -4160 靠上
# -4107 靠下
# -4130 自动换行对齐。
sht1.range('A1').api.VerticalAlignment = -4130
# 设置上边框线风格和粗细
sht1.range('A1').api.Borders(8).LineStyle = 5
sht1.range('A1').api.Borders(8).Weight = 3
...

在mac下可以通过以下方法设置字体格式:

# 设置单元格的字体颜色
rgb_tuple = (0, 10, 200)
sht1.range('B1').api.font_object.color.set(rgb_tuple)

# 获取指定单元格字体颜色
sht1.range('B1').api.font_object.color.get()

# 获取指定单元格字体名字 可以使用set方法修改字体 set('宋体')
sht1.range('B1').api.font_object.name.get()

# 设置指定单元格字体格式 可以用get方法查看单元格字体格式
sht1.range('B3').api.font_object.font_style.set('加粗')

# 设置指定单元格字体大小
sht1.range('B3').api.font_object.font_size.set(20)

# 设置边框线粗细
sht1.range('B2').api.get_border(which_border=9).weight.set(4)

# 设置边框线风格
sht1.range('B2').api.get_border(which_border=9).line_style.set(8)
...

进行完所有操作后一定要记得执行以下三句:

# 保存新建的工作簿,并起一个名字(如果已存在有名字的excel文件,就直接save即可)
wb.save()
# 关闭工作簿(关闭Excel文件)
wb.close()
# 程序运行结束,退出Excel程序
app.quit()

自动生成统计图

import xlwings as xw

# 新建一个sheet
app = xw.App(visible=True, add_book=False)
wb = app.books.open('xlwings_wb.xlsx')
sht3 = wb.sheets.add('third_sht')

import pandas as pd
import numpy as np

# 生成模拟数据
df = pd.DataFrame({
    'money':np.random.randint(45, 50, size = [1, 20])[0],
},
    index=pd.date_range('2021-02-01', '2021-02-20'),  # 行索引和时间相关
)
df.index.name = '消费日期'  # 设置索引名字

sht3.range('A1').value = df

# 生成图表
chart1 = sht3.charts.add()  # 创建一个图表对象
chart1.set_source_data(sht3.range('A1').expand())  # 加载数据
chart1.chart_type = 'line'  # 设置图标类型
chart1.top = sht3.range('D2').top  
chart1.left = sht3.range('D2').left  # 设置图标开始位置 

除了绘制折线图,我们还可以绘制其他类型的图,修改chart_type值即可。

# 查看其他chart_types值
xw.constants.chart_types

返回结果

('3d_area',
 '3d_area_stacked',
 '3d_area_stacked_100',
 '3d_bar_clustered',
 '3d_bar_stacked',
 '3d_bar_stacked_100',
 '3d_column',
 '3d_column_clustered',
 '3d_column_stacked',
 '3d_column_stacked_100',
 '3d_line',  # 3D折线图
 '3d_pie', # 3D饼图
 '3d_pie_exploded',
 'area',  # 面积图
 'area_stacked',
 'area_stacked_100',
 'bar_clustered',  # 柱状图相关
 'bar_of_pie',
 'bar_stacked',
 'bar_stacked_100',
 'bubble',  # 气泡图
 'bubble_3d_effect',
 'column_clustered',  # 条形图相关
 'column_stacked',
 'column_stacked_100',
 'combination',
 'cone_bar_clustered',
 'cone_bar_stacked',
 'cone_bar_stacked_100',
 'cone_col',
 'cone_col_clustered',
 'cone_col_stacked',
 'cone_col_stacked_100',
 'cylinder_bar_clustered',
 'cylinder_bar_stacked',
 'cylinder_bar_stacked_100',
 'cylinder_col',
 'cylinder_col_clustered',
 'cylinder_col_stacked',
 'cylinder_col_stacked_100',
 'doughnut',
 'doughnut_exploded',
 'line',  # 折线图
 'line_markers',
 'line_markers_stacked',
 'line_markers_stacked_100',
 'line_stacked',
 'line_stacked_100',
 'pie',
 'pie_exploded',
 'pie_of_pie',
 'pyramid_bar_clustered',
 'pyramid_bar_stacked',
 'pyramid_bar_stacked_100',
 'pyramid_col',
 'pyramid_col_clustered',
 'pyramid_col_stacked',
 'pyramid_col_stacked_100',
 'radar',
 'radar_filled',
 'radar_markers',
 'stock_hlc',  # 有意思 股票K线图
 'stock_ohlc',
 'stock_vhlc',
 'stock_vohlc',
 'surface',
 'surface_top_view',
 'surface_top_view_wireframe',
 'surface_wireframe',
 'xy_scatter',
 'xy_scatter_lines',
 'xy_scatter_lines_no_markers',
 'xy_scatter_smooth',
 'xy_scatter_smooth_no_markers')

将本地图片或者matplotlib图片保存到excel

'''
matplotlib 生成的图片存入excel
'''
import matplotlib.pyplot as plt
# 随便绘制一个饼图
fig1 = plt.figure()  # 先创建一个图像对象
plt.pie([0.5, 0.3, 0.2],  # 值
        labels=['a', 'b', 'c'],  # 标签
        explode=(0, 0.2, 0),  # (爆裂)距离
        autopct='%1.1f%%',   # 显示百分数格式
        shadow=True)  # 是否显示阴影
plt.show() 

# 将饼图添加到excel指定位置 J17为图片开始位置
sht3.pictures.add(fig1, name='matplotlib', 
                  left=sht3.range('J17').left, 
                  top=sht3.range('J17').top, update=True)
'''
本地图片存入excel
'''
# 将本地图片添加到excel指定位置 J1为图片开始位置
pic_path = './0923.jpeg'
sht3.pictures.add(pic_path, name='local', 
                  left=sht3.range('J1').left, 
                  top=sht3.range('J1').top, update=True)

 

标签:sht1,单元格,stacked,wb,xlwings,range,api,使用
From: https://www.cnblogs.com/windyrainy/p/16649549.html

相关文章

  • 使用java完成图形验证码
    序目标是使用Java生成验证码,传入前端。一.实现思路利用接口调用工具类,使用ajax反馈给前端二.实现步骤1.添加依赖点击查看代码<dependency><group......
  • springboot项目使用jsp
    异常问题场景提示:这里简述项目相关背景springboot课堂学习问题详情提示:这里描述项目中遇到的问题jsp无法访问原因分析提示:这里填写问题的分析没有jsp解......
  • Ubuntu日常使用
    双系统是前阵子装的啦,有的东西可能记得不太清楚了。系统安装系统版本选择装Ubuntu的一大原因是要用ROS,而ROS还很挑Ubuntu版本。当前ROS已分出了ROS1和ROS2,虽然ROS1的......
  • SpringCloud 使用 OpenFeign 声明式服务调用
    Feign组件最初由Netflix公司提供,由于不支持SpringMVC注解,所以SpringCloud对其封装并进行支持,因此产生了OpenFeign组件。Feign是一个声明式的REST客户端,它采用......
  • 使用IDEA生成JavaDoc文档
    1.选中要生成的包:  2.点击标题栏上得Tools->GenerateJavaDoc...  3.:然后会弹出一个界面,然后在输出目录(Outputdirectory)输入框后面的按钮点击进去选择要保存的......
  • 使用axis2生成webService客户端代码并使用(做个记录)
    背景:公司以前用过一次axis2,调用webservice,但是因为过去大半年的时间当再一次有需求使用axis2的时候发现自己忘得差不多了,这里做一个记录.1)首先根据wsdl生成客户端代......
  • Linux命令-按照与使用(11) 使用 HISTTIMEFORMAT 显示 history 命令的时间戳
    使用HISTTIMEFORMAT显示history命令的时间戳1、临时生效exportHISTTIMEFORMAT="[%Y-%m-%d%H:%M:%S]"或者exportHISTTIMEFORMAT='%F%T'备注:这个环境变量的......
  • LISTAGG(字段名, ‘|‘) WITHIN GROUP(ORDER BY **) 使用
    LISTAGG(字段名,‘|’)WITHINGROUP(ORDERBY**)//配合分组一起使用-LISTAGG(字段名,‘|’)接收两个参数第一个:需要数据拼接的字段-字段名第二个:使用什么字符进......
  • c#线程池使用之_回调方法中传递多个参数的处理
    如题,在这里主要是做个关于线程池使用过程中回调方法需要用到多个参数的时候的场景 下面中的代码做个例子:我需要用到一个WebClientDown2来去远程地址下载一个文件保存到......
  • Git使用经验总结
    问题一:获取服务器上不存在对象报错内容:  分析过程:1、一开始以为是文件过大的问题,然后就去下载了GitLargeFileStorage,弄了之后发现还是不行2、使用gitlfsfetch......