python按某列拆分excel表格_python带格式拆分excel表单,copy库完美搞定
python拆分excel表单,生成单独的excel文件,网上这方面的文章很多。但大多只讲主功能如何实现,让拆分后的表保持和原表单一致的格式,则鲜有人讲。本文通过调用copy库,完美实现带格式拆分表单,过程说明如下:
我们先看看带格式拆分和普通拆分的效果对比
原表样式:
普通拆分效果:
带格式拆分效果:
很显然,带格式拆分才是我们真正想要的。那么问题来了,如何实现呢?我们用一个案例说明如下,文末有完整代码。
调用选择文件对话框,选择要拆分的文件
通过调用tkinter.filedialog库,实现弹出选择文件对话框,选择指定文件进行拆分的操作,符合日常习惯。
import tkinter.filedialog as a # 导入调用文件对话框的库
import os
import openpyxl
import copy
if __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 a
import os
import openpyxl
import copy
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
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
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)
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库完美搞定相关推荐
- python拆分excel 样式不变_python带格式拆分excel表单,copy库完美搞定
python拆分excel表单,生成单独的excel文件,网上这方面的文章很多.但大多只讲主功能如何实现,让拆分后的表保持和原表单一致的格式,则鲜有人讲.本文通过调用copy库,完美实现带格式拆分表单 ...
- VUE Table复杂表格生成带格式的excel(多表头、合并单元格、边框、居中、背景)
VUE Table复杂表格生成带格式的excel(多表头.合并单元格.边框.居中.背景) 因为工作需要,在网上找了很多都不太行无意之间看到一个大佬的打码拿过来改了改居然可以用! 原文链接:https: ...
- python excel模板 生成excel表格_python使用xlwt生成Excel表格
在工作中,遇到了使用python生成Excel表格的需求,经过资料的查找与对比,决定使用第三方库xlwt来生成Excel表格,现做如下总结: 简单例子: import xlwt wb = xlwt.W ...
- 转换文档参数_Word、Excel、PDF多格式转换?只需1招全搞定
在工作学习中,我们常常会遇到一些文档需要进行格式转换,比如Word文档.excel表格与PDF的互转需求.而想要实现这一操作的技巧有很多,但今天君君要分享的这个PDF转换工具基本可以覆盖全平台了,真正 ...
- 用python处理excel表格_python用win32com处理excel表格
sqlite3 库,用起来非常方便. 3. 用 xlrd 读取 Excel 并插入数据库样例 如果数据量不大,直接用 Python 内部数据结构如 dict, list 就够了.但如果读取的几张表数据 ...
- 在Excel表格中如何快速拆分合并单元格
在Excel表格中如何快速拆分合并单元格 目录 在Excel表格中如何快速拆分合并单元格 1.例如:将销售人列中的合并单元格拆分还原 2.选中销售人姓名,点击[开始]选项卡中[合并居中] 3.再点击[ ...
- ArcGIS如何将Excel表格转换为SHP格式
概述 数据的获取渠道是多种多样的,获取的数据格式也是多种多样,作为一名GISer,需要熟练掌握各种格式的数据之间的转换,例如本文要介绍的Excel格式的数据,经常会遇到,这里为大家介绍一下转换方法,希 ...
- java使用jxl生成excel表格,jsp使用js下载excel文件xls
java使用jxl生成excel表格,jsp使用js下载excel文件 后端代码 maven jar包 主体代码逻辑 引入的jar包 具体代码段 重点详解 表头和表格内容两种格式 直接将 HttpSe ...
- php页面导入excel表格,php页面导入excel表格数据:php导入excel 怎么获取excel表格数据...
导入excel文件,后端php处理导入的数据并存入数据库,需要前后端结合的demo! thinkphp3.2phpexcel导入最基本用法 先整个最基础的代码,理解了这个,后面非常简单了 $file_ ...
最新文章
- Python常用操作记录
- Windows 2003 + ISA 2006+单网卡×××配置(4)
- MIT类人机器人开始耍杂技了,看这个后空翻它漂亮吗?
- sql怎么实现取当前数据以及累计7天数据_年薪60万+大佬吐血整理字节跳动大数据面试真题...
- a*算法迷宫 c++_算法竞赛专题解析(12):搜索基础
- 使用three.js实现炫酷的酸性风格3D页面
- centos 6.8安装git_CentOS7安装GitLab、汉化、邮箱配置及使用
- scum开服务器延迟高怎么办,人渣SCUM卡顿优化方法 人渣SCUM卡顿怎么办
- 22 Notification 通知栏代码
- 数学无用论??我们欠孩子真正的数学阅读
- 雨尘奇偶猫单页SEO系统源码v1.3
- CSS、JavaScript和Ajax实现图片预加载的三大方法及优缺点分析
- 企业如何实际使用 Docker
- 中文乱码java_JAVA中文乱码问题应该怎么解决?
- 2017年值得学习的3个CSS特性
- ClassLoader类加载器简介
- SharePoint 2010 文档管理系列
- Linux软件安装到哪个目录
- 网站被黑了不要慌,4招教你如何破解!网站被黑的10大原因
- 若干个数据首尾相连,构成一个圆环,找到连续的4个数之和最大的一段。 C++
热门文章
- html的标签位置属性(学习笔记)
- python读取linux内存_使用python获取CPU和内存信息(linux系统)
- mysql新增列并同时增加数据_图解MySQL | 「原理解析」 MySQL 为表添加列 是怎么立刻完成的...
- python字符串转浮点数_python – 无法将字符串列表转换为浮点数
- Django怎么配置mysql数据库_Django如何配置mysql数据库
- 【专栏精选】Assetbundle入门
- Unity上的Oculus Quset2开发(2) —— 在VR里打棒球
- Leecode刷题热题HOT100(12)——整数转罗马数字
- SqlBulkCopy批量数据导入(EF实现)
- 计算机组成原理alu功能实现代码_计算机组成原理小课堂(3)——易错知识点...