python拆分excel表单,生成单独的excel文件,网上这方面的文章很多。但大多只讲主功能如何实现,让拆分后的表保持和原表单一致的格式,则鲜有人讲。本文通过调用copy库,完美实现带格式拆分表单,过程说明如下:

我们先看看带格式拆分和普通拆分的效果对比

原表样式:

普通拆分效果:

带格式拆分效果:

很显然,带格式拆分才是我们真正想要的。那么问题来了,如何实现呢?我们用一个案例说明如下,文末有完整代码。

调用选择文件对话框,选择要拆分的文件

通过调用tkinter.filedialog库,实现弹出选择文件对话框,选择指定文件进行拆分的操作,符合日常习惯。

import tkinter.filedialog as a # 导入调用文件对话框的库import osimport openpyxlimport copyif __name__ == '__main__': ff = a.askopenfilenames(filetypes=[('excel文件', '.xlsx')]) # 限定为只能选.xlsx文件 breakfile(ff) # 调用分解模块进行分解

注:可一次选多个文件批量拆分。其中:askopenfilenames,最后的“s”字符不能漏,不然就只能选单个文件拆分。

分解模块代码:def breakfile(fn): g = os.path.split(fn[0])[0] for gg in fn: g1 = os.path.splitext(os.path.split(gg)[1])[0] wb = openpyxl.load_workbook(gg) if len(wb._sheets) > 1: for sht in wb._sheets: wb1 = openpyxl.Workbook() ws1 = wb1._sheets[0] copyfile(sht, ws1) f1 = os.path.join(g, g1 + '-' + sht.title + '.xlsx') wb1.save(f1)

其中:save语句不能忘,不然看不到结果。结果保存在被拆分文件相同路径文件夹内。

复制写入单元格

def copyfile(sht, sht1): colwidth(sht, sht1) rowheight(sht, sht1) copycell(sht, sht1) for merg in sht.merged_cells: sht1.merge_cells(str(merg))

其中:for循环语句为根据原表合并单元格区域,将新表也设置相应的合并单元格。

根据原表设置新表列宽def colwidth(s0, s1): for k, co in enumerate(s0.iter_cols()): k = chr(k+97).upper() lk = s0.column_dimensions[k].width if lk == 0: lk = 8.38 s1.column_dimensions[k].width = lk

注意:此处有坑。

lk = s0.column_dimensions[k].width , 获得原表单某列列宽。当某列为默认列宽8.38时,lk得到的结果不是8.38,而是0。

s1.column_dimensions[k].width = lk ,将新表单某列列宽设置为与原表对应列宽相同,当lk为0时,会导致新表所有列列宽都是默认值8.38,而不是只影响当前列列宽。

所以,为了避开这个坑,我们提前用if语句对lk进行判断,将lk=0的情况,强行设置为lk=8.38,这样,新表的列宽才能与原表对应上。

根据原表设置新表行高

def rowheight(s0, s1): for i in range(1, s0.max_row+1): hg = s0.row_dimensions[i].height if hg == 0: hg = 15 s1.row_dimensions[i].height = hg

注意:0=15的逻辑和设置列宽时0=8.38的逻辑相同。

for循环用for i in range(1, s0.max_row+1):

若用for i, row in enumerate(s0.iter_rows()):,会造成最后一行行高漏设置。

根据原表设置新表单元格值和格式def copycell(s0, s1): for i, row in enumerate(s0.iter_rows()): for j, cell in enumerate(row): s1.cell(i+1, j+1, cell.value) s1.cell(i+1, j+1).number_format = cell.number_format s1.cell(i+1, j+1).alignment = copy.copy(cell.alignment) s1.cell(i+1, j+1).font = copy.copy(cell.font) s1.cell(i+1, j+1).border = copy.copy(cell.border) s1.cell(i+1, j+1).fill = copy.copy(cell.fill)

其中:s1.cell(i+1, j+1, cell.value):设置单元格值一致

s1.cell(i+1, j+1).number_format = cell.number_format:设置数据格式一致

s1.cell(i+1, j+1).alignment = copy.copy(cell.alignment):设置对齐方式一致

s1.cell(i+1, j+1).font = copy.copy(cell.font):设置字体一致

s1.cell(i+1, j+1).border = copy.copy(cell.border):设置表框线条一致

s1.cell(i+1, j+1).fill = copy.copy(cell.fill):设置单元格填充色一致

前面两项,值和数据格式不需用copy库,直接赋值即可。但其他字体、对齐方式、线框、颜色等不能直接赋值,要用copy才行。网上也查到过用copy代码的文章,可惜的是,没说全,我依葫芦画瓢写出来不行。原因就是前面必须提前导入copy库,所以第一段代码里就有import copy语句。

生成exe文件后,运行效果:

扩展功能:

根据该方法,可实现根据某个表格样式,批量设置多个表格样式的功能。

附录完整代码:

import tkinter.filedialog as aimport osimport openpyxlimport copydef colwidth(s0, s1): for k, co in enumerate(s0.iter_cols()): k = chr(k+97).upper() lk = s0.column_dimensions[k].width if lk == 0: lk = 8.38 s1.column_dimensions[k].width = lkdef rowheight(s0, s1): for i in range(1, s0.max_row+1): hg = s0.row_dimensions[i].height if hg == 0: hg = 15 s1.row_dimensions[i].height = hgdef copycell(s0, s1): for i, row in enumerate(s0.iter_rows()): for j, cell in enumerate(row): s1.cell(i+1, j+1, cell.value) s1.cell(i+1, j+1).number_format = cell.number_format s1.cell(i+1, j+1).alignment = copy.copy(cell.alignment) s1.cell(i+1, j+1).font = copy.copy(cell.font) s1.cell(i+1, j+1).border = copy.copy(cell.border) s1.cell(i+1, j+1).fill = copy.copy(cell.fill)def copyfile(sht, sht1): colwidth(sht, sht1) rowheight(sht, sht1) copycell(sht, sht1) for merg in sht.merged_cells: sht1.merge_cells(str(merg))def breakfile(fn): g = os.path.split(fn[0])[0] for gg in fn: g1 = os.path.splitext(os.path.split(gg)[1])[0] wb = openpyxl.load_workbook(gg) if len(wb._sheets) > 1: for sht in wb._sheets: wb1 = openpyxl.Workbook() ws1 = wb1._sheets[0] copyfile(sht, ws1) f1 = os.path.join(g, g1 + '-' + sht.title + '.xlsx') wb1.save(f1)if __name__ == '__main__': ff = a.askopenfilenames(filetypes=[('excel文件', '.xlsx')]) breakfile(ff)

python拆分excel 样式不变_python带格式拆分excel表单,copy库完美搞定相关推荐

  1. python按某列拆分excel表格_python带格式拆分excel表单,copy库完美搞定

    python拆分excel表单,生成单独的excel文件,网上这方面的文章很多.但大多只讲主功能如何实现,让拆分后的表保持和原表单一致的格式,则鲜有人讲.本文通过调用copy库,完美实现带格式拆分表单 ...

  2. Java导出带格式的Excel数据到Word表格

    在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用Spi ...

  3. 如何通过Java导出带格式的 Excel 数据到 Word 表格

    在Word中制作报表时,我们经常需要将Excel中的数据复制粘贴到Word中,这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件.但是如果表格比较长,内容就会存在一定程度的丢失,无法 ...

  4. VUE Table复杂表格生成带格式的excel(多表头、合并单元格、边框、居中、背景)

    VUE Table复杂表格生成带格式的excel(多表头.合并单元格.边框.居中.背景) 因为工作需要,在网上找了很多都不太行无意之间看到一个大佬的打码拿过来改了改居然可以用! 原文链接:https: ...

  5. 【可乐荐书】Python自动化办公应用大全(ChatGPT版):从零开始教编程小白一键搞定烦琐工作

    本栏目将推荐一些经典的.有趣的.有启发性的书籍,这些书籍涵盖了各个领域,包括文学.历史.哲学.科学.技术等等.相信这些书籍不仅可以让你获得知识,还可以让你感受到阅读的乐趣和魅力. 今天给大家推荐的书籍 ...

  6. Unity 之 Excel表格转换为Unity用的文件格式 -- ScriptableObject,Json,XML 全部搞定

    Unity 之 Excel表格转换为Unity用的文件格式 -- ScriptableObject,Json,XML 全部搞定 前言 一,准备工作 1.1 确认表格表头 1.2 读取Excel 1.3 ...

  7. python列表导出_python list格式数据excel导出方法

    如下所示: # _*_ coding:utf-8 _*_ #----------------------------------------------- # import modules #---- ...

  8. python拆分excel并发送邮件_python使用tkinterpandassmtplib读取Excel并发送邮件

    1. 功能介绍: 当然是因为15号发工资啦,每次都是等呀等呀等呀等呀,最后终于等到一张来自Excel的工资条截图 于是我就希望能够学以致用试试,但是写好了又不敢给领导看~哈哈哈,发给大家批评批评 首先 ...

  9. python合并多个excel为一个_Python合并多个Excel数据

    安装模块 1.找到对应的模块 2.用pip install 安装 pip install xlrd pip install XlsxWriter pip list查看 XlsxWriter示例 1 i ...

最新文章

  1. 怎么用python画简单的图-使用Python中的Turtle库绘制简单的图形
  2. JavaScript在发送ajax请求时,URL域名地址是使用绝对地址还是相对地址?什么是浏览器跨域访问操作,js如何实现?
  3. [转]SpringMVC+Hibernate+Spring 简单的一个整合实例
  4. Boost:自定义小矢量的测试程序
  5. Xcode4.5编译ffmpeg成功,过程说明
  6. ZZULIOJ 1059:最高分
  7. html 图片导出excel,用JavaScript导出图片到Excel
  8. Servlet的使用你掌握多少?
  9. mysql 23000_mysql – SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败...
  10. Centos7完全卸载MySQL 安装 启动
  11. 2020强网杯青少赛Pursuing_The_Wind战队WRITEUP
  12. 关于php网络爬虫phpspider
  13. 天翼网关刷linux,天翼网关3 友华PT926E通用 全网首发 免复位/TTL/FTP获取超密及根目录方法!(四川已测)...
  14. 被苹果“分手”后,英特尔华丽逆袭:新款酷睿 i9 碾压 M1 Max?
  15. 慢慢欣赏linux x86 bootloader加载kernel的策略
  16. hbase数据库连接池 未设置最大链接数导致数据库操作异常频发
  17. 标杆案例|中海数字化转型:以客户为中心,打造客户全域旅程数据平台
  18. USB限流IC,限流开关保护芯片
  19. k3v12.0精益版注册机_精益均值VBA机
  20. 国外智商测试软件,国际标准智商测试软件_UOML实现 中国软件国际标准零突破...

热门文章

  1. Android模拟器上不了网的解决办法
  2. 人脸识别活体检测之张张嘴和眨眨眼——Landmark
  3. keySet()和entrySet()的区别
  4. 6-1 求二叉树高度 (20 分)
  5. 【奋斗人生】24岁的你别再混沌度日了!
  6. LSTM(长短记忆网络)
  7. 2021谷饶中学高考成绩查询,谷饶中学录取分数线出炉,快来看!
  8. 常用的Java中间件
  9. 【转】从零开始 LaTeX 快速入门
  10. 不是天才的我们,想要一次性过2019年一级建造师,过来人经验告诉你