使用Python实现简单的Excel绘图工具

 更新时间:2025年10月12日 10:10:54   作者:codingtea  
这篇文章主要为大家详细介绍了如何使用Python实现简单的Excel绘图工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

最近做了一个有趣的小工具:用 Python 把任意图片“复刻”成 Excel 表格艺术。

通过解析图片像素值,然后在 Excel 单元格中填充对应颜色,就能生成一张由无数小方格组成的“像素画”。

这个工具不复杂,适合对图像处理和自动化感兴趣的小伙伴研究。

在这篇图文教程中,我会一步步带你了解工具的原理、代码实现和使用方法。

代码基于 PyQt5(GUI 界面)、OpenCV(图像处理)和 openpyxl(Excel 操作),简单易上手。感兴趣的同学可以直接 fork 代码试试!

工具效果预览

先来看看成品效果吧!左边是原图,右边是生成的 Excel 艺术(每个单元格就是一个像素)

另一个例子,我换了张猫咪图片,生成后效果如下:

(截图说明:工具自动缩放图片到 320 宽,生成低分辨率 Excel 以节省资源,但细节依然清晰)

手工操作这种效果?想想看,一张 320x240 的图片就需要 76,800 个单元格手动填色……太恐怖了!用程序,几秒钟搞定。

实现原理

核心思路很简单:

  • 读取图片:用 OpenCV 加载图像,获取每个像素的 RGB 值。
  • 缩放处理:为了避免高分辨率图片占用过多资源,默认将宽度固定为 320,高度按比例缩放。
  • 生成 Excel:用 openpyxl 创建工作表,每个像素对应一个单元格,填充对应颜色的 PatternFill。
  • GUI 界面:PyQt5 提供简单界面,选择图片和保存路径,一键绘制,还带进度条显示。

环境准备

  • Python 3.8+
  • 依赖库:pip install PyQt5 opencv-python openpyxl numpy
  • UI 文件:用 Qt Designer 设计 excel_ui.py(我用的是一个简单的窗口,包含图片预览、路径输入和按钮)。

如果懒得配置环境,我还打包了 EXE 可执行文件(脱离 Python 环境)

完整代码

下面是核心代码,分为主窗口类和入口。代码不长,注释详尽。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox, QProgressDialog
from PyQt5.QtGui import QImage, QPixmap
from excel_ui import Ui_MainWindow  # Qt Designer 生成的 UI 文件
from PyQt5.QtCore import Qt, QTimer
import cv2
import numpy as np
import openpyxl
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letter

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.img_ori = None  # 存储原始图像

    def select_pic(self):
        """选择图片并预览"""
        file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files(*.png *.jpg *.jpeg *.bmp)")
        if file_path:
            self.img_ori = cv2.imread(file_path)
            img = cv2.cvtColor(self.img_ori, cv2.COLOR_BGR2RGB)
            h, w, ch = img.shape
            bytes_per_line = ch * w
            q_image = QImage(img.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
            q_pixmap = QPixmap.fromImage(q_image)
            self.imageLabel.setPixmap(q_pixmap.scaled(
                self.imageLabel.width(), self.imageLabel.height(),
                Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation
            ))

    def select_excel(self):
        """选择 Excel 保存路径"""
        file_path, _ = QFileDialog.getSaveFileName(
            self,
            "设置 Excel 路径",
            "",
            "Excel Files (*.xlsx *.xls)"
        )
        if file_path:
            self.excelPathLineEdit.setText(file_path)
            return file_path
        else:
            return None

    def huizhi(self):
        """绘制图片到 Excel"""
        if not hasattr(self, 'img_ori') or self.img_ori is None:
            QMessageBox.warning(self, "警告", "请先选择图片!")
            return
        excel_path = self.excelPathLineEdit.text()
        if not excel_path:
            QMessageBox.warning(self, "警告", "请先选择 Excel 文件保存路径!")
            return
        try:
            # 强制缩放宽度为 320,高度按比例计算
            min_width = 320
            image = self.img_ori
            height, width = image.shape[:2]
            scale_factor = min_width / width
            new_width = min_width
            new_height = int(height * scale_factor)
            image = cv2.resize(image, (new_width, new_height))

            # 创建 Excel 工作簿
            workbook = openpyxl.Workbook()
            sheet = workbook.active

            # 设置单元格为正方形(宽度 3,高度 17)
            for col in range(1, new_width + 1):
                sheet.column_dimensions[get_column_letter(col)].width = 3
            for row in range(1, new_height + 1):
                sheet.row_dimensions[row].height = 17

            # 创建进度条
            progress = QProgressDialog("正在绘制图片到 Excel...", "取消", 0, new_height, self)
            progress.setWindowTitle("进度")
            progress.setWindowModality(Qt.WindowModal)
            progress.setValue(0)

            # 遍历图片像素并填充 Excel 单元格
            for y in range(new_height):
                if progress.wasCanceled():
                    break
                for x in range(new_width):
                    b, g, r = image[y, x]  # OpenCV 默认 BGR 格式
                    color = "{:02x}{:02x}{:02x}".format(r, g, b)  # 转换为 RGB 格式的十六进制
                    if color == "000000":
                        color = "010101"  # 纯黑色替换为深灰色
                    fill = PatternFill(start_color=color, end_color=color, fill_type="solid")
                    sheet.cell(row=y + 1, column=x + 1).fill = fill
                progress.setValue(y + 1)
                QApplication.processEvents()  # 确保 UI 更新

            # 保存 Excel 文件
            if not progress.wasCanceled():
                workbook.save(excel_path)
                QMessageBox.information(self, "成功", "图片已成功绘制到 Excel 文件!")
            progress.close()
        except Exception as e:
            QMessageBox.critical(self, "错误", f"绘制失败: {str(e)}")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

代码亮点解析

  • 图像预览:select_pic() 用 QImage 实时显示选中的图片,保持宽高比。
  • 缩放优化:cv2.resize() 固定宽度 320,避免高分辨率卡顿。实际 Excel 文件大小控制在合理范围内。
  • 像素填充:双层循环遍历 (y, x),转 RGB 十六进制,应用 PatternFill。进度条用 QProgressDialog 实时反馈。
  • 异常处理:捕获保存错误,友好提示。

使用步骤

  • 运行程序(python main.py 或双击 EXE)。
  • 点击“选择图片”,挑选一张 PNG/JPG 等格式的图像,界面会预览。
  • 点击“选择 Excel 路径”,设置保存文件名(.xlsx)。
  • 点击“开始绘制”,等待进度条完成。
  • 打开生成的 Excel,Ctrl + 滚轮缩放查看效果!(建议全屏查看)

结语

这个小工具就是下午“无聊”时写的,编程的乐趣就在于把不可能变可能。

到此这篇关于使用Python实现简单的Excel绘图工具的文章就介绍到这了,更多相关Python Excel绘图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python详细讲解浅拷贝与深拷贝的使用

    Python详细讲解浅拷贝与深拷贝的使用

    这篇文章主要介绍了Python中的深拷贝和浅拷贝,通过讲解Python中的浅拷贝和深拷贝的概念和背后的原理展开全文,需要的小伙伴可以参考一下
    2022-07-07
  • Python实现在图像中隐藏二维码的方法详解

    Python实现在图像中隐藏二维码的方法详解

    隐写是一种类似于加密却又不同于加密的技术。这篇文章主要介绍了如何利用Python语言实现在图像中隐藏二维码功能,感兴趣的可以了解一下
    2022-09-09
  • numpy多维数组索引问题

    numpy多维数组索引问题

    这篇文章主要介绍了numpy多维数组索引的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Python使用OpenPyXL库操作Excel表的操作指南

    Python使用OpenPyXL库操作Excel表的操作指南

    在现代办公中,Excel表格无疑是处理数据、生成报告和分析信息的得力助手,无论是财务统计、数据整理还是业务分析,Excel 都扮演着不可或缺的角色,然而,手动处理Excel表格既费时又容易出错,故本文给大家介绍了Python使用OpenPyXL库操作Excel表的操作指南
    2024-11-11
  • Scrapy框架爬取西刺代理网免费高匿代理的实现代码

    Scrapy框架爬取西刺代理网免费高匿代理的实现代码

    今天小编就为大家分享一篇关于Scrapy框架爬取西刺代理网免费高匿代理的实现代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Python爬虫 urllib2的使用方法详解

    Python爬虫 urllib2的使用方法详解

    这篇文章主要介绍了Python爬虫 urllib2的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • python 简单照相机调用系统摄像头实现方法 pygame

    python 简单照相机调用系统摄像头实现方法 pygame

    今天小编就为大家分享一篇python 简单照相机调用系统摄像头实现方法 pygame,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • pyinstaller打包多个py文件和去除cmd黑框的方法

    pyinstaller打包多个py文件和去除cmd黑框的方法

    今天小编就为大家分享一篇pyinstaller打包多个py文件和去除cmd黑框的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python中plt.plot()、plt.scatter()和plt.legend函数的用法示例

    Python中plt.plot()、plt.scatter()和plt.legend函数的用法示例

    今天想要用matplotlib中的plt函数绘制图表,将多个数据曲线在一个图表中进行呈现,下面这篇文章主要给大家介绍了关于Python中plt.plot()、plt.scatter()和plt.legend函数用法的相关资料,需要的朋友可以参考下
    2022-03-03
  • python里将list中元素依次向前移动一位

    python里将list中元素依次向前移动一位

    这篇文章主要介绍了python里将list中元素依次向前移动一位,以及使用racket 5.2.1实现此功能的代码,希望对大家有所帮助
    2014-09-09

最新评论