最近工作中突然遇到一个序号排版问题,十万火急的那种,大概是有几十万条数据需要排好序然后打印出来。为了方便打印,需要将序号排成以下格式:
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075802171927348224156.webp)
这个功能类似于word的分栏,我在word中示范一下:
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075802171927348230169.webp)
由于数据量太大,无法把几十万条数据粘贴到word中做分栏,因此只能在excel中排好版进行打印下面和大家介绍下我是如何解决这个问题以及这个问题有哪些可行的解决办法 一开始,本着一个技术人应有的搜索和动手能力,我去网上搜有没有类似问题的解决办法,关键词大概是“excel超长数据 分栏打印”,多试几遍就能找准关键词,就像写代码遇到问题去网上找解决方法一样,结果真的搜到了同样的问题以及解决办法:。
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075802171927348270898.webp)
以下是解决办法:
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075802171927348254492.webp)
写这篇东西时试了一下,竟然成功了...其实只要算出第一列,后面几列可以在第一列的基础上加上一个每页的行数就行。感兴趣的读者可以研究下这个超长的公式。
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075803171927348350362.webp)
可惜当时真的比较着急,自己没耐心地去试一下,而是转向风控群和数据分析群里求教各位群友,江湖救急大家都很热心,一会就出谋划策想了很多办法,有个朋友甚至亲手做了个案例成功模拟了下,非常感谢,我将这个技巧性很强、复杂度不高的方法介绍给大家。
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075803171927348324530.webp)
衍生出页数和栏数两列,页数衍生中这个减去0.1就很妙,这个小技巧不经过学习基本上是很难自己想出来的。然后栏数是对页数进行了取余操作。
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075804171927348492081.webp)
然后进行3个数据透视,分别筛选栏数为0、1、2就OK了整个过程没有上面的复杂公式,思路清奇巧妙,有种用简单的方法解开了很难的数学题的感觉,这才真是把excel玩明白了,灵活应用简单的技巧解决复杂的问题。
然后由于除了序号外还有对应的ID,在上面透视的基础上可以进一步操作完成
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075804171927348457884.webp)
将栏数、a、id列都放在行这一项中,设计->报表布局选择(以表格形式显示)->分类汇总(不显示分类汇总),就可以做成上图显示的效果,任务完成 打印的时候需要按照设计好的行数来分页打印,点击视图->分页预览,然后手动调整一下,或者页面布局->页面设置中调整缩放大小和页数,达到按排版打印的效果。
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075805171927348598528.webp)
以上就是群友给我演示以及讲解的案例,不得不说还是学到不少excel的技巧,再次表达感谢的同时,也再次体会到“三人行,必有我师焉”的道理,所有人都是可以学习的对象 此外,群友还提出了一些其它的思路,比如用offset函数、python循环、numpy数组处理,其实我的第一想法也是用pandas做两层循环然后拼接,但是时间较紧写起来比较耗时间,不是最佳的解决办法。
今天试着尝试了下用代码解决的办法方法一:用numpy的数组df1=pd.read_excel(df.xlsx,sheetname=Sheet1)# 将dataframe转为数组df1_arr=df1.values
# 初始化一个0数组a=np.array([[0,0,0]])for i in range(0,len(df1_arr),12): b=np.array(df1_arr[i:i+12]).reshape(4,3)
# 对每次循环的结果进行拼接 a=np.concatenate((a,b),axis=0) # a=np.r_[a, b] # a=np.vstack((a, b)) 效果都一样
输出的结果如下:
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075805171927348543363.webp)
可以看到这个顺序是横着增长的,这种方法的好处是不用再打印的时候去调节每页的个数,其实不用这么写代码这么麻烦,用excel上一行加3,自动填充一下即可,然后再匹配下ID列,这才是最简单快捷的办法,大道至简(所以我之前都在忙啥玩意儿......)
方法二:用pandas的dataframe 写了一会没写出来,大致思路是做两次循环,可以用dataframe中的多层索引或者嵌套的字典来存储数据,我卡在了横向拼接的时候1-4、5-8两列无法直接进行横向拼接这步。
感兴趣的读者可以自行尝试,可能我实现的方式复杂了
![](http://ldjg88.com/zb_users/upload/2024/06/20240625075805171927348510545.webp)
总结完成,其实我觉得还可以增加一个用SQL处理的办法,这样才是三个工具都完整了我们做数据分析时,excel/sql/python是分析师必备的三件套,很多人往往会觉得python比较高级,excel比较low,这篇文章就很好地证明了excel也很强大,简单快捷,其中也不乏一些小trick。
在工作中遇到问题时,能快速解决才是最关键的,并不是你用的方法、工具是否高大上不管黑猫白猫,能捉老鼠的就是好猫【作者】:Labryant【原创公众号】:风控猎人【简介】:做一个有规划的长期主义者【转载说明】:转载请说明出处,谢谢合作!~。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。