本文不谈xlwings的sheet和range等基础语法,一搜索一大把,我一个光学工程师就不bb了迫切需求
最近在实验遇见大量的数据,OSA光谱仪直接存下来的谱线文件,XLS文件。
由于需要光谱需要绘制成图片,并且进行数据处理。架不住数量太多,好几百张,还需要添加图例杂七杂八的。。- -人工处理光用excel或者origin画图就要好久,都是重复性的工作,很累。。还很容易出错,
由于之前写过一阵子爬虫(爬妹子图,流口水.jpg),想到python处理大量的文本和数据有得天独厚的优势(第三方库有很多),本着锻炼技能(能偷懒就偷懒,少干一点重复的就少干)的心态,尝试一下自动化处理。
2,库的选择
首先答主并不是专业的程序员,写轮子是不存在的,VBA也是不会的。
经过调研(百度),python和excel交互的库很多,xlsxwriter,xlrd等等。
我选择xlwings,你问为什么,当然因为护国神翼wings了,这个库带名字带wings,应该很牛皮吧
真实原因,1,xlwings好像可以处理不同版本的excel文件,xlsx,xls,兼容性比较好,而且读写保存都支持
2,语法比较简单,接近英文吧,俺是学光学的。但是能看懂文档的demo,xlwings文档整个过程逻辑怎么实现呢
读取光谱xls文件,
取数字保存到list,数据处理并储存到list
list写到新的excel
自己生成图像,调整坐标轴和图例标题单位等等
结果在最后一步生成图像卡住了。xlwings常见的图像好像是用matplotlib画图添加进去,
然而我本人更倾向于用excel自带的图片,因为有时候需要修一下(编造,你懂得)数据,我希望改动数据的时候,图像自己跟着变动。这样我不需要为了一点点瑕疵重新跑一边程序
找了很久,,居然没有xlwings如何在excel直接插入chart的例子!!!少数有的也是语焉不详,压根不能满足我的要求
参考价值有限,很多东西,比如自动批量调整坐标轴的名称,(光谱横轴一般是 wavelength,纵轴是dBm功率),而且图例之类的都没提
后面我在官方doc里面看到一句话,xlwings CE is a BSD-licensed Python library that makes it easy to call Python from Excel and vice versa:
Scripting: Automate/interact with Excel from Python using a syntax close to VBA.
Macros: Replace VBA macros with clean and powerful Python code.
UDFs: Write User Defined Functions (UDFs) in Python (Windows only).
REST API: Expose your Excel workbooks via REST API.
Numpy arrays and Pandas Series/DataFrames are fully supported. xlwings-powered workbooks are easy to distribute and work on Windows and Mac.
上面的我理解的意思,可以调用excel的API,(接口一样的东西?我是这么理解的),也就是说可以用excel自己的VBA接口,实现,然后我在office的官网找到下面这个Chart 对象 (Excel)docs.microsoft.com
是的,相当于我现在直接python操作excel的对象进行画图,还可以在外围加上for循环让它批量的进行处理图例
下面直接上我认为比较重要的代码
import os
import xlwings as xw
这个引用库,不多解释了
app= xw.App()
wb = app.books.open(r'C:\\Users\\ADmin\\Desktop\\模板.xlsx')
ws1=wb.sheets[0]
ws2=wb.sheets[1]
打开文件,选择sheet对象
chart1 =ws1.charts.add(100,100) #添加表格
chart2 =ws1.charts.add(100,320) #添加表格
在sheet对象的基础上,添加chart,(100,100),(100,300)是图位置坐标,(在屏幕那一块位置)这里添加了两个chart对象,chart1和chart2
chart1.chart_type = 'xy_scatter_lines_no_markers' #设置图标类型是xy散点连线图
这里是设置图的类型,其他类型的文本可以去office官网找,‘’里面也可以是bar或者line,等其他类型
chart1.set_source_data(ws1.range(ws1.range((3,1),(2396,1)),ws1.range((3,3),(2396,3)))) #选择任意两列
这里是这只数据区域,重点,chart.set_source_data,可以取相邻的区域,也可以取任意几列,上面的表述是取的不相邻的两列,第一列和第三列
tt12='这个是标题,您配吗?' #标题文本
chart1.api[1].SetElement(2) #显示标题
chart1.api[1].SetElement(101) #显示图例
chart1.api[1].ChartTitle.Text =tt12 #改变标题文本
chart1.api[1].SetElement(301) #x轴标题
chart1.api[1].SetElement(311) #水平的y轴标题
chart1.api[1].SetElement(305) #y轴的网格线
chart1.api[1].SetElement(334) #x轴的网格线
这里话重点咯,xlwings调用vba的api语法,我摸索的,大致形式,由于不是专业的程序员,描述可能不大准确
object.api[].expression
也就是,你操作表,object就是表,图就是chart对象,后面用api接上,然后对应的属性,比如chart,setlement()就是chart的一种方法,里面的数字的含义docs已经给了,
所以不要问chart1.api[1].SetElement(101)为什么是显示图例,而305是显示网格线这种问题Excel Visual Basic for Applications (VBA) 参考docs.microsoft.com
chart1.api[1].Axes(1).AxisTitle.Text = "wavelength(nm)" #x轴标题的名字
chart1.api[1].Axes(2).AxisTitle.Text = "power(dBm)" #y轴标题的名字
chart1.api[1].Axes(1).MinimumScale=1500 # x 坐标轴最小值 1500nm
chart1.api[1].Axes(1).MaximumScale=1570 # x 坐标轴最大值 1570nm
chart1.api[1].Axes(2).MinimumScale=0 # y 坐标轴最小值
chart1.api[1].Axes(2).MaximumScale=1.3 # y坐标轴最大值
chart1.api[1].Axes(1).MajorUnit = 10 # 坐标轴间隔
chart对象的axes子对象,以及axistitle方法的设置,axes(1)代表第一个坐标轴,(2)代表第二个轴,(3)就是次坐标轴,其余类推
总有水友会问了,如何快速找到自己所需要的的对象的方法呢,俺也不想一直看文档,答主你平时怎么找到的呢,
这里有个小诀窍,既然是通过调用VBA的api,那么通过VBA的录制宏就可以快速找到自己所需要的API接口方法
点开excel宏录制
然后请进行你的操作,比如我设置坐标轴的范围,设置完了,结束录制,打开宏,进入编辑界面
然后就进入了VBA的开发界面,找到自己要的函数方法对象就可以了,
那么我在xlwings要用的就是chart的axes的MaximumScale,怎么样学会了吗水友们
chart1.api[1].Axes(2).MaximumScale=8 #设置x轴的最大值是8
结尾,愉快的摸鱼,给了三天时间处理数据,其实写代码花了一下午,跑程序半小时,摸了两天,其实时间多出来也没用,都在玩手机,还不是单身狗一只,明天就是520了呜呜呜。。