pyqt QAxWidget 读写Excel文件

news2024/10/6 16:19:58

QaxWidget相比openpyxl 的方式区别是提供了图形界面,excel的输入修改不用再编写代码.activeX技术是个过时的技术,发挥下余热. 

# -*- coding: utf-8 -*-
from PyQt5.QAxContainer import QAxWidget
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QFileDialog
from PyQt5 import QtWidgets
from pyqtconsole.console import PythonConsole
import os
import getpath
import myglobal
class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        layout = QVBoxLayout(self)
        self.ax = QAxWidget(self)#"Excel.Application",self)
        # self.ax = AxWidget()#QAxWidget("{000208DB-0000-0000-C000-000000000046}",self)#book
        # self.excel.setProperty("Visible", True);
        # self.excel=Application()
        # print(dir(self.axWidget))
        # self.axWidget.initialize(self.excel._dispobj_)#a._dispobj_._oleobj_
        h=QtWidgets.QHBoxLayout()
        h.addWidget(QPushButton('打开excel', self, clicked=self.onOpenWord))
        h.addWidget(QPushButton('getdata', self, clicked=self.getdata))
        h.addWidget(QPushButton('save as', self, clicked=self.saveas))
        h.addWidget(QPushButton('calc', self, clicked=self.calc))
        # h.addWidget(QPushButton('quit', self, clicked=self.quitWord))
        # self.console = interpreter.TerminalPython(self, mainw=self, app=QtWidgets.qApp)

        self.console=PythonConsole()
        self.console.push_local_ns('app', QtWidgets.qApp)
        self.console.push_local_ns('mainw', self)
        self.console.eval_queued()
        self.console.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        self.console.resize(self.console.width(),200)
        h.addWidget(self.console)
        layout.addLayout(h)
        layout.addWidget(self.ax)
        # self.workbooks = self.excel.querySubObject("Workbooks")
        self.ax.setControl(os.path.join(getpath.getpath(),"重量法.XLSX"))
        # self.excel=self.ax.querySubObject("Application")
    def getdata(self):
        s1=self.ax.querySubObject("Activesheet")
        c11=s1.querySubObject("Cells(1,1)")
        print(c11.property("Value"))
        pass
    def getCellValue(self,i,j):
        s1=self.ax.querySubObject("Activesheet")
        c11=s1.querySubObject(f"Cells({i},{j})")
        return(c11.property("Value"))
    def setCellValue(self,i,j,value):
        # 'ws=self.ax.querySubObject("Worksheets")
        # 's1=ws.querySubObject("Item(int)",1)
        s1=self.ax.querySubObject("Activesheet")
        c11=s1.querySubObject(f"Cells({i},{j})")
        c11.setProperty("Value",value)
    def getDblOne(self,i, jstr):
        if self.getCellValue(i, jstr)== "":
            return 1.0
        else:
            r=self.getDbl(i, jstr)
            if r==0:
                r=1.0
            return r
    def getDbl(self,i, jstr):
        s1=self.getCellValue(i, jstr)
        r=myglobal.myfloat(s1)
        # print(s1,r)
        return r
    def save_zhongliang(self,ffbh, ejff, ejjs):
        # Dim r As Range
        # If ActiveSheet Is Nothing Then
        #  Exit Sub
        # End If
        # Set r = ActiveSheet.UsedRange
        # Dim f As String
        # Dim m As String
        # Dim tpbh As String, syy As String, ysry As String, syyqm As String, yqbh As String
        # Dim row_num As Integer
        row_num = self.getRowCount()
        # Dim sid As String
        # Dim i As Integer
        ActiveSheet=self.ax.querySubObject("Activesheet")
        i=7
        while(i<=row_num):
            sid=ActiveSheet.querySubObject(f"Cells({i},{"A"})").property("Value")
            if  sid!= "" and sid!=None:
                break
            i+=1
        f = ActiveSheet.querySubObject(f"Cells({2},{"E"})").property("Value")#ActiveSheet.Cells(2, "E").Value
        if f==None:
            f=""
        ffbh = ActiveSheet.querySubObject(f"Cells({1},{"B"})").property("Value")#ActiveSheet.Cells(1, "B").Value
        syy = ActiveSheet.querySubObject(f"Cells({1},{"K"})").property("Value")#ActiveSheet.Cells(1, "K").Value
        ysry = ActiveSheet.querySubObject(f"Cells({1},{"N"})").property("Value")#ActiveSheet.Cells(1, "N").Value
        syyqm = syy
        yqbh = ActiveSheet.querySubObject(f"Cells({1},{"H"})").property("Value")#ActiveSheet.Cells(1, "H").Value
        item_name = ActiveSheet.querySubObject(f"Cells({2},{"B"})").property("Value")#ActiveSheet.Cells(2, "B").Value
        ActiveSheet.querySubObject(f"Cells({3},{"P"})").setProperty("Value",item_name)#ActiveSheet.Cells(3, "P").Value = item_name
        # Dim row As Integer
        # Dim output_folder As String
        # Dim at As Integer
        # Dim fname As String
        i=row_num
        while i>=1:
            v=ActiveSheet.querySubObject(f"Cells({i},{"A"})").property("Value")
            print(i,v)
            if v!=None and v!="":
                row = i
                break
            i=i-1
        r=ActiveSheet.querySubObject("UsedRange")
        print(row,r.querySubObject("Rows").property("Count"))
        while row + 1 <= r.querySubObject("Rows").property("Count"):
            print(row+1,r.querySubObject("Rows").property("Count"))
            # ActiveSheet.Rows(row + 1).Delete
            ActiveSheet.querySubObject(f"Rows({row+1})").dynamicCall("Delete()")
        at = 1
        ActiveSheet.querySubObject(f"Cells({row+1},{at})").setProperty("Value","ffbh&" + ffbh)#ActiveSheet.Cells(row + 1, at).Value = "ffbh&" + ffbh
        ActiveSheet.querySubObject(f"Cells({row+2},{at})").setProperty("Value","syy&" + syy)# ActiveSheet.Cells(row + 2, at).Value = "syy&" + syy
        ActiveSheet.querySubObject(f"Cells({row+3},{at})").setProperty("Value","ysry&" + ysry)# ActiveSheet.Cells(row + 3, at).Value = "ysry&" + ysry
        ActiveSheet.querySubObject(f"Cells({row+4},{at})").setProperty("Value","yqbh&" + yqbh)# ActiveSheet.Cells(row + 4, at).Value = "yqbh&" + yqbh
        ActiveSheet.querySubObject(f"Cells({row+5},{at})").setProperty("Value","syyqm&" + syyqm)# ActiveSheet.Cells(row + 5, at).Value = "syyqm&" + syyqm
        ActiveSheet.querySubObject(f"Cells({row+6},{at})").setProperty("Value","dict0&" + f)# ActiveSheet.Cells(row + 6, at).Value = "dict0&" + f
        ActiveSheet.querySubObject(f"Cells({row+6},{at})").setProperty("Value","系数")# ActiveSheet.Cells(row + 6, at + 1).Value = "Ñõ»¯ÎïϵÊý"
        ActiveSheet.querySubObject(f"Cells({row+7},{at})").setProperty("Value","ejff&" + ejff)# ActiveSheet.Cells(row + 7, at).Value = "ejff&" + ejff
        ActiveSheet.querySubObject(f"Cells({row+7},{at})").setProperty("Value","二级方法")# ActiveSheet.Cells(row + 7, at + 1).Value = "¶þ¼¶·½·¨"
        ActiveSheet.querySubObject(f"Cells({row+8},{at})").setProperty("Value","ejfxjs&" + ejjs)# ActiveSheet.Cells(row + 8, at).Value = "ejfxjs&" + ejjs
        ActiveSheet.querySubObject(f"Cells({row+8},{at})").setProperty("Value","二级分析技术")# ActiveSheet.Cells(row + 8, at + 1).Value = "¶þ¼¶·ÖÎö¼¼Êõ"
        output_folder = "d:\\"
        # 'output_folder = "\\10.0.114.230\»¯Ñ§·ÖÎöÊÒ\ÒÇÆ÷²É¼¯\EMGA930_test\930"
        # output_folder = "\\10.0.114.230\»¯Ñ§·ÖÎöÊÒ\ÒÇÆ÷²É¼¯\caiji\cl\zhongliang"
        if sid == "":
            fname = "tmp"#Format(Now, "yyyymmdd hhmmss")
        else:
            fname = sid
        filename=os.path.join(output_folder,fname)
        self.ax.dynamicCall("SaveAs(const QString&)",filename)
    def saveas(self):
        self.save_zhongliang("","","")
        return
        filename=os.path.join(getpath.getpath(),"a1.xlsx")
        self.ax.dynamicCall("SaveAs(const QString&)",filename)
        # workbook->synamicCall(“Close(Boolean)”, false); //! 关闭文件
    def getRowCount(self):
        s1=self.ax.querySubObject("Activesheet")
        r=s1.querySubObject("UsedRange")
        rows=r.querySubObject("Rows")
        return rows.property("Count")
    def runCalc(self):
        excel=self.ax.querySubObject("Application")
        excel.dynamicCall("Run(const QString&)","mycalc")
    def calc(self):
        print("calc")
        # 'Dim f As Double, m2 As Double, m1 As Double, m0 As Double, m3 As Double, m4 As Double, m5 As Double
        # 'Dim row_num As Integer
        # 'Dim mass As Double, V1 As Double, V2 As Double
        # 'Dim item_name As String
        # 'Dim r As Range
        # If ActiveSheet Is Nothing Then
        #  Exit Sub
        # End If
        # Set r = ActiveSheet.UsedRange
        f =self.getDblOne(2, "E")
        item_name =self.getCellValue(2, "B")
        self.setCellValue(3, "P",item_name)
        row_num =self.getRowCount()
        i = 5
        while i<= row_num:
            print(i)
            mass = self.getDbl(i, "D")
            m2 = self.getDbl(i, "H")
            m1 = self.getDbl(i, "I")
            m0 = self.getDbl(i, "J")
            m3 = self.getDbl(i, "K")
            m4 = self.getDbl(i, "L")
            m5 = self.getDbl(i, "M")
            V1 = self.getDbl(i, "F")
            V2 = self.getDbl(i, "G")
            if mass == 0:
                pass
                print("pass")
            else:
                if V2 == 0:
                    V1 = 1
                    V2 = 1
                out = (m2 - m1 - m0 + m3 - m4 - m5) / mass * V1 / V2 * f * 100
                print(m2,m1,m0,m3,m4,m5,mass,V1,V2,f)
                print(out)
                self.setCellValue(i, "P",out)
            i+=1
        self.ax.setFocus()
        pass
    def onOpenWord(self):
        path, _ = QFileDialog.getOpenFileName(
            self, '请选择excel文件', '', 'excel(*.xlsx *.xls)')
        if not path:
            return
        # self.ax.querySubObject("Open(const QString&)", path);
        # 不显示窗体
        # self.axWidget.dynamicCall('SetVisible (bool Visible)', 'false')
        # self.axWidget.setProperty('DisplayAlerts', False)
        self.ax.setControl(path)
    def closeEvent(self,e):
        # self.ax.dynamicCall("Close()");
        self.ax.clear()
        # self.excel.dynamicCall('Quit()')
        print("close")

if __name__ == '__main__':
    import sys
    from PyQt5.QtWidgets import QApplication
    app = QApplication(sys.argv)
    w = Window()
    w.resize(1300,800)
    w.show()
    sys.exit(app.exec_())

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从人才战略到人才生态,金徽酒高增长的“明线”与“暗线”

执笔 | 文 清 编辑 | 扬 灵 2016年3月&#xff0c;金徽酒于A股上市&#xff0c;全年实现营收12.77亿元。2023年&#xff0c;金徽酒实现营收25.48亿元&#xff0c;比上市当年增加99.5%&#xff0c;近乎翻倍。而当我们深度关注金徽酒&#xff0c;在其业绩高增长的“明线”背…

c语言项目-贪吃蛇项目2-游戏的设计与分析

文章目录 前言游戏的设计与分析地图&#xff1a;这里简述一下c语言的国际化特性相关的知识<locale.h> 本地化头文件类项setlocale函数 上面我们讲到需要打印★&#xff0c;●&#xff0c;□三个宽字符找到这三个字符打印的方式有两种&#xff1a; 控制台屏幕的长宽特性&a…

【前端 - Vue】Vuex基础入门,创建仓库的详细步骤

&#x1f680; 个人简介&#xff1a;6年开发经验&#xff0c;现任职某国企前端负责人&#xff0c;分享前端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;前端菜鸟的自我修养❣️ &#x1f4dd; 专 栏&#xff1a;vue从基础到起飞 &#x1f308; 若有帮助&…

VOC格式标签各个字段的解释

想了解一下VOC格式数据标签各个字段的含义&#xff0c;搜了一圈没看到&#xff0c;懒得去官网了&#xff0c;直接问了GPT-4o&#xff0c;以下回答字段解析来自GPT-4o&#xff0c;例子我自己写的 VOC (Visual Object Classes) 数据标签格式主要用于目标检测任务。VOC格式的标签…

Mybatis01-初识Mybatis

简介 1、 什么是Mybatis MyBatis 是一款优秀的持久层框架; 它支持自定义 SQL、存储过程以及高级映射 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Ol…

AI绘画Stable Diffusion【隐藏文字】:将艺术字隐藏在国风云雾山水图中

大家好&#xff0c;我是灵魂画师向阳 今天我们分享一下用AI绘画工具Stable Diffusion制作网上很火的隐藏文字。这里以将艺术字隐藏在国风云雾山水图为例进行讲解&#xff0c;下面我们就来看看吧。 一. 艺术字隐藏在国风云雾山水图中制作方法 【第一步】&#xff1a;制作底图…

TH方程学习 (7)

一、内容介绍 TH存在广泛应用&#xff0c;在下面案例中&#xff0c;将介绍几种相对运动模型&#xff0c;斜滑接近模型&#xff0c;本节学习斜滑接近制导方法能够对接近时间、接近方向以及自主接近过程的相对速度进行控制。施加脉冲时刻追踪器的位置连线可构成一条直线&#xf…

PostgreSQL专家(pcp51)--王丁丁

#PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试 #PG培训

深入探索AliExpress API接口:技术实现与代码示例

AliExpress API是阿里巴巴集团为开发者提供的一套开放接口&#xff0c;它允许开发者通过编程方式访问AliExpress平台的数据&#xff0c;如商品信息、订单数据、物流信息等。API支持多种编程语言&#xff0c;包括Java、Python、PHP等&#xff0c;同时提供了丰富的API接口和详尽的…

CSS(盒子模型,定位,浮动,扩展)

CSS 盒子模型&#xff1a;外边距&#xff1a;内边距&#xff1a;水平居中&#xff1a; 定位&#xff1a;相对定位&#xff1a;绝对定位&#xff1a;固定定位&#xff1a; 浮动&#xff1a;扩展&#xff1a; 盒子模型&#xff1a; 盒子模型(Box Model) 规定了元素框处理元素内容…

多功能光时域反射仪的工作原理

6426A-2101多功能光时域反射仪是新一代掌上型智能化光纤通信测量仪器&#xff0c;具有强大的功能和广泛的应用领域。它能够显示光纤及光缆的损耗分布曲线图&#xff0c;测量光纤及光缆的多种关键参数&#xff0c;包括长度、损耗、接续质量等&#xff0c;为光纤通信系统的工程施…

vue2中使用tinymce

vue2中使用tinymce的记录 本篇文章主要实现的功能&#xff1a; &#xff08;1&#xff09;【查看】时禁用编辑 &#xff08;2&#xff09;【编辑】时某些内容是不可编辑的 实现效果图&#xff1a; 第一个功能的主要代码 disabled属性 // 使用地地方&#xff0c;传递disabled属…

GO语言 服务发现概述

https://zhuanlan.zhihu.com/p/32027014 明明白白的聊一下什么是服务发现-CSDN博客 一、服务发现 是什么 在传统的系统部署中&#xff0c;服务运行在一个固定的已知的 IP 和端口上&#xff0c;如果一个服务需要调用另外一个服务&#xff0c;可以通过地址直接调用。 但是&…

uniadmin引入iconfont报错

当在uniadmin中引入iconfont后&#xff0c;出现错误&#xff1a; [plugin:vite:css] [postcss] Cannot find module ‘E:/UniAdmin/uniAdmin/static/fonts/iconfont.woff2?t1673083050786’ from ‘E:\UniAdmin\uniAdmin\static\fonts\iconfont.css’ 这是需要更改为绝对路径…

大语言模型RAG-将本地大模型封装为langchain的chat model(三)

大语言模型RAG-将本地大模型封装为langchain的chat model&#xff08;三&#xff09; 往期文章&#xff1a; 大语言模型RAG-技术概览 (一) 大语言模型RAG-langchain models (二) 上一期langchain还在0.1时代&#xff0c;这期使用的langchain v0.2已经与之前不兼容了。 本期介…

废品回收小程序怎么做?有哪些核心功能?

废品回收行业正逐步走向高质量发展的道路。在国家政策的推动下&#xff0c;再生资源市场需求旺盛&#xff0c;行业内部竞争格局逐渐明朗。 随着互联网技术的发展&#xff0c;"互联网回收"成为废品回收行业的一个新趋势。通过微信小程序这种线上平台&#xff0c;用户…

Next-Level Agents:释放动态上下文(Dynamic Context)的巨大潜力

编者按&#xff1a; 本文深入探讨了如何通过优化动态上下文信息&#xff08;Dynamic Context&#xff09;来提升 AI Agents 的工作效率和准确性。文章首先概述了五种常见的技术策略&#xff0c;包括信息标识(Message Labeling)、针对不同需求设定不同上下文、优化系统提示词(Sy…

用python写一个基于PyQt5和OpenAI的智能问答项目

摘要&#xff1a; 使用python写一个可以对话的智能问答机器人&#xff0c;界面是使用PyQt5写的&#xff0c;通过调用OpenAl的免费接口&#xff0c;实现实时聊天功能。 1.申请免费的API key 前往页面https://github.com/chatanywhere/GPT_API_free 点击下面链接&#xff1a; …

如何判断ubuntu是桌面版(destop版)还是服务版(server版)?(systemctl status display-manager)

文章目录 用命令systemctl status display-manager 用命令systemctl status display-manager systemctl status display-manager如果是ubuntu desktop&#xff0c;将显示服务正在运行&#xff0c;如&#xff1a; 如果是ubuntu server&#xff0c;将不会显示服务&#xff0c;提…

计网ppt标黄知识点整理第(1)章节——谢希仁版本、期末复习自用

大众熟知的三大网络&#xff1a;电信网络、有线电视网络、计算机网络。发展最快起到核心的是计算机网络。Internet是全球最大、最重要的计算机网络。互联网&#xff1a;流行最广、事实上的标准译名。互连网&#xff1a;把许多网络通过一些路由器连接在一起。与网络相连的计算机…