震惊!当Python遇到Excel后,将开启你的认知虫洞

震惊!当Python遇到Excel后,将开启你的认知虫洞

本文主要内容:

  1. Excel,你为什么如此强大
  2. 软件开发也需要团队作战
  3. Excel的集成方案演化
  4. macOS特有的集成方案:applescript
  5. Python与Excel集成,有哪些好处
  6. 了解多个技术领域,s S M F可以间接提高自X t / M &己的IQ
  7. 提高开发效率的利器:生态渗透
  8. 上代码:Python到底如何与Excel交互
  9. 用Python替代VBA

本文主要讲Python与Excel的关系以及集成方案,Office家族的其他成员,如Word. y v、PowerPoint与Excel拥有类似的功能,Python同G ` h j / E样可以与Word、PowerPop ^ 0 H ) $ , -int等Office成员! } g F结合,这些内容我以后会写文章讲解。

我相信看这篇文章的大多数人都是程序员。在广大程序员的眼里,Exc% O 6 qel以` K } z 5 = i及Office家族的其他成员完全不能与Python、Java、Sprint Boot这些技术相比。Office被贴上的标签就是:非专业人员的工具。是由那些体制内{ ) } C F的人、会计、业务人员x U @ N J B Q z使用的工具,其实这是对Excel的最大误解。
1. Excel,你为什么如此强大

Excel从一问世开始,定位就是. Z R t 1 h c `横跨办9 k U W w | s ~ }公和开发两界。在) : R a t ]上个世界末推出的Excel5.0(那时还没有office这个产品套件)就已经支持VBA了,那可是在Win32下(一种基于dos的shell,并不属于真正的操作系统)。尽管有些原始(以现在的眼光看),但在当时却显得极为先进。因为Excel(以及同期的Word)是人类史上第一个内置领域特定语言(DSL)的民用系统(可以被各个领域的人使用的系统)。正是因为有S t * j [ ~ b了VBA,Ex( F , % 0 ! . `cel才显得非常强大。

可能有的程序员会问,即使ExcelX / y . y n支持VBA,可以进行编程,也只不过是完成一些自K F ) + `动化操作而已。VBA的q t b E T ^功能完全不能与Python、Java、C#、C++这些被广大程序员熟知的编程语言相比,更别说成为编程领域P & ~ 4 e ~ U G的主流了。没错,如果单凭VBA本身的` d - ^ u k确无法与这些流行的编程语言相比,q V , - V _ n | X但要知道V I 4 o,VBA和Excel本身可以与其他开发工具融合,也就是说,可以让VBA和Excel成为自己系统的一部分,这就显得非常牛逼了。
2. 软件开发也需要团队作战

那么为什么要将Excel与其他系统结k 7 A s e 7合呢?其实在我们创业时、在公司完成一个项目时,甚至在参加篮球比赛时,都会高频率提到一个词:团队。 现在也流行着一句话:没有完美的个人,只有完美的团队。也就是说,没有人可以什么都会,^ y i什么都擅长,就算是天才达芬奇也是如此。但团队就不一样了,即使某项工作团队里没人能做,也可以扩充团队成员,& v ~吸引能做这项工作i U G | E G + .的人加入团队。

其实在开发软件的过程中也同样是讲究团队作战的。不U / ^ ? | o 2 d管我们使用V 5 6开发工具有多强大,用户社区由多庞大,都无法规避一个事实O g / M K `:任何技术都不可能适合完成所有的工作。 当然,还有另外一种说法就是A # Z h c尽管某种技术可以完成某项工作,但并不是最好的选择。

现在回到Excel上来。首先要知道Excel擅长什么,对,没错,Excel擅长表, L L W ~ O K 9 B格和图表的制作。尽管有非常多的开发工具也可以制作表格和图表,但很显然,Excel是其中最好的(主要用门槛、易p # / q v Y C s用性、功p ; K ) % T I p能和用户基数的综合指标来衡量)。所以,如a ) ^ a e ]果某一个系统要求将数据转换为# l 9 / n表格和图表,那么这项任务交给Excel来完成是再合适不过了。

  1. Excel的集成方案演化

在不同的时期9 z m M,Excek W / k n O Ul的集成方案也不尽相同。在Excel的大眼夹时代(那时还是Officec L [ z9C q I `7和Office2^ * o $ i k000的时代),微软与开源世界还水火不容,我也还处于学生时代。在{ Q # v那个时代,Excel只能与Windows下的开发工具融合,其中主要的开发工具包括微软的VC、VB、以及Borland(现在已经消失)的Delphi、C++ Builder等。

最初的集成方案有如下3种:
可视方式:j L n 7 o B Q a通过OLM 9 ] R a 1E组件将Excel直接嵌入窗口中,其实就相当于拥有了一个高级版的表格编辑器
VBA方式:通过ActiveX技术创建Excel.Applicaiton对象(一般是CreateObject函数),然后就可以任意调用VBA的API了,我比较喜欢这种方式。通过这种方式,可以将系统中的数据按着一定的格式直接传输到Excel中,给用户提交的是包含表格数据的Excel文档。
反客为主方式:这种方式将Excel作= I J / *为主体。也就是说,主要的操作界面是Excel,在Excel中调用或访问其他系统。例如,很多年前我做过一个基于Excel的报表系统。该系统分别使用Delphi和Excel实现。Delphi做的管理系统,将数据发送给Excel。但需要用户自己调整报表格式。我采用的方案是通s d ] 1 X ? 5 ^ 1过Excel的VBA实现表格的格式设置。其中有部分功能需要/ 2 | :访问SQL Server数据库,以及完成与Delphi实现的系统类似的功能,这部分功能使用了Delphi封装的Dll(COM组件),然后通过Excel反过来调用这些DLL。最终用户使用的方式是用主系统完成大部分工作。如果想调整Excel的报表样式,可以直接用Ex4 ? a 8 h i Ecel来完成(会在Excel上提供一些自定义的菜单和按8 0 S E y @ 0 &钮,现在通过加载项【Add-ins】实现)

不过随着时间的推移,现在的微软已经拥抱开源和其他系统。所以Excel也不仅限于Windows。在macOS上也可以完成在Windows上的大多数工作,甚至Visual Studio也推出了macOS版本。而且.net core也可以同时跨Windows、macOS和Lin3 + wux三个平台,SQL Server也开始, Y , ) ` Z k k !支持LiK ! a k ^ ^ Knux。以后我们会在更多的场景看到微软的身影。

既然Excel已经支持了macOS平台,就需要采用跨平台的方式与Excel集成。当然,前面I , 3介绍的几种方案现在仍然可用,但仅限于Windows平3 d d - i L ! F台。不过我们无法预测用户到底使用哪一个平台,所以应该尽量使用跨平台方案。

目前主要的跨平台方案有如下3种:
直接修改xlsx文件
通过VBA间接调用其他编程语言
使用office.js

第1中方式有很多编~ D p b V r 5 s r程语言都支持,例如,Python、Java、Julia、Go、JavaScript。几I n e L ~ T }乎你能想到的编程语言,都有支持xlsx格式的库。这里只讨论Python。如果想了解更多关于集成EU u 2 p $ % 8xcel的技术,可以关注我的6 6 d { ` : + X {公众号:极客起源。

在Python语言中,支持Excel文件格式的库非常多,如非常著名的openpyxl、xlsxwriter等。通v { D ] * w P过这些库,可以在不依赖ExceD j ] F kl环境的情况下,生成xlsx格式的文件。不过这些库基本是只是生成Excel文件,并不能更好地利用VBA以及更高级的功能。由于Excel文件格式非常复杂,完全支持比较困难,所以这些库只是支持1 C w X一部分Excel的功能,但这些功能对于绝大多数需求已经足够了。

第2种其实a = D r o是一种取巧的方式,. # * X o o = 7 B通过VBA做桥,调用其他编程语言,相当于用其他编程语言代替了VBA& ; { ; z ! I i。这其中典型的就是xlwings。尽管这种方式从表面上看可以直接在Excel中像使用VBA一样使用这些编程语言,但从本质上看仍然是直接写xlsx文件。功能其实与第u H N p / ! F1种方式相同,因为这并不是官方支持的功能。

第3种W ? V k 1 {是office.js,这是微软官方g O F e w ^ ? X h提供的一个基于JavaScript的程序库。基于Node.js,可以用JavaScript完全取代VBA实现Excel以及OH @ q R I z ? Z &ffice其他成员的加载项。office.js可以在Electron、Web应用以及大多数基于JavaScript的场景中使用。关于office.js的内容我以后会写文章详细描述,对office.js感兴趣的同学也可以关注“极客起源”公众号,会不定期更新这方面的内容。

  1. macOS特有的集成方案:applescript
    除了跨平台解决方案外,在macOS上,u d a b 4 i Q还支持使用applescript与O; # Y 9 y *ffice(Excel、World、PowerPoint等)交互,这些内容我以后再撰写文章详细讲解。如果要了解excel applescript6 ; e $ - Z f ? api,可以参考Excel Reference。从效果来看,applescript操作Office与在Windows下通过COM组件操作Office类似,可以5 p H w完全控制Office,只是applesc] ; e - x f l wript的语法更接近Z 2 ] v自然语言。

下面的applescript代码会创建一个新的Excel文档,并将其保存为first.xlsx文件。

运行后,会看到一个打开的Excel文档,并且已经保存为firstx.xlsx文件。

5. Python与Excel集成,有哪些好处

Excel对于Python来说,可以将Excel看做是一个可编程的大组$ G ? z J j O G C件。这个组件的主要功能就是可以制作任意复杂的报表和图表N e =。尽管Python有很多模块可以制作报表u F .和图表。但这些 K f , I X a r模块的功能和效果完全没办法与Exc! } 8 xel相比。所以将PythoQ S B & @ E b :n与Excel结合的最大好处是可以快速完成制作报表的任务,而且效果杠杠滴。

将Python与Excel相结合,其实还会引出另外一个思考,就是成为专家还是通才的问题。我听到有很多程序k [ I员说,要将某种语6 ( i P x i L言搞通,如PHP、Python、Java等,然后就可以很轻松解决所有的问题。结果真是这样吗?

很久以前,我听过一个关于微软的故事(相信很多人也听过),在微软0 H W g { - Xb ` ( j I @ R H T一个几十人的团队,花了好几个月还没完成一个项目,听说是遇到了某些难题。这时有一个老程序员(据说至少50岁以上)将自己关在办公室里一个星期,搞定! 我们先不管这个故事是真是假,那么e u j 8 J从理论上来说,是a + = = ?否有这个可能呢?其实如果光看编程速度,再牛叉的程序员,也不可能比普通程序员快几十倍,更何况数百倍了。但还有另外一种可能,就是这名老程序员使用了完全不同的方法^ $ R 5 d ?,绕过了大多数影响效率的因素,例如,! 8 | [ G I使用了不同的工具,采用了不同的转换方式,甚至使用了不同的设计理念等等。这就不是能力问题了,而是认知的问题。我将其称为“认知虫洞”。
所谓“认知虫洞”,@ 0 f是指通过某种方式很难完成某项工作,但通过另外完全不同,甚至是颠覆三观的方8 7 } v } # ( A式,可以用极短的时间达到W c Q目的,而且效果极好。就像找到了可以穿越浩瀚星空的虫洞。这也有点像数学中的“等价替换”。

可能这个微软的例X u * D 5 o 7 v子离我们太远,下面举一个我自己的关+ 6 t P & 9 T于Excel例子,很多年前,我还在国内某大型软件公司作高级程序员。团队需要制作大量的报表,使用的主要开发工具是Delphi、后端是SQL Server数据2 X M J ] @ O 库。Delphi本身有自己的报表系统,叫QuickReport。功能是很强大的, X Q f ? K P,但问题是,做起来太费劲R L ; R。例如,要画表格线时,如果一不小c ; & J = q 9 心将某根线拖到了别的地方,而且被其他东西覆盖,那你就找把,还必须要找到,否则打印出来的表格上就会莫名其妙多了根线。结果p @ P D *团队好几个人弄了好H L 0 e几天还没弄完(也包括我)。后来我实在不想这么弄了(因为买了几张影碟,着急回家看电影,不想加班),于是想到了利用Excel或Word来完成这个报表系统。通过Delphi传输数据。

说干就干,花了不到2个小时,所有的报表全部1 U p c i 4搞定(只有我一个人 = c o @ T哦),几个人几天都没搞定的东西,我自己不到2个小时搞定,这当然不是我编程速度快了几十倍,而是处在了不同的维度,使用了完全不同的技术来实现,用QuickReport需要一根线一根线的画,而使用Excel,我不需要画线,只需要用SQL语句查询出数据,然后将y 6 v这些数据发送给Excel即可。单单用了一个Excel,速度就提高了这么多H p R d 4 W a,如果系统中很多部分都使用了类似的技术,那么编程效率提高数百倍,甚至上千+ N d # E f倍,也不是没有可能的。

  1. 了解多个技术领域,可以间接提高自己的IQ

可能有的同学会问,既然可以将多种技术结合起来大幅度提高开发效率,那么为什么不通过团队合作的方式来完成了,通常一个人无法学会那么多技术。其实这就是一^ D ; l 7 ~个认知的问题,[ H R { i团队合作只有在项目所采用的技术被确定后,例如,如何集成多种技术,才可以发挥作用e a ?。问题是,如果多种知识分散在不* A Y U V i H同人的大脑中,很可能没有人意识到应该去这样融合多种技术,就更谈V 4 r W% , *上团队合作了,就d 6 l p i像你要探索宇宙,首先你要知道存在宇宙这种东西,否则怎么去探索呢?n y r I ) ^ v 我将这种现象称为“认知孤岛”(相对I J 3 R & m = h于“认知虫洞”而言),就是说并不是没有能力去做,而是压根就没有意识到应该这样做(由于知识的缺+ P ! 2 k v乏、同时导致想象力的受p k { u ? y H E限)。

为什么达芬奇那么牛逼,除了聪明之外,达芬奇还横跨多个完全不同的领域,正是因为对生物学和解刨学E m / u D #的了解,蒙娜丽莎的画像才会那么自然,栩栩如生,因为达芬奇对骨骼、肌肉的构造非常了解,这是其他任何画家都无法比肩的c ! e k t { _ a。如果你在某一个领域排名U & % 2 H前20%,而在另外一t w = J /个领域排名也是前20%,那么9 p ~ a =如果需要两个领域的知识来解决问题时,你就会排名前4%(29 : * ~ c 0% * 20%),如果是3个领域就是百里挑一。如果是6个领域,那j D H B 5 W p c就是万里挑一,据说达芬奇涉足十多个领域{ Z o U *。由于自己和自己沟通的成本为0,t z v A F `所以只有拥有足够多的知识,并且有融合他们的能力,那么你就是下一个达芬奇!
我们可以举个数学与Python的例子:

如果我们的程序需要计算某个表达式的定积z 0 b 4分(例如y = 2 * x从! h . & 9 a0到1的定积分)。

假设我们使用的是Python语言,并且不太清楚有什C b X o j b ` 9么库可以自动计算定积分,那么采用的方式就是利用数值计算的方式写程序去完成,计算定积分的数值计算公式比较复杂,可能不是在短时间内能完成的。不过要是了解sympy这个库,那就是几行代码j - S , J的事:
import sympy
x = sympy.Symbol('x')
f = 2 * x

开始计算定积分

print(sympy.integrate(f,(x,0,1)))
是不是很简单呢? 只需要了解一个API的用法就搞定了。

假设现在我们还有一个需求,要计算某个函数在某一点的导数(导数在深度学习中经常使用),而手头又没有必要的库(也有可能是不知道),那么只要了解导数的原理,就很容易通过几行代码搞定,这就属于高等数学的范畴了。
导数原理,右侧是导数的计算公式,

计算导数的函数

def derivative(f,x):
h = 0.0001 #n A N h _ x轴的增量,需要是一个很小的值,但要在浮点数精度范围内,通S 4 + R * Y 4常不能超过小数点后6位
return (f(x + h) - f(x - h)) / (2 * h)

待计算的函数1(M I M K U Jy =@ y x t - o { 2 * x)

def f1(x):

return 2 * x

import math

待计算的函数2( y = sin(x) * cos(x) / (sin(x) + cos(x)) )

def f2(x):

return math.sin(x) * math.cos(x) / (mat2 @ $ Yh.sin(x) + math.cos(x))6 m / D

print(derivative(f1,10)) # 1.t , k ? . $ [ L !999999999995338P - I r t o / K ^8
print(deriv3 ~ + _ & Yative(f2,123)) # -0.3318428256G I 2 h z = | W H92652

PS:对这些代码和高等数学不熟悉也没关系,这里我只是举个例子,后期我会写一些关于数学和编程方面的文章,详细解释这些好玩的东西,可以关注我的公众号:极客起源 ,会不断更新各种技术和数学文章,以及视频课b + A #程。

从这两个案例可以看出,在某一个领域需要非常费劲才能* 7 ) f ? I Z I搞出来的东西,在另一个领域其实就是helloZ P + } ~ Y | O i world。如果了解足够多的领域,那么完成很多工作,就会表现出天才的特征(这也是成为天才的途径之一,另一个途径是投胎)。

PS:Excel的功能不仅仅是制作报表,Excel还^ | G U M拥有强大的数据分析能力。所以如果将Python与Excel集成,就意味着Python将拥有了Excel的全部能力,相当于Python拥有了Excel的整个生态。我将其称为“生态渗透”。也就是通过集成或其他方式,一种技术可以直接或间接使用另外一种技术的全部或大部分资源。

  1. 提高开发效率的利器:生态渗透

在未来,支持生态渗透的开发方式会非常普遍,如果只是用了一些现成的库- | n或开源软件,并不能大幅度提高开发效率,但如果可以利用某些强大系统的生态,就不一样了。在未来,还会有很多支持“生态渗透”的开发工具。例如,我们团队研发的UnityMarvel,就是一款超平台开发系统。这里之所以I A G称为“超平台”,而不是“跨平台”,是因为UnityMarvel不仅仅可以跨操作系统平台,还可T e S以跨数据库平台,云平台、API平台、开源硬件、物联网等,以及支持虚拟SQL、客户端服务端一体化、柔性热更新、Office加载项、浏览器插件等新特性。因此称为“超平台”开发系统。并且自己研发了Ori编程语言(语法融4 { e K g J g / C合了Python、Java、Go等语言的优秀特性,但功能得到了前所未5 n & P r @ u p有的增强)。通过这些特性,可以用前所未有的规模利用其他系统的生态,要远比Python使用Excel的生态更完{ e ` C F E ` q美。W 1 W , 1 z n : _其他功能先不解释(等发布后我再写文章详谈),先说说UnityMarvel是如何跨数据库的。

所谓跨数据库(目前指关系型数据, 以后会支持文档L D } ^ p } X }、键值等NoSQL数据库),是指用UnityMarvel开发基8 d Q g U于数据库的应用并不需要事先确定到底用什么数据库(如MySQL、SQL Server、Oracle等),UnityMarvel内置了一种虚拟数据库,可以直接用虚拟数据库开发,在发布时,会要求选择使用的数据库,例如,选择MySQL或SQL Server。UnityMarvel会通过rosetta引擎将Ori语言的代码转换为支持MySQL的代码。关于数据库L % , L b / o 0 4的部分,主要是用过内置的一种虚拟SQL完成的,而且这种SQL语言是与Ori语言是融为一体的。例如,如果要从persons表中查询出id大于30的所有记录,可以直接这样写:

var result = SELECT * FROM persons

                             W, e ; WHERE id > 30;

result的类型是SQLSelect,将r/ M e ^ & w * u `esult赋给Grid组件,就会直接显示查询结果。当发布时,会将上面的代码转换为使用相应数据库(如MySg K } _ s / ) I 0QL、SQL Server)的特定编程语言(如JavaScript、Java等)的代码。这么做的好处如下:

  1. 不需要进行数据库选型,数据库是在发布时后期绑定的;
  2. 如果想切换数据库(例如,从MySQL换成Oracle),只需要重2 * ;新发布,选择相应的. . * - D Q数据库就可以了,不需要修改一行代码;
  3. 统一数据库接s t [ V口,开发人员并不需要了解各种数据库的细节,开发门槛低;
  4. UI与数据库交互非常容易,不必考虑各种数据库引擎和库,只需要直接将SA @ 0 4 MQL语句赋给与其交互的UI组件即可;
  5. 自动检测和去除大多数SQl S M A 3 m rL中的潜在风险,如SQL注入等R z ; | P
  6. 脱离数据库环X O z . e -境开发。例如,想使用MySQL数据库开发,但当前机器上并没有MySQL开发环境,又不想安装MySQL。这时仍然可以用UnityMX X c @ (arvel内置的虚拟数据库进行开发,然后发布即可,部署在有MySQL环境的机器上就可以成功运行了;
  1. 上代码:Python到底如何与Excel交互

在这一节玩点真格的,看一看Python到底如何与Excel交互。我们使用y d g 1目前最常用的openpyxl来完成操作。先看一个未处理的Excel表格 W H x 4 j 8 J H

上面这个表格是关于营业计划的数据,看起来很别扭,因为不H r E j m A |同层次的数据之间没有缩进,也没有背景颜色,甚至没有I , / Q o e [表格线。如果要将这个表格交给领n * 9导,估计领导会拿起块砖头砸过来!

领导最希望见到下面的表格:
这个表格看起来是不是很舒服呢!其实这个表格用Excel做起来也J P C并不费劲。不过仍然需要N步,这里就不详细解释如何用Excel来做这个表格了,现在来看如] E | L e ? k J何利用Python闪电般进行格式转换。

fromL J d + q m $ openpyxl.st: n l { E kyles import Alignment,Font,Border,Side,Color,PatternFill
import openpyxl

打开待转换的文件

workbook = openpyxl.load_workbook('原始表格.xlsx')

ws = woq # 3 H q jrkbook.active
table = ws['A1':'D11']

设置字体

ft = Font(name="黑体")
for rows in table:

for cell in rows:
cell.font = ft

调整行高(所有的行的高度统一设置为18)

for i in range(1,ws.max_row + 1):

ws.row_dimensions[i].height = 18.0

插入列

ws.insert_cols(1,1)

调整新插入列的宽度

ws.column3 1 Y / 0 h 4 H_dimen8 h t jsions['A'].width = 5

插入行

ws.insert_rows(1,1)

调整新插入行的高度

ws.row_dimensions[1].heightc M S F C s K U S = 10

文字左对^ k 0 1齐,数字右对齐

leftAlign = Alignment(horizontal='left',vertical='center')
rightAlign = Aq P rlignment(horizontal='right',vertical='g ! & a 7 P ocenter')
for row in ws.rows:

for cell in row:
# 数字,右对齐
if type(cell.value) == int:
cell.alignment = rightAlign
else:
cell.alignment = leftAN P - 6 |lign

调整列宽

ws.column_dimensions['B'].width =20
ws.column_dimensions['C'].width =9
ws.column_dimensions['D'].width =9
ws.column_dimensioi 3 I c $ns['E& 6 X j t V'].width =9
ws.column_dimensions['F'].width =4 # 让表格线出来一点

为表格添加边框

topBorder = Border(top=Side(border_style='thick',color='000000'))

            #bottom=Side(borl 2 ^ z r L uder_style='thick',color='k & , 000000')a r | Q V 6 .,
#horizontal = Side(boe r B @ ~ urder_style='thin: d ~ q a P ]',color='000000'))

添加表格顶边的粗线(包括最后没有L ~ v 7数据的列)

for col in range(2, ws.max_column + 2):

ws.cell(a 1 8 u i v :2, col).border = topBorder

bottomBorder = BordeT L $ S b @ } ir(bottom=Side(border_style='thick',coz 1 R )lor='000000'))

添加表格底边的粗线(包L } G 7 { * o括最后没有数据的列),这里需要加1,是因为前面绘制表格Z 0 n - H P顶边的粗线时,最大j I x z [ Y V 列的数量已经多了1@ | u R x

所以只需要加1即可

for col in range(2, ws.max_columU o y n b I { ] $n + 1):

ws.cell(w. h % g + ,s.max_row, col).border = bottomBorder

添加0 t w x : - [ #水平细线

horizontalBorm d R 3 } ~ nder) h , B q J E & = Border? 0 S * : A _ N R(top=Side(border_style='thin',color='000000'))
for col in r0 4 *ange ~ k 5 E S De(2, ws.max_column + 1):

for row in ra| h j 3 ?nge(4,ws.max_row):
ws.cell(row, col).border = horizontalBorder

单元格缩进

ws['B5'].alignmM D R #ent=Alignment(indent=1)
ws['B6'].alignment=Alignment(indent=1)
ws['B8'].alignment=Alignment(indent=1)
ws['B11'].alignme{ } X b dnt=Alignment(indent=1)

ws['B9'].alignment=Aligq f ~nment(indent=2)
ws['B10'].alignment=Alignment(indent=2)

设置文字颜色

blueFont = Font(name="Arial",color = '4169E1')
for col in range(3, ws.max_column + 1):

ws.cell(5,: K H o i + z col).font= blueFont
ws.c) s ^ 5 H 0ell(6, col).font = blueFont
ws.cell(9, col).font = blueFont
ws.cell(10, col).font = blueFont

设置背景色

fill = PatternFill("solid", fg5 & :Color="B0C4DED $ + y j")
for col in range(2d # t G e i @ @, ws.max_column + 1):

ws! g a.cell(4, col).fill= fU T ] p _ill
ws.cell(7, col).f( ` 0 D g V B h bill = fill
ws.cell(12, col).fill = fill

work} X 9 ! M ,book.save('转换后的表格.xlsx')

prinP , , K u (t('见证奇迹的时刻')

现在运行程序,当输出“见证奇迹的时刻”后,就会在当前目录生成一个“转换后的表格.xlsx@ p P 5 V”,该文件就是上图的效果,是不是很神奇呢?

从这段程序中可以看出,转换该表格需要多少步,代码并不复杂,大家可以根据openpyxl的文档研究。

  1. 用Python替代VBA

目前微软官方还没有将Python作为VBA的替代品,倒是将Java^ P y Z Script作为了另外一个选择(office.js),不过可以利用xlwings做一个折中。xlwings可以单独使用,也可以通过xlwings office加载项提供的RunPython函数运行Python代码。

现在有一个hello.py文件,代码如下:

import xlwings as xw
def hello_xlwings():

wb = xw.n ) . n ?Book.cm H 8aller()
wbv ) } - E 8 , G q.sheets[0].range("A1").va D 3alue = "Hello xlwings!"

在xlwings的安装目录有一个xlwings.xlam文件,该文件是Excel的加载项文件,也就是Excel| ( | 4 C Q k VBA的发行包文件。现在随便开启一个空的E 4 b QExcel/ d f N 0 ~ u W f workbook,然后点击“工具”>“ExceX , # 1lH O r + ! G加载项”菜单项,会打开如下图所示的对话框,找到xlwg M . t O Kings.xlam文件,并选中该文件。

然后在“开? x $发工具”选项卡中点击“Visua ^ q i w ) i ! `l Basi3 k @ v x dc”按钮(如下图所示),进入VBA编辑页面

最后引用xlwings库即可。

现在可以新建一个VBA模块,然后编写下面的代码:

Sub$ d + f Z test(U P + f 8 ) a)

 RunPython ("import  hello; myproject.hello_xlwings()")

End Sub
运行脚本,就会看到在“A1” 2 j S t { z的位置插入了Hello9 ~ S C e X R xlwings!

OKh p J Q F L,现在大家已经了解了如何使用Python与Excel交互,其他还有很多种方法,而且也不仅仅只有Python能与Excel交互,其实几乎所有的编程语言,1 1 h甚至是C语言,都有想用的LibrR H c n Z X K ? Hary可以与Excel交互。那就期待我下面的文章吧] $ G C
原文地址https://www.cnblogs.com/noM ) _ @ !kiaguy/p/13043865.html