用 Python 给 Excel 表格截图(20250207)
我搜索了网络上的方案,感觉把 Excel 表格转换为 HTML 再用 platwright 截图是比较顺畅的路径,因为有顺畅的工具链。如果使用的是 Windows 系统则不需要阅读此文,因为 win32com 库更方便。这篇文章中 Excel 转 HTML 的方案,主要弥补了网上其他方案中存在合并单元格的情况。代码为智谱清言帮助生成,有些变量控制还是需要自己改一下。
from openpyxl import load_workbook
from openpyxl.styles import Font, Border, Side, Alignment
from playwright.sync_api import sync_playwright
from datetime import datetime# 打开浏览器并截图
def capture_table_screenshot( url, output_file, table_selector):with sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()# 注意这里需要加协议page.goto("file://" + url)# 等待表格元素加载完成page.wait_for_selector(table_selector)page.wait_for_timeout(1000)# 对表格元素进行截图table_element = page.locator(table_selector)table_element.screenshot(path=output_file)browser.close()# 默认合并单元格的文本内容是放在左上单元格的,如果不是,需要专门程序处理。
# 边框样式默认为1px solid
def read_excel(file_path):# data_only 将 Excel 表格里的公式计算成数值读取出来。wb = load_workbook( filename=file_path, data_only=True)ws = wb.active # 读取活动工作表data = []merges = [] # 用于存储合并单元格的信息cell_styles = []# 读取合并单元格信息for merged_range in ws.merged_cells.ranges:start_row, start_col = merged_range.min_row, merged_range.min_colend_row, end_col = merged_range.max_row, merged_range.max_colmerges.append((start_row-1, start_col-1, end_row-1, end_col-1))for row in ws.iter_rows():row_data = []row_styles = []for cell in row:print(f"当前单元格的坐标:{cell.coordinate}")if cell.coordinate in ws.merged_cells.ranges:# 跳过合并单元格中的非起始单元格continue if cell.value is not None:print(f"单元格的值:{cell.value}")row_data.append(str(cell.value)) else:row_data.append('') # 空单元格填充空字符串# 读取单元格样式,提供默认值font = cell.font if cell.font else Font()border = cell.border if cell.border else Border()alignment = cell.alignment if cell.alignment else Alignment()print(f"单元格字体颜色:{font.color.index}")print(f"单元格边框样式:{border.top.style}")cell_style = {'font': {'name': font.name if font.name else 'Arial','size': font.size if font.size else 12,'bold': font.bold if font.bold else False,'italic': font.italic if font.italic else False,'color': font.color.rgb if font.color and font.color.rgb else '#000000'},'border': {'top': '1px solid' if border.top and border.top.style else None,'left': '1px solid' if border.left and border.left.style else None,'right': '1px solid' if border.right and border.right.style else None,'bottom': '1px solid' if border.bottom and border.bottom.style else None},'alignment': {'horizontal': alignment.horizontal if alignment.horizontal else None,'vertical': alignment.vertical if alignment.vertical else None}}row_styles.append(cell_style)print(f"转换后的单元格样式:{cell_style}")data.append(row_data)cell_styles.append(row_styles) return data, merges, cell_styles# 该处默认只有同一行合并多列的情况。如果合并单元格占了两行,需要另外的处理。
def generate_html_table(data, merges, cell_styles):print(f"合并单元格的信息:{merges}")html = "<table style='border-collapse: collapse;'>\n"for row_idx, row in enumerate(data):print("-"*20)print(f"当前行的数据:{row}")html += "<tr>\n"# 设置一个跳过非首个合并单元格的标记skip_next_cell = 0for col_idx,cell in enumerate(row):if skip_next_cell > 0:skip_next_cell -= 1continue# 行号、列号从0开始print(f"当前单元格的值:{cell},行号:{row_idx},列号:{col_idx}")# 如果当前单元格为1行4列,则修改cell值if row_idx == 1 and col_idx == 4:# 获取今天的日期today = datetime.today()cell = formatted_date_no_leading_zeros = "截止 " + today.strftime("%-m 月 %-d 日")print(f"修改后的单元格值:{cell}")# 去除单元格样式style = cell_styles[row_idx][col_idx]if style: font_style = f"font-family:{style['font']['name']}; font-size:{style['font']['size']}pt; " \f"font-weight:{'bold' if style['font']['bold'] else 'normal'}; " \f"font-style:{'italic' if style['font']['italic'] else 'normal'};"border_style = f"border-top:{style['border']['top']}; " \f"border-left:{style['border']['left']}; " \f"border-right:{style['border']['right']}; " \f"border-bottom:{style['border']['bottom']};"alignment_style = f"text-align:{style['alignment']['horizontal']}; " \f"vertical-align:{style['alignment']['vertical']};"if (row_idx, col_idx) in [(m[0], m[1]) for m in merges]: # 检查当前单元格是否是合并单元格的起始单元格rowspan = [m[2] - m[0] + 1 for m in merges if m[0] == row_idx and m[1] == col_idx][0]colspan = [m[3] - m[1] + 1 for m in merges if m[0] == row_idx and m[1] == col_idx][0]if style:html += f"<td style='{font_style} {border_style} {alignment_style}' rowspan={rowspan} colspan={colspan}>{cell}</td>"else:html += f"<td rowspan={rowspan} colspan={colspan}>{cell}</td>"skip_next_cell = colspan - 1 # 跳过合并的列else:if style:html += f"<td style='{font_style} {border_style} {alignment_style}' >{cell}</td>"else:html += f"<td>{cell}</td>"html += "</tr>\n"html += "</table>"html = "<!DOCTYPE html><html><head><meta charset='UTF-8'><title>Excel Table</title></head><body>" + html + "</body></html>"return htmldef main():current_dir = 'reer'excel_file_path = current_dir + 'log/2re0207.xlsx' # 替换为你的Excel文件路径html_file_path = current_dir + 'log/output.html'screenshot_file_path = current_dir + 'log/table_screenshot.png'data, merges, cell_styles = read_excel(excel_file_path)html_table = generate_html_table(data, merges, cell_styles)with open(html_file_path, 'w', encoding='utf-8') as file:file.write(html_table)# 调用函数,替换以下参数url = html_file_path # 网页URLoutput_file = screenshot_file_path # 输出文件路径table_selector = 'table' # 表格的CSS选择器,根据实际情况调整capture_table_screenshot(url, output_file, table_selector)if __name__ == "__main__":main()
相关文章:
用 Python 给 Excel 表格截图(20250207)
我搜索了网络上的方案,感觉把 Excel 表格转换为 HTML 再用 platwright 截图是比较顺畅的路径,因为有顺畅的工具链。如果使用的是 Windows 系统则不需要阅读此文,因为 win32com 库更方便。这篇文章中 Excel 转 HTML 的方案,主要弥补…...
Office/WPS接入DS等多个AI工具,开启办公新模式!
在现代职场中,Office办公套件已成为工作和学习的必备工具,其功能强大但复杂,熟练掌握需要系统的学习。为了简化操作,使每个人都能轻松使用各种功能,市场上涌现出各类办公插件。这些插件不仅提升了用户体验,…...
智能化转型2.0:从“工具应用”到“价值重构”
过去几年,“智能化”从一个模糊的概念逐渐成为企业发展的核心议题。2024年,随着生成式AI、大模型、智能体等技术的爆发式落地,中国企业正式迈入智能化转型的2.0时代。这一阶段的核心特征是从单一场景的“工具应用”转向全链条的“价值重构”&…...
深度整理总结MySQL——索引工作原理
B树索引数据结构 前言什么样的索引数据结构是好的搜索速度要求支持范围查找寻求适合查找的算法寻求合适的数据结构二叉查找树自平衡二叉树B树B树数据结构B与B树比较 总结 前言 相信你在面试时,通常会被问到“什么是索引?”而你一定要能脱口而出…...
基于asr的所见即可说方案
年前写的文章对所见即可说方案进一步调研-CSDN博客,针对rk3568定制版,进行了Accessibility实现所见即可说功能的验证与调研,结论是不可行。 最终解决方案是:结合科大讯飞的AI大模型智能助手,使用rk3588板(…...
【截图】selenium自动通过浏览器截取指定元素div的图片
【截图】selenium自动通过浏览器截取指定元素div的图片 思路 截取完整网页截图 通过元素的坐标 截图到指定位置的图片 前提是已经获取到 driver 了 # 定位目标divtarget_div driver.find_element(By.CLASS_NAME, headlines-right)# 获取div的位置和大小location target_div…...
CSS入门学习笔记(一)
学习视频:https://www.bilibili.com/video/BV1zN2UYoEEo/ 目录 基本介绍语法引入方式内联样式(行内样式)内部样式外部样式 选择器四种选择器全局选择器元素选择器类选择器id选择器 合并选择器选择器的优先级 字体属性colorfont-sizefont-weig…...
docker安装es及分词器ik
系统是macos,docker是docker-desktop 拉取镜像 docker pull bitnami/elasticsearch 启动docker镜像 docker create -e "discovery.typesingle-node" \ --name elasticsearch1 -p 9200:9200 -p 9300:9300 \ bitnami/elasticsearch:8.17.1 测试是否好…...
11. 9 构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南
构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南 关键词: 聊天对话记忆系统、多用户会话管理、LangChain生产部署、Redis记忆存储、高并发对话系统 一、服务级聊天记忆系统核心需求 多用户隔离:支持同时处理数千个独立对话持久化存储:对话历史不因服务重启丢…...
SpringBoot启动源码剖析:从入口到容器的诞生
文章目录 SpringBoot启动的核心入口SpringApplication的初始化SpringBoot的启动流程1. 准备环境(Environment)2. 创建应用上下文(ApplicationContext)3. 刷新应用上下文(Refresh Context)4. 调用Runner接口…...
Day38【AI思考】-彻底打通线性数据结构间的血脉联系
文章目录 **彻底打通线性数据结构间的血脉联系****数据结构家族谱系图****一、线性表(老祖宗的规矩)****核心特征** **二、嫡系血脉解析**1. **数组(规矩森严的长子)**2. **链表(灵活变通的次子)** **三、庶…...
虚拟鼠标MATVT:遥控器操控的安卓电视增强工具
虚拟鼠标MATVT:遥控器操控的安卓电视增强工具 matvt Virtual Mouse for Android TV that can be controlled via remote itself. 项目地址: https://gitcode.com/gh_mirrors/ma/matvt 项目基础介绍与编程语言 虚拟鼠标MATVT(matvt)是…...
优惠券平台(一):基于责任链模式创建优惠券模板
前景概要 系统的主要实现是优惠券的相关业务,所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能,这里先通过模拟的形式代替。后续如果需要后管展示,会重构该代码 UserInfoDTO userInfoDTO new…...
从零开始:OpenCV 图像处理快速入门教程
文章大纲 第1章 OpenCV 概述 1.1 OpenCV的模块与功能 1.2 OpenCV的发展 1.3 OpenCV的应用 第2章 基本数据类型 2.1 cv::Vec类 2.2 cv::Point类 2.3 cv::Rng类 2.4 cv::Size类 2.5 cv:&…...
计算机网络-SSH基本原理
最近年底都在忙,然后这两天好点抽空更新一下。前面基本把常见的VPN都学习了一遍,后面的内容应该又继续深入一点。 一、SSH简介 SSH(Secure Shell,安全外壳协议)是一种用于在不安全网络上进行安全远程登录和实现其他安…...
数据库性能优化(sql优化)_统计信息_yxy
数据库性能优化_统计信息理解 1 什么是数据库统计信息?2 统计信息不准确3 统计信息分类3.1 表统计信息3.2 列统计信息3.3 索引统计信息4 统计方式4.1 频率直方图4.2 等高直方图5 总结1 什么是数据库统计信息? 数据库中同一个sql有非常多种执行方式,每种执行方式的代价肯定不…...
QT通过setProperty设置不同QSS样式
如上切换效果就是通过setProperty来实现切换不同颜色的。 实现以上效果第一步,需要在QSS中做属性处理。 QLabel{color:red;} QLabel[status"1"]{color:black;} QLabel[status"2"]{color:white;} QLabel[status"3"]{color:blue;} QLa…...
基础入门-算法解密散列对称非对称字典碰撞前后端逆向MD5AESDESRSA
知识点: 0、算法类型-单向散列&对称性&非对称性 1、算法识别加解密-MD5&AES&DES&RSA 2、解密条件寻找-逻辑特征&源码中&JS分析 应用场景: 1、发送数据的时候自动将数据加密发送(只需加密即可) 安全…...
VsCode创建VUE项目
1. 首先安装Node.js和npm 通过网盘分享的文件:vsCode和Node(本人电脑Win11安装) 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装,点击下一步即可 …...
【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析
一、引言与背景 在人工智能领域,大型语言模型(LLM)如DeepSeek以其卓越的自然语言理解和生成能力,推动了众多应用场景的发展。然而,大型模型的高昂计算和存储成本,以及潜在的数据隐私风险,限制了…...
ARM嵌入式学习--第十三天(I2C)
I2C --介绍 I2C(Inter-intergrated Circuit 集成电路)总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有俩根双向的信号线,一根数据线SDA用于收发数据&…...
js滚动到页面最底部
setTimeout(()> { //延后执行,等页面渲染结束let container document.querySelector(.raise-flag-content); //找到当前divif (container) {container.scrollTop container.scrollHeight - (container.clientHeight - 400 );}})container.scrollTop container…...
关于 SQL 内连接、外连接(左连接、右连接)的面试题
一、概念理解类 1. 请详细解释内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)在 SQL 中的概念和区别,并分别举例说明它们在实际查询场景中的应用。 在SQL中,内连接&a…...
【论文阅读】Comment on the Security of “VOSA“
Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…...
Zookeeper是如何解决脑裂问题的?
大家好,我是锋哥。今天分享关于【Zookeeper是如何解决脑裂问题的?】面试题。希望对大家有帮助; Zookeeper是如何解决脑裂问题的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过多种机制来解决脑裂&…...
宾馆民宿酒店住宿管理系统+小程序项目需求分析文档
该系统是一款专为现代酒店设计的高效、智能、易用的管理工具,旨在帮助酒店提升运营效率、优化客户体验,提升客户满意度与忠诚度,并促进业务增长。系统采用先进的云计算技术,支持小程序等多平台访问,第三方接口,确保数据安全与稳定。本系统主要针对中小型精品酒店、连锁酒…...
【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)
1. 安装必要的依赖 以 CentOS 7 系统为例,安装必要的依赖包: sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…...
基于keepalived+GTID半同步主从复制的高可用MySQL集群
文章目录 项目架构图项目名称项目环境项目描述ip地址规划项目步骤一.安装好8台全新的centos7.9的系统,关闭firewalld和selinux,配置每台主机的静态ip地址,设置每台主机对应的主机名。1、关闭firewalld2.关闭seLinux3.配置每台主机静态ip地址4…...
DeepSeek与llama本地部署(含WebUI)
DeepSeek从2025年1月起开始火爆,成为全球最炙手可热的大模型,各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用,那如果有读者希望将大模型部署在本地应该怎么做呢?本篇文章将会教你如何在本地傻瓜式的部署我们的…...
leetcode_双指针 557. 反转字符串中的单词 III
557. 反转字符串中的单词 III 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。思路: 1.首先用split()切割字符串中用空格分隔的单词2.用切片法反转每个单词3.用join()把反转后的单词用空格连接 class Solu…...
Python用langchain、OpenAI大语言模型LLM情感分析苹果股票新闻数据及提示工程优化应用...
全文链接:https://tecdat.cn/?p39614 本文主要探讨了如何利用大语言模型(LLMs)进行股票分析。通过使用提供的股票市场和金融新闻获取数据,结合Python中的相关库,如Pandas、langchain等,实现对股票新闻的情…...
通过多层混合MTL结构提升股票市场预测的准确性,R²最高为0.98
“Boosting the Accuracy of Stock Market Prediction via Multi-Layer Hybrid MTL Structure” 论文地址:https://arxiv.org/pdf/2501.09760 摘要 本研究引入了一种创新的多层次混合多任务学习架构,致力于提升股市预测的效能。此架构融…...
#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概述 二、漏洞复现步骤 三、技术…...
python Excel 表读取合并单元格以及清除空格符
读取合并单元格并保留合并信息 读取合并单元格并保留合并信息清除各单元格的空格和换行符,并去除列名中的空格和换行符 读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时,我们可能会遇到一个很棘手的问题&…...
jakarta EE学习笔记-个人笔记
WebServlet注解:声明一个类为Servlet Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface WebServlet {// 指定Servlet的影子String name() default ""; // 匹配地址映射(URL)String[] value() default {};// …...
TCP服务器与客户端搭建
一、思维导图 二、给代码添加链表 【server.c】 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.…...
回退 android studio emulator 的版本
前情提要 最近用 frida 需要一个完全跑 arm64 的手机 os,因为雷电实时转义 arm 到 x64 的方案本质上还是 x64,会导致 frida 有 bug。查了一下有帖子说 android studio 自带的模拟器支持直接跑 arm64 的镜像 (Other Images) 直接跑跑不通,调…...
Oracle CDB自动处理表空间不足脚本
之前我曾经发过一个自动处理表空间的脚本,可以通过定时任务自动处理表空间不足的问题;但是之前那个脚本没有涵盖CDB模式下的PDB,这里将脚本做了一下更新,可以处理CDB模式下多PDB的表空间问题。 传统模式的脚本请参考这个链接 Or…...
ES6 迭代器 (`Iterator`)使用总结
Iterator(迭代器)是 ES6 引入的一种 接口,用于 顺序访问 可迭代对象(Array、Set、Map、String、arguments、自定义对象等)。 Iterator(迭代器)的作用有三个: 为各种数据结构提供一个…...
赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索
hello~朋友们!好久不见! 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章: 周易六十四卦 掐指一算——小六壬 更多优质文章:个人主页 JAVA系列:JAVA 大佬们互三哦~互三必回!…...
MongoDB开发规范
分级名称定义P0核心系统需7*24不间断运行,一旦发生不可用,会直接影响核心业务的连续性,或影响公司名誉、品牌、集团战略、营销计划等,可能会造成P0-P2级事故发生。P1次核心系统这些系统降级或不可用,会间接影响用户使用…...
让相机自己决定拍哪儿!——NeRF 三维重建的主动探索之路
我在 NeRF 中折腾自动探索式三维重建的心得 写在前面: 最近我在研究三维重建方向,深切感受到 NeRF (Neural Radiance Fields) 在学术界和工业界都备受瞩目。以往三维重建通常要依赖繁琐的多视图几何管线(比如特征匹配、深度估计、网格融合等&…...
git reset和git revert的区别
git reset和git revert都是实现撤销的命令。 git reset是通过回退提交记录来实现撤销,原来指向的记录就像没提交过一样。 git revert是用于远程分支。执行后会产生一个新提交记录,而新提交的记录跟上一级的内容是相同的。 #恢复到当前上一级记录, 其中 …...
免费windows pdf编辑工具Epdf
Epdf(完全免费) 作者:不染心 时间:2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器,目前仍在开发中。它提供了一系列实用的命令行选项,方便用户对 PDF …...
11.PPT:世界动物日【25】
目录 NO12 NO34 NO56 NO789视频音频 NO10/11/12 NO12 设计→幻灯片大小→ →全屏显示(16:9)确定调整标题占位符置于图片右侧:内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…...
计算机网络的组成,功能
目录 编辑 什么是计算机网络? 一个最简单的计算机网络 集线器(Hub): 交换机(Switch) 路由器(router) 互联网 计算机网络的组成:从组成部分看 硬件 软件 协议…...
LabVIEW铅酸蓄电池测试系统
本文介绍了基于LabVIEW的通用飞机铅酸蓄电池测试系统的设计与实现。系统通过模块化设计,利用多点传感器采集与高效的数据处理技术,显著提高了蓄电池测试的准确性和效率。 项目背景 随着通用航空的快速发展,对飞机铅酸蓄电池的测试需求也…...
Vue3+codemirror6实现公式(规则)编辑器
实现截图 实现/带实现功能 插入标签 插入公式 提示补全 公式验证 公式计算 需要的依赖 "codemirror/autocomplete": "^6.18.4","codemirror/lang-javascript": "^6.2.2","codemirror/state": "^6.5.2","cod…...
Mac M1 ComfyUI 中 AnyText插件安装问题汇总?
Q1:NameError: name ‘PreTrainedTokenizer’ is not defined ? 该项目最近更新日期为2024年12月,该时间段的transformers 版本由PyPI 上的 transformers 页面 可知为4.47.1. A1: transformers 版本不满足要求,必须降级transformors &#…...
Github 2025-02-01 开源项目月报 Top20
根据Github Trendings的统计,本月(2025-02-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目8TypeScript项目3Jupyter Notebook项目2Rust项目2HTML项目2C++项目1Ruby项目1JavaScript项目1Svelte项目1非开发语言项目1Go项目1Oll…...