openpyxl处理Excel模板,带格式拷贝行和数据填入
本文中用openpyxl操作Excell 模板,进行行拷贝和数据填充.
主要涉及单元格格式的拷贝,合并单元格的拷贝,行高和列宽的处理.
将模板表格分为三部分,头部,中间循环填充部分,尾部.模板参数中设置头部高度,循环部分高度,剩余为尾部.
拷贝时先拷贝填充头部 ,然后根据数据循环拷贝填充中间部分,最后拷贝填充尾部.
import os
import openpyxl
import logging
from openpyxl.utils import get_column_letter
import traceback
import copy
def copy_cells(copy_from, paste_to_cell):"""复制粘贴某个区域:param copy_from 复制源:param paste_to_cell 粘贴的左上角"""# 记录边缘值for _copy_row in copy_from: # 循环每一行print(dir(_copy_row),_copy_row)for source_cell in _copy_row: # 循环每一列# paste_to_cell.value = _row_cell.value# paste_to_cell._style = deepcopy(source_cell._style) # 复制样式paste_to_cell._value = source_cell._valuepaste_to_cell.data_type = source_cell.data_typeif source_cell.has_style:paste_to_cell._style = copy.copy(source_cell._style)if source_cell.hyperlink:paste_to_cell._hyperlink = copy.copy(source_cell.hyperlink)if source_cell.comment:paste_to_cell.comment = copy.copy(source_cell.comment)paste_to_cell = paste_to_cell.offset(row=0, column=1) # 右移1格paste_to_cell = paste_to_cell.offset(row=1, column=-len(_copy_row))
class Sample:pass
class ExcelTemp():def tianru(self,wb,objs,sheetname):ws = wb.create_sheet(sheetname+"_")ws_from=wb[sheetname]output_dict={"head": 14,"body": 4,"items": {"SAMPLE_NAME": "A15","sampleid": "B15","SAMPLE_CODE": "D15","d0": "E15","L0": "H15","S0": "F15","Lu": "K15",}}head={}body={}tail={}#记录各部分的高度head["h"]=output_dict["head"]body["h"]=output_dict["body"]tail["h"]=ws_from.max_row-head["h"]-body["h"]table_w=get_column_letter(ws_from.max_column)#找到输出字典中属于各部分的项目items=output_dict["items"]body["items"]={}head["items"]={}tail["items"]={}for attr in items.keys():pos=items[attr]t=openpyxl.utils.cell.coordinate_to_tuple(pos)if t[0]>head["h"] and t[0]<=head["h"]+body["h"]:body["items"][attr]=items[attr]elif t[0]>head["h"]+body["h"]:tail["items"][attr]=items[attr]else:head["items"][attr]=items[attr]#找到源表格属于各部分的合并单元格wm = list(ws_from.merged_cells)print(wm,dir(wm[0]))head["wm"]=[]body["wm"]=[]tail["wm"]=[]for one in wm:if one.min_row>head["h"] and one.min_row<=head["h"]+body["h"]:body["wm"].append(one)elif one.min_row>head["h"]+body["h"]:tail["wm"].append(one)else:head["wm"].append(one)#拷贝列宽for i in range(ws_from.max_column):col_letter=get_column_letter(i+1)source=ws_from.column_dimensions[col_letter]ws.column_dimensions[col_letter]=copy.copy(source)#记录各部分的起始行head["start_row"]=1body["start_row"]=head["h"]+1tail["start_row"]=head["h"]+body["h"]+1print("head",head,body,tail)start_row=1jg=2#拷贝头部self.cp_rows(ws_from,ws,table_w,head,start_row,objs[0])start_row+=head["h"]row=0#拷贝体部for obj in objs:self.cp_rows(ws_from,ws,table_w,body,start_row,obj)start_row+=body["h"]#拷贝尾部self.cp_rows(ws_from,ws,table_w,tail,start_row,objs[0])start_row+=tail["h"]start_row+=jg# del wb[sheetname]def cp_rows(self,ws_from,ws,rows_w,rows,target_row,obj):rows_h=rows["h"]start_row=rows["start_row"]wm=rows["wm"]print([rows_w,rows_h,start_row,target_row])# input("pause")#拷贝单元格source=ws_from['A'+str(start_row):rows_w+str(start_row+rows_h-1)]#23target = ws['A'+str(target_row)]#25copy_cells(source,target)#填充数据items=rows["items"]for attr in items.keys():try:v=getattr(obj,attr) pos=items[attr]t=openpyxl.utils.cell.coordinate_to_tuple(pos)ws.cell(t[0]+target_row-rows["start_row"],t[1]).value=vexcept AttributeError:logging.info(traceback.format_exc())#拷贝行高for i in range(rows_h):source=ws_from.row_dimensions[i+start_row]ws.row_dimensions[i+target_row]=copy.copy(source)#拷贝合并单元格for i in range(0, len(wm)):print(wm[i],dir(wm[i]),type(wm[i]))print(str(wm[i]))# print(wm[i].start_cell.row,wm[i].start_cell.column)# print(wm[i].min_row,wm[i].max_row,wm[i].min_col,wm[i].max_col)row1=wm[i].min_row-start_row+target_rowrow2=wm[i].max_row-start_row+target_rowcell2 =get_column_letter(wm[i].min_col)+str(row1)+":"+ get_column_letter(wm[i].max_col)+str(row2)print(cell2)ws.merge_cells(cell2)def output_objs_openpyxl(self,wb):s1=Sample()s1.SAMPLE_NAME="s1"s1.S0=2.1s2=Sample()s2.SAMPLE_NAME="s2"s2.S0=2.3objs=[s1,s2]self.tianru(wb,objs,"室拉棒材")
t=ExcelTemp()
wb=openpyxl.load_workbook("lm_gb.xlsx")
t.output_objs_openpyxl(wb)
wb.save("out.xlsx")

相关文章:
openpyxl处理Excel模板,带格式拷贝行和数据填入
本文中用openpyxl操作Excell 模板,进行行拷贝和数据填充. 主要涉及单元格格式的拷贝,合并单元格的拷贝,行高和列宽的处理. 将模板表格分为三部分,头部,中间循环填充部分,尾部.模板参数中设置头部高度,循环部分高度,剩余为尾部. 拷贝时先拷贝填充头部 ,然后根据数据循环拷贝填…...
无法在带有 WHM/cPanel 的 Ubuntu 22.04 服务器上安装 PHP 7.x – 缺少软件包
问题 正在使用Ubuntu 22.04设置服务器,并使用WHM/cPanel管理多个帐户和配置。我的目标是在服务器上安装 PHP 7.4(或更早的版本,如 PHP 7.3),因为我的一些应用程序与 PHP 8.x 不兼容。问题是,每当我尝试安装…...
数据结构-递归函数的调用栈过程
这道题考察的是递归函数的调用栈过程。 逐步分析程序的执行过程: main() 函数首先被调用,此时栈底是 main() 的信息。main() 函数调用 S(1),此时 S(1) 的信息被压入栈中,位于 main() 之上。S(1) 函数内部调用 S(0),因…...
在 WPF 中,如何实现数据的双向绑定?
在 WPF 中,数据绑定是一个非常重要的特性,它允许 UI 与数据源之间自动同步。双向绑定是一种常见的绑定方式,当数据源更新时,UI 会自动更新;同样,当 UI 中的元素(如文本框)发生改变时…...
pyinstaller 打包 playwright -- 如何将浏览器打包到程序中
start 最近玩了玩 playwright,记录一下遇到的问题。 1. 如何在 python 中使用 安装 pip install playwright安装浏览器驱动 playwright install查看浏览器驱动安装的位置 playwright install --dry-run2. 如何将浏览器打包的程序中 先找到我们使用 pip 安装…...
vue系列=状态管理=Pinia使用
1、Pinia基本概念 1、Pinia向外暴露了几个重要的函数,分别是createPinia、defineStore和storeToRefs 2、pinia有五个核心管理概念: store、store、getters、action、plugins 2、Pinia基本使用 1、安装过程 1、安装pinia插件:npm install pini…...
[HarmonyOS]简单说一下鸿蒙架构
鸿蒙操作系统(HarmonyOS)是由华为公司开发的一款面向全场景的操作分布式系统。它旨在提供一个统一的操作系统平台,支持多种设备,包括智能手机、平板电脑、智能电视、可穿戴设备、智能家居等。鸿蒙架构的设计目标是实现设备之间的无…...
【Python TensorFlow】进阶指南(续篇一)
在前两篇文章中,我们介绍了TensorFlow的基础知识及其在实际应用中的初步使用,并探讨了更高级的功能和技术细节。本篇将继续深入探讨TensorFlow的高级应用,包括但不限于模型压缩、模型融合、迁移学习、强化学习等领域,帮助读者进一…...
机器视觉和计算机视觉的区别
机器视觉和计算机视觉的区别 1、本质上两者是一样的,都是将光信号转换成电信号,然后交给计算机处理; 2、二者侧重点不同,计算机视觉更偏向研究,更前沿,采集到图像后交给计算机进行分析处理,包括…...
RDD 算子全面解析:从基础到进阶与面试要点
Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...
Vue.js动态组件使用
在 Vue.js 中,动态组件是一种功能强大的特性,它允许你在同一个挂载点根据条件动态地切换不同的组件。这通常通过 Vue 的 <component> 元素和 is 特性来实现。以下是如何在 Vue 3 中使用动态组件的详细指南: 基本用法 定义组件…...
智能合约在供应链金融中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 引言 智能合约概述 定义与原理 发展…...
【大数据技术基础 | 实验十】Hive实验:部署Hive
文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)安装部署(二)配置HDFS(三)启动Hive 六、实验结果(一)启动结果(二)Hive基…...
Golang常见编码
1. URL 编码、解码 2. base64 编码、解码 3. hex 编码、解码 4. md5 编码 5. sha-1 编码 6. sha-256 编码 7. sha-512 编码 package mainimport ("crypto/md5""crypto/sha256""crypto/sha512""encoding/base64""encoding/h…...
搭建Spring gateway网关微服务
在使用微服务架构时,往往我们需要搭建一个网关服务,作为各个微服务的统一入口。Spring gateway作为网关服务的后起之秀,受到各大企业的欢迎。下面介绍下网关服务Spring gateway的搭建。 引入依赖,这一步比较重要,也需要…...
性能测试|JMeter接口与性能测试项目
前言 在软件开发和运维过程中,接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用,被广泛用于进行各种性能测试,包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…...
spring boot 难点解析及使用spring boot时的注意事项
1、难点解析: 1.1 配置管理: --- 尽管Spring Boot强调“习惯优于配置”,但在实际项目中,仍然需要面对大量的配置问题。如何合理地组织和管理这些配置,以确保项目的稳定性和可维护性,是一个挑战。 --- Sp…...
通过投毒Bingbot索引挖掘必应中的存储型XSS
简介 在本文中,我将讨论如何通过从外部网站对Bingbot进行投毒,来在Bing.com上实现持久性XSS攻击。 什么是存储型或持久性XSS?存储型攻击指的是将恶意脚本永久存储在目标服务器上,例如数据库、论坛、访问日志、评论栏等。受害者在…...
STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55
STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55 前面我们讲述了几种BootLoader中的命令,包括获取软件版本号、获取帮助、获取芯片ID、读取Flash保护Level。 下面我们来介绍一下BootLoader中最重要的功能之一—跳转!就像BootLoader词汇中的Boot…...
【Linux篇】面试——用户和组、文件类型、权限、进程
目录 一、权限管理 1. 用户和组 (1)相关概念 (2)用户命令 ① useradd(添加新的用户账号) ② userdel(删除帐号) ③ usermod(修改帐号) ④ passwd&…...
战争鼓点响起:AI生成大片感战斗音乐作品
战争鼓点响起:AI生成大片感战斗音乐作品 1. 从文字到战歌:AI音乐生成初体验 想象一下这样的场景:你正在制作一部史诗级的战斗短片,画面中千军万马奔腾,刀光剑影交错,但总觉得缺少点什么。没错,…...
VRCT终极指南:3步实现VRChat跨语言实时翻译,打破虚拟社交障碍
VRCT终极指南:3步实现VRChat跨语言实时翻译,打破虚拟社交障碍 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT 您是否曾在VRChat的国际房间中,面对来自…...
昆明理工大学材料科学与工程考研复试资料|F001现代材料测试技术专项复习包|电子版
温馨提示:文末有联系方式一、昆明理工大学材料科学与工程专业复试资料全面升级 专为报考昆明理工大学材料科学与工程学院硕士研究生设计,深度对标最新复试大纲,系统梳理核心考核模块,助力考生精准把握复试命方向与评分标准。二、F…...
从仿真到实战:在CST/HFSS中如何设置周期性边界条件评估紧耦合天线阵元性能
从仿真到实战:在CST/HFSS中设置周期性边界条件评估紧耦合天线阵元性能 天线阵列设计中最具挑战性的环节之一,是如何准确预测单个阵元在阵列环境中的真实工作状态。当我在设计第一个超宽带相控阵时,曾因忽视阵元间互耦效应导致实物测试结果与仿…...
我已战胜一切!感谢哥白尼,感谢爱因斯坦,感谢豆包,,,曾经我都经历过什么,我自己非常清楚,既有爱因斯坦的压缩版,又有哥白尼的压缩版,,,
不是时代不好,是人心中的成见就像一座大山般,无法被逾越,只有暴雨降下,洗刷这个世界,重塑这个宇宙,各位其位,大道至简。历史的车轮早已不可阻挡,,,暴风雨会来…...
Jenkins vs GitLab CI/CD:2026 企业级 CI/CD 工具深度选型评测
Jenkins vs GitLab CI/CD:2026 企业级 CI/CD 工具深度选型评测 作为在 CI/CD 领域摸爬滚打十余年的全栈老兵,我见证了从手工部署到云原生 DevOps 的完整演进。今天,我们将抛开宗教战争式的争论,用真实数据和生产环境案例ÿ…...
像素剧本圣殿新手指南:RPG对话框系统理解AI输出逻辑与修改技巧
像素剧本圣殿新手指南:RPG对话框系统理解AI输出逻辑与修改技巧 1. 认识像素剧本圣殿的RPG对话框系统 像素剧本圣殿的RPG对话框系统是其最具特色的交互界面,它模拟了经典像素游戏中NPC对话的场景。这个系统不仅仅是视觉上的复古设计,更是AI剧…...
从数学直觉到代码实践:Harris角点检测的算法拆解与性能调优
1. 角点检测:计算机视觉的基石 想象一下你正在玩一个拼图游戏。当两块拼图能够严丝合缝地拼接在一起时,往往是因为它们在某些关键位置完美匹配——这些位置通常是拼图块的拐角处。计算机视觉中的角点检测,本质上就是在做类似的事情࿱…...
ai辅助开发:借助快马平台ai模型打造智能自适应的openclaw chrome数据抓取插件
今天想和大家分享一个最近用AI技术增强网页数据抓取效率的实践——开发一个叫OpenClaw的智能Chrome插件。这个插件的特别之处在于,它不仅能抓取数据,还能通过AI理解网页结构,自动适应不同网站,大大减少了手动编写抓取规则的工作量…...
从零到一:MicroPython 环境搭建与首个硬件交互项目实战
1. 初识MicroPython:为什么选择它? 第一次接触MicroPython时,我正为一个智能家居项目寻找合适的开发方案。当时被它"Python on hardware"的理念吸引——毕竟谁能拒绝用熟悉的Python语法直接控制硬件呢?MicroPython本质上…...
