本文不谈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了呜呜呜。。