1

Wie kann ich mehrere Elemente/Werte einer QTableView in eine Text/Excel-Datei kopieren und einfügen?Wie kopiere ich - Einfügen von mehreren Elementen Formular QTableView erstellt von QStandardItemModel in eine Text/Excel-Datei?

Mein Code:

tab_table_view = QtGui.QWidget() 
self.Tab.insertTab(0, tab_table_view, self.File_Name) 
self.tableView = QtGui.QTableView(tab_table_view) 
self.tableView.setGeometry(QtCore.QRect(0, 0, 721, 571)) 
self.model = QtGui.QStandardItemModel(self) 
self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection 

Diese Linie self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection hilft bei der mehrere Elemente in QTableView Auswahl, aber wenn ich tun CTRL +C und fügen Sie fügt nur das letzte Element oder dem Wert der Auswahl?

Ich habe die Zeile self.tableView.setEditTriggers(QAbstractItemView.AllEditTriggers) gesehen, aber diese gilt nur für ein einzelnes Element in der Tabelle und ignoriert die erweiterte Auswahl.

Bitte helfen Sie mir das ist das zweite Mal, dass ich diese Frage posten. Nun, ich frage mich, ob es überhaupt möglich ist? Bitte lass es mich wissen!

Antwort

3

Die Schwierigkeit hierbei besteht darin, dass die ausgewählten Zellen in der Tabelle möglicherweise nicht zusammenhängend und nicht in einer bestimmten Reihenfolge sind. Daher besteht die Aufgabe darin, das kleinste Rechteck zu berechnen, das alle ausgewählten Zellen enthält, und dann eine Datenstruktur zu erstellen, die für die Übergabe an einen CSV-Writer geeignet ist.

Nachfolgend finden Sie eine Demo-Skript, das dies tut (basierend auf dieser previous answer - die Zugaben kommentiert wurden):

# add imports 
import sys, csv, io 
import pandas as pd, numpy as np 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.model = QtGui.QStandardItemModel(self) 
     self.model.setSortRole(QtCore.Qt.UserRole) 
     self.tableView = QtGui.QTableView() 
     self.tableView.setSortingEnabled(True) 
     self.tableView.setModel(self.model) 
     # install event filter 
     self.tableView.installEventFilter(self) 
     self.button = QtGui.QPushButton('Open CSV', self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.tableView) 
     layout.addWidget(self.button) 

    # add event filter 
    def eventFilter(self, source, event): 
     if (event.type() == QtCore.QEvent.KeyPress and 
      event.matches(QtGui.QKeySequence.Copy)): 
      self.copySelection() 
      return True 
     return super(Window, self).eventFilter(source, event) 

    # add copy method 
    def copySelection(self): 
     selection = self.tableView.selectedIndexes() 
     if selection: 
      rows = sorted(index.row() for index in selection) 
      columns = sorted(index.column() for index in selection) 
      rowcount = rows[-1] - rows[0] + 1 
      colcount = columns[-1] - columns[0] + 1 
      table = [[''] * colcount for _ in range(rowcount)] 
      for index in selection: 
       row = index.row() - rows[0] 
       column = index.column() - columns[0] 
       table[row][column] = index.data() 
      stream = io.StringIO() 
      csv.writer(stream).writerows(table) 
      QtGui.qApp.clipboard().setText(stream.getvalue()) 

    def handleButton(self): 
     filters = (
      'CSV files (*.csv *.txt)', 
      'Excel Files (*.xls *.xml *.xlsx *.xlsm)', 
      ) 
     path, filter = QtGui.QFileDialog.getOpenFileNameAndFilter(
      self, 'Open File', '', ';;'.join(filters)) 
     if path: 
      csv = filter.startswith('CSV') 
      if csv: 
       dataframe = pd.read_csv(path) 
      else: 
       dataframe = pd.read_excel(path) 
      self.model.setRowCount(0) 
      dateformat = '%m/%d/%Y' 
      rows, columns = dataframe.shape 
      for row in range(rows): 
       items = [] 
       for column in range(columns): 
        field = dataframe.iat[row, column] 
        if csv and isinstance(field, str): 
         try: 
          field = pd.to_datetime(field, format=dateformat) 
         except ValueError: 
          pass 
        if isinstance(field, pd.tslib.Timestamp): 
         text = field.strftime(dateformat) 
         data = field.timestamp() 
        else: 
         text = str(field) 
         if isinstance(field, np.number): 
          data = field.item() 
         else: 
          data = text 
        item = QtGui.QStandardItem(text) 
        item.setData(data, QtCore.Qt.UserRole) 
        items.append(item) 
       self.model.appendRow(items) 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 150, 600, 400) 
    window.show() 
    sys.exit(app.exec_()) 
+0

Vielen Dank! Ich begann gerade die Hoffnung zu verlieren, dies zu tun. – learncode

Verwandte Themen