如何向QTableWidget追加Excel数据且不覆盖原有列与内容
问题根因
现有代码覆盖原有内容的核心问题:
- 直接调用
setRowCount(df.shape[0])、setColumnCount(df.shape[1])会重置表格行列配置,直接清空所有已存数据和预设列头 - 写入单元格时行索引从0开始计数,没有叠加表格原有行数的偏移量,就算不重置行号也会从第一行开始覆盖旧数据
修复后代码
def addExcel(self, excel_file_dir, worksheet_name): df = pd.read_excel(excel_file_dir, worksheet_name) if df.size == 0: return df.fillna('', inplace=True) # 读取当前表格已有的行数,作为新数据写入的起始位置 start_row = self.tableWidget.rowCount() # 只新增需要的行,完全不改动原有列配置 self.tableWidget.setRowCount(start_row + df.shape[0]) # 逐行写入Excel数据,行号叠加起始偏移 for df_row, values in df.iterrows(): target_row = start_row + df_row for col_idx, value in enumerate(values): # Excel列数超过表格预设列数时自动跳过,避免索引越界 if col_idx >= self.tableWidget.columnCount(): break if isinstance(value, (float, int)): value = '{0:0,.0f}'.format(value) self.tableWidget.setItem(target_row, col_idx, QTableWidgetItem(str(value)))
补充说明
- 上述代码完全保留你原有对数值类型的格式化逻辑,不会改变数字展示效果
- 自动忽略超出表格原有列数的Excel内容,不会打乱你预先设置的列顺序、列宽、列头配置
- 如果需要做Excel列和表格列的映射(比如Excel的「手机号」列对应表格第2列),只需调整
col_idx的对应规则即可,不需要修改整体追加逻辑
代码运行后,所有原有数据、列配置都会完整保留,新导入的Excel数据会自动追加到表格最后一条已有数据的后方。
内容的提问来源于stack exchange,提问作者Les Jetskii
相关产品推荐
相关产品推荐

