wxpython:wx.grid 表格显示 Excel xlsx文件

news/2024/7/21 4:17:53 标签: excel, wxpython, wx.grid, xlrd, xlsx

pip install xlrd
xlrd-1.2.0-py2.py3-none-any.whl (103 kB)
摘要: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files

pip install wxpython==4.2
wxPython-4.2.0-cp37-cp37m-win_amd64.whl (18.0 MB)
Successfully installed wxpython-4.2.0

编写 wx_grid_xlsx.py 如下

# -*- coding: utf-8 -*-
""" wx.grid 表格显示 Excel xlsx文件 """
import os
import sys
import datetime
import xlrd
import wx  
import wx.grid  
  
class MyFrame(wx.Frame):
 
    def __init__(self):  
        super().__init__(parent=None, title='wx.grid view xlsx ', size=(1000,600))
        panel = wx.Panel(self)  

        # 选择.xlsx文件名
        fileFilter = "xlsx Files (*.xlsx)|*.xlsx|" "Excel files (*.xls)|*.xls"
        fileDialog = wx.FileDialog(self, message="选择xlsx文件", wildcard=fileFilter, style=wx.FD_OPEN)
        dialogResult = fileDialog.ShowModal()
        if dialogResult != wx.ID_OK:
            return
        filename = fileDialog.GetPath()
        if not os.path.exists(filename):
            print(f'Error: {filename} not found.')
            sys.exit(2)

        book = xlrd.open_workbook(filename)
        sheetname = "Sheet1"
        sheet = book.sheet_by_name(sheetname)

        nrows = sheet.nrows  # 获取sheet中的有效行数
        if nrows > 10000:
            print(f" 行数: {nrows} > 10000 !")
            nrows = 10000
        ncols = sheet.ncols  # 获取sheet中的有效列数
        if ncols > 26:
            print(f" columns: {ncols} > 26 !")
            ncols = 26
        
        # 创建一个表格  
        self.grid = wx.grid.Grid(panel)  
        self.grid.CreateGrid(nrows, ncols)  # 创建一个 nrows行 ncols列的表格  
  
        # 设置表格的列标题
        cols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        for j in range(0, ncols):
            self.grid.SetColLabelValue(j, cols[j])   
  
        # 设置表格的行标题
        for i in range(0, nrows):
            self.grid.SetRowLabelValue(i, str(i+1))  

        #单元类型cell_type: 0.empty, 1.string, 2.number, 3.date, 4.boolean, 5.error, 6.blank
        # 向表格中添加数据
        for i in range(0, nrows):
            for j in range(0, ncols):
                v = sheet.cell_value(i,j)
                t = sheet.cell_type(i,j)
                if t ==0:
                    self.grid.SetCellValue(i,j, '')
                elif t ==1:
                    self.grid.SetCellValue(i,j, v)
                elif t ==2:
                    if v%1 ==0:
                        self.grid.SetCellValue(i,j, "%d" %v)
                    else:
                        self.grid.SetCellValue(i,j, "%.4f" %v)
                elif t ==3:
                    date_tuple = xlrd.xldate_as_tuple(v, book.datemode)
                    date_v = datetime.date(*date_tuple[:3])
                    self.grid.SetCellValue(i,j, date_v.strftime('%Y-%m-%d'))
                else:
                    self.grid.SetCellValue(i,j, str(v))  
  
        # 使用 sizer 来管理布局  
        sizer = wx.BoxSizer(wx.VERTICAL)  
        sizer.Add(self.grid, 1, wx.EXPAND | wx.ALL, 5)  
        panel.SetSizer(sizer)  


if __name__ == '__main__':  
    app = wx.App(False)  
    frame = MyFrame()
    frame.Show(True)    
    app.MainLoop()

运行 python wx_grid_xlsx.py

参考了百度:文心一言:示例 wx_grid_demo.py

import wx  
import wx.grid  
  
class MyFrame(wx.Frame):  
    def __init__(self):  
        super().__init__(parent=None, title='Grid Example')  
        panel = wx.Panel(self)  
  
        # 创建一个表格  
        self.grid = wx.grid.Grid(panel)  
        self.grid.CreateGrid(5, 3)  # 创建一个 5 行 3 列的表格  
  
        # 设置表格的列标题  
        self.grid.SetColLabelValue(0, "Column A")  
        self.grid.SetColLabelValue(1, "Column B")  
        self.grid.SetColLabelValue(2, "Column C")  
  
        # 设置表格的行标题  
        self.grid.SetRowLabelValue(0, "Row 1")  
        self.grid.SetRowLabelValue(1, "Row 2")  
        self.grid.SetRowLabelValue(2, "Row 3")  
  
        # 向表格中添加数据  
        self.grid.SetCellValue(0, 0, "Data 1-1")  
        self.grid.SetCellValue(0, 1, "Data 1-2")  
        self.grid.SetCellValue(0, 2, "Data 1-3")  
        self.grid.SetCellValue(1, 0, "Data 2-1")  
        self.grid.SetCellValue(1, 1, "Data 2-2")  
        self.grid.SetCellValue(1, 2, "Data 2-3")  
  
        # 使用 sizer 来管理布局  
        sizer = wx.BoxSizer(wx.VERTICAL)  
        sizer.Add(self.grid, 1, wx.EXPAND | wx.ALL, 5)  
        panel.SetSizer(sizer)  


if __name__ == '__main__':  
    app = wx.App()  
    frame = MyFrame()
    frame.Show()    
    app.MainLoop()


http://www.niftyadmin.cn/n/5066064.html

相关文章

c与c++语法之数组

1.0 数组是cin.getline(name,len) cin.get() string 是getline(cin,s) 2.0初始化的时候可以不加等号 3.0c程序长使用指针而不是数组来处理字符串 4.0strlne()函数也是不计入‘\0’的 5.0substr()一定是句号使用方法 这个需要牢记 两个使用方式 s.substr(5) s.substr(5,3)

C++:stl:stack、queue、priority_queuej介绍及模拟实现和容量适配器deque介绍。

本文主要介绍c中stl的栈、队列和优先级队列并对其模拟实现,对deque进行一定介绍并在栈和队列的模拟实现中使用。 目录 一、stack的介绍和使用 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue的介绍和使用 1.queue的介绍 2.queue的使用 3.queue的…

【多线程】进程与线程 并发编程 面试题总结

进程和线程 进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基…

【算法|动态规划No.10】leetcode LCR 089. 打家劫舍 LCR 090. 打家劫舍 II

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

基于Java的药店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

通过async方式在浏览器中调用web worker

通过async方式在浏览器中调用web worker 近年来,网络应用程序变得越来越复杂,增加了越来越多的功能。因此,性能和响应性已成为 Web 开发人员关注的重点。解决这个问题的一个办法是使用web worker。 web worker简介 web worker是一个 javas…

【C++】STL简介(了解)

一、什么是STL STL (standard template libaray- 标准模板库 ) : 是 C 标准库的重要组成部分 ,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架 。 二、STL的版本 原始版本 Alexander Stepanov 、 Meng Lee 在惠普实验…

Java新特性中的Preview功能如何运行和调试

在每个Java新版本发布的特性中,都会包含一些Preview(预览)功能,这些功能主要用来给开发者体验并收集建议。所以,Preview阶段的功能并不是默认开启的。 如果想体验某个Java版本中的Preview功能,您还需要做一…