#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import * import importlib class ToolBar(QToolBar): def __init__(self, iniFile, parent=None): super(ToolBar, self).__init__(parent) ini = QSettings(iniFile, QSettings.IniFormat) ini.setIniCodec("utf-8") ini.beginGroup("Tools") for key in sorted(ini.childKeys()): v = ini.value(key) title = v[0] params = v[1:] a = self.addAction(title) a.params = params a.triggered.connect(self.execAction) ini.endGroup() def execAction(self): try: params = self.sender().params module = importlib.import_module(params[0]) if len(params) < 2: func = "run()" else: func = params[1] win = self.focusTaskWindow() exec("module.%s(win)" % func) except: print(str(sys.exc_info()[1])) return def focusTaskWindow(self): try: return QApplication.instance().focusedTaskWindow() except: return None if __name__ == '__main__': app = QApplication(sys.argv) ex = ToolBar("tools.ini") flags = Qt.Tool | Qt.WindowDoesNotAcceptFocus # | ex.windowFlags() ex.setWindowFlags(flags) ex.show() sys.exit(app.exec_())
class ToolBar(QToolBar): def __init__(self, iniFile, parent=None): super(ToolBar, self).__init__(parent) ini = QSettings(iniFile, QSettings.IniFormat) ini.setIniCodec("utf-8")
[Tools] 001=Export to Excel,exportview,"exportToExcel" 002=Copy as HTML,exportview,"copyAsHtml"
ini.beginGroup("Tools") # for key in sorted(ini.childKeys()): # list, .. ini # , v = ini.value(key) title = v[0] params = v[1:] # QAction, a = self.addAction(title) # [, ] QAction a.params = params # a.triggered.connect(self.execAction) ini.endGroup()
def execAction(self): try: params = self.sender().params module = importlib.import_module(params[0]) func = params[1] win = self.focusTaskWindow() exec("module.%s(win)" % func) except: print(str(sys.exc_info()[1])) return
self.tools = ToolBar("tools.ini",self) self.addToolBar(self.tools)
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys import datetime from PyQt5.QtCore import * from PyQt5.QtWidgets import * import xlsxwriter class ob(): def test(self): return 1 def exportToExcel(win): if win == None: print("No focused window") return view = focusItemView(win) title = win.windowTitle() + '.xlsx' if view == None: print("No focused item view") return # Create a workbook and add a worksheet. fileName = QFileDialog.getSaveFileName(None, 'Save Excel file', title,'Excel files (*.xlsx)') if fileName == ('',''): return indexes = view.selectionModel().selectedIndexes() if len(indexes) == 0: indexes = view.selectAll() indexes = view.selectionModel().selectedIndexes() model = view.model() d = sortedIndexes(indexes) headers = { col:model.headerData(col, Qt.Horizontal) for col in d.columns } minRow = min(d.rows) minCol = min(d.columns) try: workbook = xlsxwriter.Workbook(fileName[0]) worksheet = workbook.add_worksheet() bold = workbook.add_format({'bold': True}) dateFormat = 'dd.MM.yyyy' date = workbook.add_format({'num_format': dateFormat}) realCol = 0 for col in d.columns: worksheet.write(0, realCol, headers[col], bold) realRow = 1 for row in d.rows: if (row, col) in d.indexes: try: v = d.indexes[(row,col)].data(Qt.EditRole) if isinstance(v, QDateTime): if v.isValid() and v.toPyDateTime() > datetime.datetime(1900,1,1): v = v.toPyDateTime() worksheet.write_datetime(realRow, realCol, v, date) else: v = v.toString(dateFormat) worksheet.write(realRow, realCol, v) else: worksheet.write(realRow, realCol, v) except: print(str(sys.exc_info()[1])) realRow += 1 realCol += 1 workbook.close() except: QMessageBox.critical(None,'Export error',str(sys.exc_info()[1])) return def copyAsHtml(win): if win == None: print("No focused window") return view = focusItemView(win) if view == None: print("No focused item view") return indexes = view.selectedIndexes() if len(indexes) == 0: indexes = view.selectAll() indexes = view.selectedIndexes() if len(indexes) == 0: return; model = view.model() try: d = sortedIndexes(indexes) html = '<table><tbody>\n' headers = { col:model.headerData(col, Qt.Horizontal) for col in d.columns } html += '<tr>' for c in d.columns: html += '<th>%s</th>' % headers[c] html += '</tr>\n' for r in d.rows: html += '<tr>' for c in d.columns: if (r, c) in d.indexes: v = d.indexes[(r,c)].data(Qt.DisplayRole) html += '<td>%s</td>' % v else: html += '<td></td>' html += '</tr>' html += '</tbody></table>' mime = QMimeData() mime.setHtml(html) clipboard = QApplication.clipboard() clipboard.setMimeData(mime) except: QMessageBox.critical(None,'Export error',str(sys.exc_info()[1])) def sortedIndexes(indexes): d = ob() d.indexes = { (i.row(), i.column()):i for i in indexes } d.rows = sorted(list(set([ i[0] for i in d.indexes ]))) d.columns = sorted(list(set([ i[1] for i in d.indexes ]))) return d def headerNames(model, minCol, maxCol): headers = dict() for col in range(minCol, maxCol+1): headers[col] = model.headerData(col, Qt.Horizontal) return headers def focusItemView(win): if win == None: return None w = win.focusWidget() if w != None and isinstance(w, QTableView): return w views = win.findChildren(QTableView) if type(views) == type([]) and len(views)>0: return views[0] return None
def focusItemView(win): if win == None: return None w = win.focusWidget() if w != None and isinstance(w, QTableView): return w views = win.findChildren(QTableView) if type(views) == type([]) and len(views)>0: return views[0] return None
indexes = view.selectionModel().selectedIndexes() if len(indexes) == 0: indexes = view.selectAll() indexes = view.selectionModel().selectedIndexes() if len(indexes) == 0: return;
def sortedIndexes(indexes): d = ob() # - d.indexes = { (i.row(), i.column()):i for i in indexes } d.rows = sorted(list(set([ i[0] for i in d.indexes ]))) d.columns = sorted(list(set([ i[1] for i in d.indexes ]))) return d
headers = { col:model.headerData(col, Qt.Horizontal) for col in d.columns }
pip3 install xlsxwriter
fileName = QFileDialog.getSaveFileName(None, 'Save Excel file', title,'Excel files (*.xlsx)') if fileName == ('',''): return
workbook = xlsxwriter.Workbook(fileName[0]) worksheet = workbook.add_worksheet() bold = workbook.add_format({'bold': True}) dateFormat = 'dd.MM.yyyy' date = workbook.add_format({'num_format': dateFormat}) realCol = 0 for col in d.columns: worksheet.write(0, realCol, headers[col], bold) realRow = 1 for row in d.rows: if (row, col) in d.indexes: try: v = d.indexes[(row,col)].data(Qt.EditRole) if isinstance(v, QDateTime): if v.isValid() and v.toPyDateTime() > datetime.datetime(1900,1,1): v = v.toPyDateTime() worksheet.write_datetime(realRow, realCol, v, date) else: v = v.toString(dateFormat) worksheet.write(realRow, realCol, v) else: worksheet.write(realRow, realCol, v) except: print(str(sys.exc_info()[1])) realRow += 1 realCol += 1 workbook.close()
mime = QMimeData() mime.setHtml(html) clipboard = QApplication.clipboard() clipboard.setMimeData(mime)
html = '<table><tbody>\n' headers = { col:model.headerData(col, Qt.Horizontal) for col in d.columns } html += '<tr>' for c in d.columns: html += '<th>%s</th>' % headers[c] html += '</tr>\n' for r in d.rows: html += '<tr>' for c in d.columns: if (r, c) in d.indexes: v = d.indexes[(r,c)].data(Qt.DisplayRole) html += '<td>%s</td>' % v else: html += '<td></td>' html += '</tr>' html += '</tbody></table>'
Source: https://habr.com/ru/post/336716/
All Articles