Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PyQt5.QtCore import Qt
- from PyQt5.Qt import *
- from PyQt5.QtGui import *
- from PyQt5.QtWidgets import *
- from PyQt5 import QtCore, QtGui, QtWidgets, uic
- from PyQt5.QtSql import *
- from PyQt5 import QtPrintSupport as printSupport
- from docx import Document
- from docx.enum.table import WD_TABLE_DIRECTION
- import xlwt
- from xlwt import Workbook
- import xlsxwriter
- import sys
- class Window(QWidget):
- def __init__(self):
- super(QWidget, self).__init__()
- self.setLayoutDirection(Qt.RightToLeft)
- self.setLocale(QLocale(QLocale.Arabic, QLocale.Libya))
- self.printer = printSupport.QPrinter()
- # Configure defaults:
- self.printer.setOrientation(printSupport.QPrinter.Portrait)
- self.printer.setPageSize(QtGui.QPageSize(QtGui.QPageSize.A4))
- pageSizeDictionary = {"a2": QPrinter.A2, "a3": QPrinter.A3, "a4": QPrinter.A4}
- # self.printer.setPageSize(pageSizeDictionary.get(self.size.lower(), QPrinter.A4))
- self.printer.setPageMargins(15, 15, 15, 15, QPrinter.Millimeter)
- self.dpi = 72
- self.documentWidth = 8.5 * self.dpi
- self.documentHeight = 11 * self.dpi
- self.database()
- self.query = QSqlQuery()
- self.queryModel = QSqlQueryModel()
- self.productTableView = QTableView()
- self.printPushButton = QPushButton('print table', self)
- self.printPushButton.clicked.connect(self.printTableView)
- self.printPreviewPushButton = QPushButton('print preview', self)
- self.printPreviewPushButton.clicked.connect(self.printPreviewTableView)
- self.exportAsDOCXPushButton = QPushButton('export as docx', self)
- self.exportAsDOCXPushButton.clicked.connect(self.exportAsDOCX)
- self.exportAsEXCELPushButton = QPushButton('export as excel', self)
- self.exportAsEXCELPushButton.clicked.connect(self.exportAsExcel)
- self.insertToDatabasePushButton = QPushButton('insert data to database', self)
- self.insertToDatabasePushButton.clicked.connect(self.insertToDatabase)
- self.gridLayout = QGridLayout(self)
- self.gridLayout.addWidget(self.insertToDatabasePushButton, 0, 0)
- self.gridLayout.addWidget(self.productTableView, 1, 0)
- self.horizontalLayout = QHBoxLayout()
- self.horizontalLayout.addWidget(self.printPushButton)
- self.horizontalLayout.addWidget(self.printPreviewPushButton)
- self.horizontalLayout.addWidget(self.exportAsDOCXPushButton)
- self.horizontalLayout.addWidget(self.exportAsEXCELPushButton)
- self.gridLayout.addLayout(self.horizontalLayout,2,0)
- self.setLayout(self.gridLayout)
- self.productsTableView()
- def productsTableView(self):
- sqlQuery = 'SELECT * FROM product '
- self.queryModel.setQuery(sqlQuery)
- self.productTableView.setModel(self.queryModel)
- self.queryModel.setHeaderData(0, Qt.Horizontal, 'رقم المنتج')
- self.queryModel.setHeaderData(1, Qt.Horizontal, 'اسم المنتج')
- self.queryModel.setHeaderData(2, Qt.Horizontal, 'الكمية')
- self.productTableView.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
- self.productTableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
- self.productTableView.setSortingEnabled(True)
- self.productTableView.doubleClicked.connect(self.displaySelectedAdminRow)
- def displaySelectedAdminRow(self):
- rowCount = self.productTableView.model().rowCount()
- columnCount = self.productTableView.model().columnCount()
- print('number of rows %d' % (rowCount))
- print('number of columns %d' % (columnCount))
- data = []
- for row in range(self.productTableView.model().rowCount()):
- data.append([])
- for column in range(self.productTableView.model().columnCount()):
- index = self.productTableView.model().index(row, column)
- # We suppose data are strings
- data[row].append(str(self.productTableView.model().data(index)))
- # print(data[0])
- theList = data[0]
- output = ''
- for i in range(len(theList),0,-1):
- output += str(theList[i])
- print(output)
- def paintRequest(self,printer):
- model = self.productTableView.model()
- ##########
- tableFormat = QtGui.QTextTableFormat()
- tableFormat.setHeaderRowCount(1)
- tableFormat.setAlignment(Qt.AlignHCenter)
- tableFormat.setAlignment(Qt.AlignVCenter)
- tableFormat.setCellPadding(2.0)
- tableFormat.setCellSpacing(2.0)
- tableFormat.setWidth(
- QtGui.QTextLength(QtGui.QTextLength.PercentageLength, 100))
- ##########
- document = QtGui.QTextDocument()
- document.setPageSize(QtCore.QSizeF(self.documentWidth, self.documentHeight))
- document.setDefaultFont(QtGui.QFont("Console , Verdana, Arial, Helvetica, sans-serif", 16))
- document.setDefaultStyleSheet('body{ Background-color: red}')
- document.setDocumentMargin(30.0)
- # document.setDefaultTextOption(to)
- cursor = QtGui.QTextCursor(document)
- # charFormat = cursor.charFormat()
- # charFormat.setFont(QtGui.QFont("Segoe UI Light", 28))
- table = cursor.insertTable(
- model.rowCount(), model.columnCount(), tableFormat)
- for row in range(table.rows()):
- for column in range(table.columns()):
- index = model.index(row, column)
- cursor.insertText(str(model.data(index)))
- cursor.movePosition(QtGui.QTextCursor.NextCell)
- document.print_(printer)
- def printTableView(self):
- dialog = printSupport.QPrintDialog(self.printer, self)
- if dialog.exec_() == QDialog.Accepted:
- self.paintRequest(dialog.printer())
- def printPreviewTableView(self):
- dialog = printSupport.QPrintPreviewDialog()
- dialog.paintRequested.connect(self.paintRequest)
- dialog.exec_()
- def exportAsDOCX(self):
- rowCount = self.productTableView.model().rowCount()
- columnCount = self.productTableView.model().columnCount()
- document = Document()
- document.add_paragraph('كشف بالمنتجات')
- adminsTable = document.add_table(rows=rowCount, cols=columnCount)
- adminsTable.direction = WD_TABLE_DIRECTION.LTR
- rowCells = adminsTable.add_row().cells
- headerCells = adminsTable.rows[0].cells
- headerDataList = []
- for columnIndex,column in enumerate(range(columnCount)):
- headerData = str(self.productTableView.model().headerData(column, Qt.Horizontal))
- headerCells[columnIndex].text = headerData
- ############
- #####
- #####
- ############
- for row in range(self.productTableView.model().rowCount()):
- for column in range(self.productTableView.model().columnCount()):
- rowCells = adminsTable.add_row().cells
- index = self.productTableView.model().index(row, column)
- bodyData = (str(self.productTableView.model().data(index)))
- print(bodyData)
- document.save('كشف بالمنتجات.docx')
- def exportAsExcel_1(self):
- rowCount = self.productTableView.model().rowCount()
- columnCount = self.productTableView.model().columnCount()
- wb = Workbook(encoding='utf-8')
- ###########
- style = xlwt.XFStyle()
- fnt = xlwt.Font()
- fnt.Size = 16
- fnt.name = 'Times New Roman'
- fnt.bold = True
- style.font = fnt
- alignment = xlwt.Alignment()
- alignment.horz = xlwt.Alignment.HORZ_CENTER
- # May be: HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, HORZ_FILLED, HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED
- alignment.vert = xlwt.Alignment.VERT_CENTER
- # May be: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED
- alignment.dire = xlwt.Alignment.DIRECTION_RL
- # Type: Direction_General, Direction_LR, Direction_RL
- style.alignment = alignment
- style.font.height = 250
- ##############
- borders = xlwt.Borders() # Create Borders
- borders.left = xlwt.Borders.DASHED
- # DASHED
- # NO_LINE
- # THIN
- # May be: NO_LINE, THIN, MEDIUM, DASHED, DOTTED, THICK,
- # DOUBLE, HAIR, MEDIUM_DASHED, THIN_DASH_DOTTED, MEDIUM_DASH_DOTTED,
- # THIN_DASH_DOT_DOTTED, MEDIUM_DASH_DOT_DOTTED, SLANTED_MEDIUM_DASH_DOTTED, or 0x00 through 0x0D.
- borders.right = xlwt.Borders.DASHED
- borders.top = xlwt.Borders.DASHED
- borders.bottom = xlwt.Borders.DASHED
- borders.left_colour = 0x40
- borders.right_colour = 0x40
- borders.top_colour = 0x40
- borders.bottom_colour = 0x40
- style.borders = borders # Add Borders to Style
- ####################
- pattern = xlwt.Pattern() # Create the Pattern
- pattern.pattern = xlwt.Pattern.SOLID_PATTERN # May be: NO_PATTERN, SOLID_PATTERN, or 0x00 through 0x12
- pattern.pattern_fore_colour = 2
- # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue,
- # 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...
- style.pattern = pattern # Add Pattern to Style
- # path, _ = QFileDialog.getSaveFileName(self, "Save File", "exports.xls", "XLS Files(*.xls *.txt)")
- path = True
- if path:
- sheet1 = wb.add_sheet('exports')
- #sheet1.write(3,0, "Some") # 3-> row, o-> column
- for column in range(columnCount):
- header = str(self.productTableView.model().headerData(column, Qt.Horizontal))
- sheet1.write(0,column, header,style)
- for column in range(columnCount):
- for row in range(rowCount):
- index = self.productTableView.model().index(row, column)
- bodyData = str(self.productTableView.model().data(index))
- sheet1.write(row+1, column, bodyData,style)
- sheet1.col(column).width = 11111
- wb.save('exports.xls')
- def exportAsExcel(self):
- rowCount = self.productTableView.model().rowCount()
- columnCount = self.productTableView.model().columnCount()
- from xlsxwriter.workbook import Workbook
- workbook = Workbook('output2.xlsx')
- worksheet = workbook.add_worksheet()
- cell_format = workbook.add_format()
- worksheet.right_to_left()
- worksheet.set_paper(9) # A4
- worksheet.center_horizontally()
- worksheet.center_vertically()
- worksheet.set_margins(worksheet.center_horizontally())
- cell_format.set_border(3)
- cell_format.set_bold(True)
- # set_margins([left=0.7,] right=0.7,] top=0.75,] bottom=0.75]]])
- worksheet.set_header('&CHello');
- data = []
- for column in range(columnCount):
- for row in range(rowCount):
- header = str(self.productTableView.model().headerData(column, Qt.Horizontal))
- index = self.productTableView.model().index(row, column)
- bodyData = str(self.productTableView.model().data(index))
- data.append(header)
- data.append(bodyData)
- # print(self.productTableView.model().headerData(column, Qt.Horizontal))
- worksheet.write(row , column, bodyData)
- # worksheet.write(row , column, bodyData)
- # worksheet.add_table('B3:F7',data)
- # print(data)
- workbook.close()
- def database(self):
- database = QSqlDatabase.addDatabase('QSQLITE')
- database.setDatabaseName('./products.db')
- if not database.open():
- print(database.lastError().text())
- sys.exit(1) # Error code 1 - signifies error
- else:
- print('database is connected successfully')
- def insertToDatabase(self):
- # Creating a query for later execution using .prepare()
- createTableQuery = QSqlQuery()
- createTableQuery.exec(
- """
- CREATE TABLE product (
- product_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
- product_name VARCHAR(40) NOT NULL,
- quantity INTEGER(10) NOT NULL
- )
- """
- )
- insertDataQuery = QSqlQuery()
- insertDataQuery.prepare(
- """
- INSERT INTO product (
- product_name,
- quantity
- )
- VALUES (?, ?)
- """
- )
- # Sample data
- data = [
- ("أقلام رصاص", "10"),
- ("أقلام حبر", "10"),
- ("مبراة", "10"),
- ("مسطرة", "10"),
- ]
- # Use .addBindValue() to insert data
- for product_name, quantity in data:
- insertDataQuery.addBindValue(product_name)
- insertDataQuery.addBindValue(quantity)
- insertDataQuery.exec()
- self.productsTableView()
- if __name__ == '__main__':
- app = QtWidgets.QApplication(sys.argv)
- app.setStyleSheet("""
- QPushButton {padding:10px;font-size:16px;font-weight: 400;}
- QTableView{
- border:1px solid #999;
- font-family: Console , Verdana, Arial, Helvetica, sans-serif;
- font-weight: 400;
- font-size: 16px;
- }
- QTableView::item
- {
- border:1px solid #999;
- color: #000;
- text-align: center;
- }QHeaderView::section{border:1px solid #999;font-family: Console , Verdana, Arial, Helvetica, sans-serif;
- font-weight: 400;
- font-size: 16px;}
- """)
- window = Window()
- window.setFixedWidth(500)
- window.setFixedHeight(300)
- window.show()
- sys.exit(app.exec_())
- # • Table.cell(row_idx, col_idx)
- # • Row.cells[col_idx]
- # • Column.cells[col_idx]
Advertisement
Add Comment
Please, Sign In to add comment