当前位置: 首页 > article >正文

用 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)

我搜索了网络上的方案&#xff0c;感觉把 Excel 表格转换为 HTML 再用 platwright 截图是比较顺畅的路径&#xff0c;因为有顺畅的工具链。如果使用的是 Windows 系统则不需要阅读此文&#xff0c;因为 win32com 库更方便。这篇文章中 Excel 转 HTML 的方案&#xff0c;主要弥补…...

Linux 安装 Ollama

1、下载地址 Download Ollama on Linux 2、有网络直接执行 curl -fsSL https://ollama.com/install.sh | sh 命令 3、下载慢的解决方法 1、curl -fsSL https://ollama.com/install.sh -o ollama_install.sh 2、sed -i s|https://ollama.com/download/ollama-linux|https://…...

使用Ollama本地部署deepseek

1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包&#xff0c;如同安装软件一样&#xff0c;直接安装即可 win中默认为C盘&#xff0c;如果需要修改到其他盘&#xff0c;查找具体教程 运行list命令&#xff0c;检查是否安装成功 2、修改模型下载的…...

如何在RTACAR中配置IP多播(IP Multicast)

一、什么是IP多播 IP多播&#xff08;IP Multicast&#xff09;是一种允许数据包从单一源地址发送到多个目标地址的技术&#xff0c;是一种高效的数据传输方式。 多播地址是专门用于多播通信的IP地址&#xff0c;范围从 224.0.0.0到239.255.255.255 与单播IP地址不同&#x…...

2025年最新版武书连SCD期刊(中国科学引文数据库)来源期刊已更新,可下载PDF版!需要的作者进来了解~

2025年最新版武书连SCD期刊&#xff08;中国科学引文数据库&#xff09;来源期刊已更新&#xff01; 官网是不提供免费查询的。小编给大家两个路径&#xff0c;无需下载PDF&#xff0c;随时随地都能查25版SCD目录。 路径一&#xff1a;中州期刊联盟官网&#xff0c;25版SCD目…...

已验证正常,Java输入字符串生成PDF文件

Java输入字符串生成PDF文件过程&#xff1a; 在Java开发中&#xff0c;如何将字符串转换为 PDF 是一个常见的需求。网上找了很多例子都无法生成&#xff0c;经过多次尝试&#xff0c;终于实现了&#xff0c;特此记录一下。 1、引入pom.xml 添加所需的依赖 <dependency>&…...

存储异常导致的Oracle重大生产故障

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈&#xff0c;追求远距离的视音频的同步交互成为新的时尚。近些年来&#xff0c;依托计算机技术、通信技术和网络条件的发展&#xff0c;集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…...

C++ Primer 成员访问运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

使用云效解决docker官方镜像拉取不到的问题

目录 前言原文地址测试jenkins构建结果:后续使用说明 前言 最近经常出现docker镜像进行拉取不了&#xff0c;流水线挂掉的问题&#xff0c;看到一个解决方案: 《借助阿里个人版镜像仓库云效实现全免费同步docker官方镜像到国内》 原文地址 https://developer.aliyun.com/artic…...

Oracle中与 NLS(National Language Support,国家语言支持) 相关的参数

在Oracle中&#xff0c;NLS_DATABASE_PARAMETERS 和 NLS_INSTANCE_PARAMETERS 是两个重要的视图&#xff0c;用于存储与 NLS&#xff08;National Language Support&#xff0c;国家语言支持&#xff09; 相关的参数。它们的作用和区别如下&#xff1a; 1. NLS_DATABASE_PARAME…...

【Pytorch实战教程】Python探索利器:dir与help深度解析(PyTorch实战演示)

文章目录 Python探索利器:dir与help深度解析(PyTorch实战演示)一、前言:代码世界的探险装备二、dir():对象结构探测器1. 基础用法揭秘2. PyTorch实战应用三、help():内置文档浏览器1. 基础使用姿势2. 深度学习场景实战四、组合技:探索神经网络模块1. 模块结构探测2. 类方…...

【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析

一、引言与背景 在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;如DeepSeek以其卓越的自然语言理解和生成能力&#xff0c;推动了众多应用场景的发展。然而&#xff0c;大型模型的高昂计算和存储成本&#xff0c;以及潜在的数据隐私风险&#xff0c;限制了…...

【共享文件夹】使用Samba服务可在Ubuntu和Windows系统之间共享一个实际的文件夹

目标&#xff1a;在Ubuntu和Windows系统之间共享一个实际的文件夹&#xff0c;并能够共同编辑其中的文件 安装Samba创建共享文件夹配置Samba设置Samba密码重启Samba服务以应用更改&#xff1a;在Windows中访问共享文件夹如果客户机无法访问 Samba 服务器&#xff0c;解决方法①…...

3D图形学与可视化大屏:什么是几何着色器,有什么功能和应用。

一、几何着色器的定义 在 3D 图形学和可视化大屏中&#xff0c;几何着色器是一种可编程的图形处理单元&#xff08;GPU&#xff09;着色器阶段。它位于顶点着色器和片段着色器之间&#xff0c;主要负责处理由顶点着色器输出的几何图形数据。 几何着色器以图元&#xff08;如点…...

Python:凯撒密码

题目内容&#xff1a; 凯撒密码是古罗马恺撒大帝用来对军事情报进行加密的算法&#xff0c;它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列该字符后面第三个字符&#xff0c;对应关系如下&#xff1a; 原文&#xff1a;A B C D E F G H I J K L M N O P Q R …...

C++ labmbd表达式

文章目录 C++ Lambda 表达式详解1. Lambda 表达式的组成部分:2. Lambda 语法示例(1) 最简单的 Lambda(2) 带参数的 Lambda(3) 指定返回类型的 Lambda3. 捕获外部变量(1) 值捕获(复制)(2) 引用捕获(3) 捕获所有变量4. Lambda 在 STL 中的应用5. Lambda 作为 `std::function`6…...

第八届大数据与应用统计国际学术研讨会(ISBDAS 2025)

重要信息 官网&#xff1a;www.is-bdas.org 时间&#xff1a;2025年2月28-3月2日 地点&#xff1a;中国 广州 主办单位&#xff1a;广东省高等教育学会人工智能与高等教育研究分会 协办单位&#xff1a;北京师范大学人工智能与未来网络研究院、人工智能与大数据科研基地 …...

吴恩达深度学习——卷积神经网络的特殊应用

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习使用。 文章目录 人脸识别相关定义Similarity函数使用Siamese网络实现函数d使用Triplet损失学习参数 神经风格迁移深度卷积网络可视化神经风格迁移的代价函数内容损失函数风格损失函数 人脸识别 …...

[ Spring] Integrate Spring Boot Dubbo with Nacos 2025

文章目录 Dubbo Project StructureDeclare Plugins and RepositoriesIntroduce DependenciesDubbo Consumer PropertiesDubbo Provider ApplicationDubbo Provider ServiceDubbo Consumer PropertiesDubbo Consumer ApplicationDubbo Consumer ControllerCommand References Du…...

Django+simpleui实现文件上传预览功能

在 Django 中&#xff0c;文件通常不会直接存储到 MySQL 数据库中&#xff0c;而是存储在文件系统或云存储中&#xff0c;数据库中只存储文件的路径或元数据。 1. 创建 Django 项目和应用 如果还没有项目和应用&#xff0c;先创建一个&#xff1a; django-admin startproject…...

Centos执行yum命令报错

错误描述 错误&#xff1a;为仓库 ‘appstream’ 下载元数据失败 : Cannot prepare internal mirrorlist: Curl error (6): Couldn’t resolve host name for http://mirrorlist.centos.org/?release8&archx86_64&repoAppStream&infrastock [Could not resolve h…...

寒假2.7

题解 web&#xff1a;[HCTF 2018]WarmUp 打开是张表情包 看一下源代码 访问source.php&#xff0c;得到完整代码 代码审计 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.p…...

5.Python字典和元组:字典的增删改查、字典遍历、访问元组、修改元组、集合(set)

1. 字典&#xff08;dict&#xff09; 字典是一个无序的键值对集合&#xff0c;每个键对应一个值。 字典的增、删、改、查&#xff1a; 添加键值对: my_dict {a: 1, b: 2} my_dict[c] 3 # 添加新键c&#xff0c;值为3 print(my_dict) # 输出&#xff1a;{a: 1, b: 2, c: …...

无限使用Cursor

原理&#xff1a;运行程序获得15天的免费试用期&#xff0c;重新运行程序重置试用期&#xff0c;实现无限使用。免费的pro账号&#xff0c;一个月有250的高级模型提问次数。 前提&#xff1a;已安装cursor cursor-vip工具&#xff1a;https://cursor.jeter.eu.org?p95d60efe…...

如何查看Linux ISO镜像中的kernel版本

要查看Linux ISO镜像中的kernel版本&#xff0c;可以使用以下几种方法&#xff1a; 使用uname命令&#xff1a; 将ISO镜像挂载到系统中&#xff0c;然后进入挂载目录。运行以下命令查看内核版本&#xff1a;uname -r这将显示当前运行的内核版本。 查看/proc/version文件&#…...

STM32启动过程概述

1. STM32启动过程概述 STM32 微控制器的启动过程是指从上电或复位开始&#xff0c;到系统开始执行用户程序的整个过程。这个过程包括了硬件初始化、引导加载程序 (Bootloader) 执行、系统时钟配置、外设初始化等步骤。 2. STM32 启动的基本流程 上电或复位 STM32 芯片的启动过…...

unity碰撞的监测和监听

1.创建一个地面 2.去资源商店下载一个火焰素材 3.把procedural fire导入到自己的项目包管理器中 4.给magic fire 0 挂在碰撞组件Rigidbody , Sphere Collider 5.创建脚本test 并挂在magic fire 0 脚本代码 using System.Collections; using System.Collections.Generic; usi…...

企业FTP替代升级,实现传输大文件提升100倍!

随着信息技术的飞速发展&#xff0c;网络安全环境也变得越来越复杂。在这种背景下&#xff0c;传统的FTP&#xff08;文件传输协议&#xff09;已经很难满足现代企业对文件传输的需求了。FTP虽然用起来简单&#xff0c;但它的局限性和安全漏洞让它在面对高效、安全的数据交换时…...

python基础入门:3.3序列通用操作

Python序列操作终极指南&#xff1a;解锁数据处理的核心技能 # 快速导航 sequence_types ["列表", "元组", "字符串", "字节序列"]一、核心操作三位一体 1. 索引与切片体系 # 通用索引规则 data ["A", "B", &…...