如何利用Python实现给Excel表格截图

2025-02-08 16:50

本文主要是介绍如何利用Python实现给Excel表格截图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《如何利用Python实现给Excel表格截图》这篇文章主要为大家详细介绍了如何利用Python实现给Excel表格截图功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...

我搜索了网络上的方案,感觉把 Excel 表格转换为 html 再用 platwright 截图是比China编程较顺畅的路径,因为有顺畅的工具链。如果使用的是 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 capturjavascripte_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_col
        end_row, end_col = merged_range.max_row, merged_range.max_col
        merges.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 Nonpythone,
                    'left': '1px solid' if border.left and border.left.style else None,
                    'right': '1px sowww.chinasem.cnlid' 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 = 0
        for col_idx,cell in enumerate(row):
            if skip_next_cell > 0:
                skip_next_cell -= 1
                continue
            # 行号、列号从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"&lChina编程t;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 html
 
def 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  # 网页URL
    output_file = screenshot_file_path  # 输出文件路径
    table_selector = 'table'  # 表格的css选择器,根据实际情况调整
    capture_table_screenshot(url, output_file, table_selector)
        
if __name__ == "__main__":
    main()

到此这篇关于如何利用python实现给Excel表格截图的文章就介绍到这了,更多相关Python Excel截图内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于如何利用Python实现给Excel表格截图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:http://www.cppcns.com/jiaoben/python/699626.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1153349

相关文章

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结