首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

代替VBA!用Python轻松实现Excel编程(文末赠书)

大家好,我是小F~ 面向Excel数据处理自动化的脚本编程,目前主要有VBA和Python两种语言可供选择。 从上世纪90年代到目前,VBA一直是Excel脚本编程的主要工具。...这几个包小巧灵活,但是功能上有明显的不足,无法与VBA媲美。使用win32com和xlwings等包,VBA能做的Python都能做,但是这方面的资料很少,特别是语言参考这样一些最基本的文档缺乏。...xlwings包将Excel对象模型中一些常用的功能使用新语法进行封装,其他功能用API方式进行调用。但实际上,使用API方式可以以类VBA的语法完成几乎所有的编程。...,或者设置表格的属性等,就像VBA的操作一样。...下面分别用VBA和Python获取工作表中数据区域末行的行号。其中,sht为指定的工作表对象。

5.9K30

对比VBA学习Python,让办公更自动化!

这几个包小巧灵活,但是功能上有明显的不足,无法与VBA媲美。使用win32com和xlwings等包,VBA能做的Python都能做,但是这方面的资料很少,特别是语言参考这样一些最基本的文档缺乏。...所以,Python用户在了解Excel对象模型的过程中需要参阅大量VBA的资料,即他们有快速掌握VBA语言的需求和获取xlwings基础性文档和使用手册的需求。...xlwings包将Excel对象模型中一些常用的功能使用新语法进行封装,其他功能用API方式进行调用。但实际上,使用API方式可以以类VBA的语法完成几乎所有的编程。...,或者设置表格的属性等,就像VBA的操作一样。...下面分别用VBA和Python获取工作表中数据区域末行的行号。其中,sht为指定的工作表对象。

3.8K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    学VBA还是学Python,这不是个问题!

    这几个包小巧灵活,但是功能上有明显的不足,无法与VBA媲美。使用win32com和xlwings等包,VBA能做的Python都能做,但是这方面的资料很少,特别是语言参考这样一些最基本的文档缺乏。...所以,Python用户在了解Excel对象模型的过程中需要参阅大量VBA的资料,即他们有快速掌握VBA语言的需求和获取xlwings基础性文档和使用手册的需求。...xlwings包将Excel对象模型中一些常用的功能使用新语法进行封装,其他功能用API方式进行调用。但实际上,使用API方式可以以类VBA的语法完成几乎所有的编程。...,或者设置表格的属性等,就像VBA的操作一样。...下面分别用VBA和Python获取工作表中数据区域末行的行号。其中,sht为指定的工作表对象。

    2.7K50

    学VBA还是学Python,这不是个问题!

    这几个包小巧灵活,但是功能上有明显的不足,无法与VBA媲美。使用win32com和xlwings等包,VBA能做的Python都能做,但是这方面的资料很少,特别是语言参考这样一些最基本的文档缺乏。...所以,Python用户在了解Excel对象模型的过程中需要参阅大量VBA的资料,即他们有快速掌握VBA语言的需求和获取xlwings基础性文档和使用手册的需求。...xlwings包将Excel对象模型中一些常用的功能使用新语法进行封装,其他功能用API方式进行调用。但实际上,使用API方式可以以类VBA的语法完成几乎所有的编程。...,或者设置表格的属性等,就像VBA的操作一样。...下面分别用VBA和Python获取工作表中数据区域末行的行号。其中,sht为指定的工作表对象。

    2.9K40

    搭载AI之后的表格插件又有哪些新的改变

    在《大火的ChatGPT与SpreadJS结合会有哪些意想不到的效果》一文中提到ChatGPT插件的一个明显的问题,那就是“返回的结果格式可能插件也无法进行分析使用,从而是使得后续的操作无法继续执行”。...对于复杂的问题可能并不能准确返回结果,同时返回的结果格式可能插件也无法分析使用。...虽然有换行等符号可以解析所需要的行列值,但是稳定性十分不确定,程序很难直接使用。 通过使用Function calling,数据透视表的建立就会变得非常简单。..., GC.Pivot.SubtotalType.sum); 获取SpreadJS透视表结果如下: let ptRange = pivotTable.getRange().content; let ptData...接下来可以发送新的请求让GPT对数据做进一步的分析处理,当然对于一些系统操作,我们做到步骤2就可以了。

    20310

    千万别踩,JDK中的5个坑,否则别说你不知道

    比如:今天早上我们查了一笔订单没有退款,查了一早上最终才发现是同事写的代码的BigDecimal 的 subtract 方法的值没有做非 null 判断处理,导致程序抛出了空指针异常,看似简单的异常却直接无法让很多订单退款...开发第一时间看了代码,觉的没有问题啊,为什么短信内容会出现用户名为null呢,不是经过了非空判断的吗?...后来经过定位发现了问题所在:首先用户的名字里有特殊的emoji符号,数据库写入的时候有部分写入失败,因为当时的数据库字符格式并无法兼容emoji,而获取的时候因为这个问题值为null了,接下来是重点,请打点好精神...但是一旦程序中的数据出现以下情况,如果用Bigdecimal来接受前端的参数,而前端的参数是用户输入不确定的,一旦出现如下的数据,我们来看看结果。 执行结果一看,居然报错了哎!...(); 这个list并不具有add、remove元素的能力,我猜想是因为jdk设计之初的想法是将这个list作为一种只读的list,并不提供数据的写入能力,因此它仅可作为一种 空值返回,无法进行删除

    52650

    Java反射

    鲁班: 我知道了,反射就是运行的时候知道这个对象能不能调某个方法。 安琪拉: 不止如此,反射就是对于任意一个对象,我们能够运行时访问它的方法和属性。 鲁班: 为什么强调运行时?...安琪拉: 那你继续说说上次你的需求。 鲁班:你说我最近接到了一个需求啊,要在下路把对方每一波过来的小兵做标注,只有遇到特定的小兵,我才开火。 安琪拉: 那这些小兵有什么特点呢?...安琪拉: 我们列一下有几个变量: 对象不确定、提取的属性不确定、 提取属性的个数不确定、属性值不确定,最后是要做的后续业务处理逻辑不确定。怎么把模型做的足够通用呢?我们来设计一下。...这里用反射获取到属性的get 方法,然后调用get 方法获取属性值,和预期值做比较,这里 getReadMethod 方法为了方便说明做了简化,很多情况没写进入,比如属性是boolean 类型,get方法前缀是...鲁班:这样写有什么好处呢? 安琪拉: 这样就把原来的只对Batman 对象的属性做判断做了一层抽象,这样以后类似的需求都可以满足了。我们来做一下对比: ?

    77020

    被JDK坑的没商量?来试试这些方法吧

    比如今天早上我们查了一笔订单没有退款,查了一早上最终才发现是同事写的代码的BigDecimal的subtract方法的值没有做非null判断处理导致程序抛出了空指针异常,看似简单的异常却直接无法让很多订单退款...主要作用就是通过用户服务根据id获取用户信息发送短信,不过后来有客诉反应,最后的短信成了尊敬的"null"你好,xx等。...开发第一时间看了代码,觉的没有问题啊,为什么短信内容会出现用户名为null呢,不是经过了非空判断的吗?...,而前端的参数是用户输入不确定的,一旦出现如下的数据,我们来看看结果: 执行结果一看,居然报错了哎: 这就是BidDecimal的坑,一旦返回的结果是无限循环小数,就会抛出ArithmeticException...list,它是一个内部常量类: public static final List EMPTY_LIST = new EmptyList(); 这个list并不具有add、remove元素的能力,我猜想是因为

    46220

    惊呆了,JDK中这些常用方法也有Bug?

    比如今天早上我们查了一笔订单没有退款,查了一早上最终才发现是同事写的代码的BigDecimal的subtract方法的值没有做非null判断处理导致程序抛出了空指针异常,看似简单的异常却直接无法让很多订单退款...开发第一时间看了代码,觉的没有问题啊,为什么短信内容会出现用户名为null呢,不是经过了非空判断的吗?...= 这段代码是简化过的,主要作用就是通过用户服务根据id获取用户信息发送短信,后来经过定位发现了问题所在:首先用户的名字里有特殊的emoji符号,数据库写入的时候有部分写入失败,因为当时的 数据库字符格式并无法兼容...emoji,而获取的时候因为这个问题值为null了,接下来是重点: ?...(); 这个list并不具有add、remove元素的能力,我猜想是因为jdk设计之初的想法是将这个list作为一种只读的list,并不提供数据的写入能力,因此它仅可作为一种 空值返回,无法进行删除

    43820

    手把手教你用Pandas透视表处理数据(附学习资料)

    顺便说一下,你知道微软为PivotTable(透视表)注册了商标吗?其实以前我也不知道。不用说,下面我将讨论的透视表并不是PivotTable。...基本的问题是,一些销售周期很长(可以想一下“企业软件”、“资本设备”等),而管理者想更详细地了解它一整年的情况。 典型的问题包括: 本渠道收入是多少? 渠道的产品是什么? 谁在什么阶段有什么产品?...其实,并不严格要求这样做,但这样做能够在分析数据的整个过程中,帮助我们保持所想要的顺序。...实际上,大多数的pivot_table参数可以通过列表获取多个值。 pd.pivot_table(df,index=["Name","Rep","Manager"]) 这样很有趣但并不是特别有用。...不过,这样做有一个副作用,那就是必须将标签做的更加简洁才行。

    3.2K50

    记一次循环依赖踩坑

    下面我大概重现下场景,在Manager中有一个fun方法会根据传入的type使用相应的工具类处理数据,工具类是通过属性注入的UtilA、UtilB和UtilC。......我什么都没做,嘿嘿 return data; } } UtilA、UtilB和UtilC都继承了一个模板类Template。...Manager中通过属性注入UtilA,而UtilA的父类Template在构造函数中通过getBean获得Manger。可是问题来了,为什么我在本地能运行,而测试环境却报错了?...,Spring是无法解决的,会报错。...现在的情况是,我一处用了属性注入,而另一处用了构造器注入。所以猜想,在本地是先加载的Manager,先做的属性注入,所以不报错,而测试环境是先加载的UtilA,先做的构造器注入,所以产生循环依赖错误。

    1.3K70

    设计模式系列 - 单例模式

    开篇我就给大家一个思考题:为什么不用静态方法而用单例模式? 问题的答案我会在最后公布,大家可以带着问题看下去,看看大家的思考是不是跟我一样的。...提供一个公开的get方法获取唯一的这个实例 那单例模式有什么好处呢?...Singleton getInstance(){ return instance; } } 之所以叫饿汉式大家可以理解为他饿,他想提前把对象new出来,这样别人哪怕是第一次获取这个类对象的时候直接就存在这个类了...而懒汉式呢我们可以用在不怎么热的地方,比如那个数据你不确定很长一段时间是不是有人会调用,那就用懒汉,如果你使用了饿汉,但是过了几个月还没人调用,提前加载的类在内存中是有资源浪费的。...我们的电商系统中就有很多类,有很多配置和属性,这些配置和属性是一定存在了,又是公共的,同时需要在整个生命周期中都存在,所以只需要一份就行,这个时候如果需要我再需要的时候new一个,再给他分配值,显然是浪费内存并且再赋值没什么意义

    49320

    kotlin修炼指南7之泛型

    ,再传入doTalk函数,这时候,编译器报错了。...我们来思考下,为什么它是可读的,通过out修饰之后,我们能保证,加入List的数据都是Person的子类,所以,List读取出来的实例类型,不管是哪个子类,都可以转为Person,也就是基类,所以可以通过它来调用基类的函数...extends Person> family) {} 可以发现,泛型的协变,实际上是控制了类型的上限,但返回的具体类型,是不确定的(?...代表未知类型),这就是为什么在协变后的参数中,无法执行写指令的原因,因为参数的类型,可能是List,也可能是List,所以无法确定是哪一种类型,自然无法写入。...泛型的实例化 由于Java会在编译期进行泛型擦除,所以我们无法对泛型来做类型判断,比如下面的代码。

    65030

    Java异常处理--啥是异常?

    步骤 1 看一个例子 Customer cst = null; cst.eat(); 我声明了一个Customer变量,但是,没有实例化就调用它的方法,会发生什么呢? ?...image 报错了,其实这个不叫错误,虽然我们口头会说报错了,但其实这个是jdk帮我们抛出了空指针异常。 NullPointerException 是什么?...image RuntimeException又继承了Exception,Exception可以认为是最顶层的异常。这个抛异常的行为是jdk帮忙做的,异常的好处就是告诉我们代码哪错了?...上个步骤,空指针异常的抛出不是我们做的,是jdk做的。那么,我们自己怎么控制这个异常呢?...步骤 3 异常是向下兼容的 假如代码很长,我也不确定到底有什么异常,就可以用所有异常的父类 -- Exception,这是最赖皮和偷懒的做法,但是很多开发人员都喜欢这么做。

    1.2K10

    做程序员的这五年

    到昨天为止,做程序员,已经整整五年。最近半年来,我时常思考我走过这五年,反思我的职业工作,反思我的生活,我选择错了很多,也做错了很多。...以前的我,是不知道怎么回答的,也不在意,你叫我做什么我就做什么。而现在,我会认真了解自己能做什么,想做什么,想往哪个方向走,薪酬不再是最需要考虑的事情。 懂得自己要做什么,老板想让自己做什么。...我如今做的产品,虽然是行业里最早投入研发的,但公司没有能够像阿里、腾讯这种大公司做推广,一直都默默无闻。虽然后来有点起色,但等到大公司也开始着手做这一类产品,就被远远的抛下。...对于后一种,我没能有什么建议,对于前一种,我的建议是,去冲去闯,无论是工作还是生活。我这一类人,倒也是另一种典型的分类,似乎有很多选择,也似乎没有选择。...第一,因为对未来的不确定性,没考虑好在哪座城市长久生活,总是会担忧地域上的不合适。 第二,不主动,是最致命的。这是个人性格所致,我不太习惯与陌生人相处,怕麻烦,潜意识里会去避免麻烦。

    60270

    我们为什么要学习TypeScript ?

    使用不存在的变量、函数或成员方法 把一个不确定的类型当做一个确定的类型处理 在使用null或者undefined的成员,JS开发错误排名第一个就是它 当一个函数返回一个对象,这个对象里有name属性,...但由于程序出错,没有返回对象,再使用name属性就会报错,如下: 在开发的过程中,会遇到各种各样的错误,由于我们是人,不是机器,没有办法避免这样的错误,既然没有办法避免,那好歹在出错的地方提示我一下啊...JavaScript设计之初只是为了补充Java的,在浏览器上做一些小的效果,并不是为了做大型复杂项目而开发的,文章开头的小例子出了点错误,这还仅仅只是两个函数,大型项目中写的函数何其多,这就增加了出错率...: JS语言本身的特性,决定了该语言无法适应大型复杂的项目 弱类型:某个变量,可以随时更换类型 解释性语言:错误发生的时间是在运行时 因此,前端开发中大部分时间是在排错,而这些不起眼的错误占据了我们大量的时间...好了, 以上就是我的分享,希望小伙伴们点赞 支持一下哦~ ,我会更有动力的

    66330

    设计一个类使其具有动态属性,承接灵活可变的动态JSON

    本文介绍的实现上本质也是如此,看到这里你是不是已经没兴趣往下看了,兄弟,先别着急,如果仅是样我也没必要写这个了。这里介绍的是具有良好的动态属性的能力,看完本文,你会获得很大的收益!...,你知道这个属性名的类型吗 bird.getAttr("fuck"); } } 从上面的示例中,你无法知道属性 “fuck” 的具体类型,这就是华丽的简洁。...无论是普遍的还是较好的在动态属性的实现方式中,我们的下一任维护者无法很快的知道这个属性的确切类型。因为属性太动态的原因,为了可维护性我们需要尽量不要这么做。...(就算那些家伙忘记写类型注释或者说写错了类型注释,也没关系) 业务类 BirdAttrOptionDynamic 这个是我们自定义的一个业务类,只需要实现 AttrOptionDynamic 接口就能具备动态属性的功能...对组合的说明 我们增加了两个类 AttrOption 和 AttrOptions,本来一个 map 可以解决的事为什么要多增加两个类呢?

    6610

    使用 Moq 测试.NET Core - Why Moq?

    在有不确定性依赖项的情况下进行测试, 有些依赖项有不确定性, 可能无理由的造成测试失败, 这时候就应该使用mock版本的依赖....添加依赖 这时, 有一些需求的变化, 球员转会审批前, 需要通过体检. 首先在转会申请类里面添加两个球员的属性: ? 然后添加一个体检的接口: ? 这两个方法的作用是一样的, 但是调用方法略有不同....在单元测试类里面, 我为转会球员添加了这两个属性, 但是审批类会报错, 因为没有加入依赖项: ?...所以测试的时候需要注入这个依赖项IPhysicalExamination, 但是PhysicalExamination类还没有做完(里面的方法都没有实现), 所以我们无法new出来这个类....这时, 项目是不报错了. 跑单元测试, Run All: ? 测试失败, 抛出NullReferenceException. 而这个异常导致了测试无法正常进行.

    3.1K30
    领券