实现功能:使用PySide6进行工具开发,通过TableWidget选择某个单元格进行Ctrl+A全选再Ctrl+C复制后,打开excel选择某个sheet页签的某个单元格进行Ctrl+V,实现自动复制全表内容(包括列表头)。
难点:
(1)剪贴板格式:
使用制表符 (\t) 分隔列,使用换行符 (\n) 分隔行,确保 Excel 能够正确解析。
(2)处理单元格中的换行符:
在复制单元格内容时,将换行符 (\n) 替换为特殊标记(例如 |||),以避免 Excel 将其解释为单元格内的换行。
示例代码如下:
from PySide6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QMainWindow
from PySide6.QtCore import Qt, QMimeData
class CustomTableWidget(QTableWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def keyPressEvent(self, event):
"""重写键盘事件"""
if event.key() == Qt.Key.Key_C and event.modifiers() == Qt.KeyboardModifier.ControlModifier:
self.copy_entire_table()
else:
super().keyPressEvent(event)
def copy_entire_table(self):
"""复制整个表格内容(包括列标题和行标题)"""
# 获取表格的行数和列数
rows = self.rowCount()
cols = self.columnCount()
# 存储复制的内容
text = ""
# 添加列标题
header_labels = [self.horizontalHeaderItem(col).text() if self.horizontalHeaderItem(col) else ""
for col in range(cols)]
text += "\t".join(header_labels) + "\n"
# 添加行内容和行标题
for row in range(rows):
# 添加行标题
row_header = self.verticalHeaderItem(row).text() if self.verticalHeaderItem(row) else ""
text += row_header + "\t"
# 添加行内容
row_data = []
for col in range(cols):
item = self.item(row, col)
if item:
# 替换单元格中的换行符为特殊标记(例如 "|||")
cell_text = item.text().replace("\n", "|||")
row_data.append(cell_text)
else:
row_data.append("")
text += "\t".join(row_data) + "\n"
# 将文本复制到剪贴板
clipboard = QApplication.clipboard()
mime_data = QMimeData()
mime_data.setText(text.strip())
clipboard.setMimeData(mime_data)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QTableWidget 复制全表内容示例")
self.setGeometry(100, 100, 600, 400)
# 创建一个 5x5 的表格
self.table = CustomTableWidget(5, 5, self)
self.setCentralWidget(self.table)
# 设置表头
self.table.setHorizontalHeaderLabels([f"Col {i+1}" for i in range(5)])
self.table.setVerticalHeaderLabels([f"Row {i+1}" for i in range(5)])
# 填充示例数据
for row in range(5):
for col in range(5):
item = QTableWidgetItem(f"Data {row+1}-{col+1}")
if row == 0 and col == 0:
# 在第一个单元格中添加带换行符的文本
item.setText("Line 1\nLine 2\nLine 3")
self.table.setItem(row, col, item)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())