如何实现点击Excel指定单元格时记录秤的实时数据?
Python实现点击Excel特定单元格记录秤实时数据
核心方案
通过串口读取秤的实时数据,结合Windows COM接口监听Excel单元格选中事件,当点击指定单元格时触发数据写入操作。这个方案适配大多数串口秤,且无需额外Excel插件。
依赖安装
先安装所需Python库:
pip install pyserial pywin32
代码实现
1. 读取秤的串口数据
import serial import time def read_scale_data(port='COM3', baudrate=9600): """读取秤的实时重量数据,返回浮点型数值""" try: # 初始化串口(参数需匹配秤的配置) ser = serial.Serial(port, baudrate, timeout=1) time.sleep(2) # 等待串口握手完成 while True: if ser.in_waiting > 0: # 读取并解码串口数据 raw_data = ser.readline().decode('utf-8').strip() # 过滤有效数据(假设秤返回纯数字/带小数点的重量) if raw_data.replace('.', '').isdigit(): return float(raw_data) time.sleep(0.1) except Exception as e: print(f"秤数据读取失败: {str(e)}") return None
2. 监听Excel单元格点击并记录数据
import win32com.client as win32 import pythoncom class ExcelCellListener: """监听Excel工作表的单元格选中事件""" def OnSelectionChange(self, target_range): # 检查是否选中了目标单元格(示例为Sheet1的A1单元格) if target_range.Address == "$A$1": weight = read_scale_data() if weight is not None: ws = win32.GetActiveObject("Excel.Application").ActiveSheet # 找到B列的下一个空行 next_empty_row = ws.Cells(ws.Rows.Count, "B").End(-4162).Row + 1 # xlUp常量值为-4162 # 写入重量和时间戳 ws.Cells(next_empty_row, "B").Value = weight ws.Cells(next_empty_row, "C").Value = win32.Dispatch("DateTime").Now() print(f"已记录: {weight}kg | {ws.Cells(next_empty_row, 'C').Value}") if __name__ == "__main__": pythoncom.CoInitialize() # 连接到Excel实例(优先使用已打开的,否则新建) try: excel_app = win32.GetActiveObject("Excel.Application") except: excel_app = win32.Dispatch("Excel.Application") excel_app.Visible = True excel_app.Workbooks.Add() # 绑定事件到当前活动工作表 win32.WithEvents(excel_app.ActiveSheet, ExcelCellListener) # 保持程序运行以监听事件 print("监听启动:点击A1单元格记录秤数据...") while True: pythoncom.PumpWaitingMessages() time.sleep(0.1)
关键配置说明
- 串口参数:修改
read_scale_data中的port和baudrate,确保与秤的串口设置一致(可通过秤的说明书或串口调试工具确认) - 目标单元格:修改
target_range.Address的值,比如要监听C5单元格就改为"$C$5" - 数据写入位置:调整
ws.Cells(next_empty_row, "B")中的列标识(如"B"改为"D")来改变数据存储列
备选方案(VBA)
如果不想用Python,也可以直接在Excel中写VBA代码:
- 打开Excel按
Alt+F11进入VBA编辑器 - 在目标工作表的代码窗口中添加以下代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then ' 这里调用串口读取函数(需借助VBA串口控件或API) ' 示例:假设已通过VBA获取到重量值weight Dim nextRow As Long nextRow = Me.Cells(Me.Rows.Count, "B").End(xlUp).Row + 1 Me.Cells(nextRow, "B").Value = weight Me.Cells(nextRow, "C").Value = Now() End If End Sub
注:VBA读取串口需要额外配置MSComm控件或调用Windows API,复杂度略高。
内容的提问来源于stack exchange,提问作者Kojo Olivet
相关产品推荐
相关产品推荐

