|
19 | 19 | # <http://www.gnu.org/licenses/>.
|
20 | 20 | #
|
21 | 21 |
|
22 |
| -import csv |
23 |
| -import openpyxl as oxl |
24 | 22 | import os
|
25 | 23 | import sys
|
26 | 24 | import time
|
27 | 25 | from PyQt5 import QtCore, QtGui, QtWidgets
|
28 | 26 | from PyQt5.Qt import QColor
|
29 | 27 | #
|
30 | 28 | import configparser # decode .ini file
|
31 |
| -import xlrd |
32 |
| -#xlrd.xlsx.ensure_elementtree_imported(False, None) |
33 |
| -#xlrd.xlsx.Element_has_iter = True |
34 | 29 | import displayobject
|
35 | 30 | from editini import SaveIni
|
36 | 31 | from getmodels import getModelFile
|
37 |
| -from senutils import ClickableQLabel, getParents, getUser, strSplit, techClean |
| 32 | +from senutils import ClickableQLabel, getParents, getUser, strSplit, techClean, WorkBook |
38 | 33 |
|
39 | 34 | def rreplace(s, old, new, occurrence):
|
40 | 35 | li = s.rsplit(old, occurrence)
|
41 | 36 | return new.join(li)
|
42 | 37 |
|
43 | 38 |
|
44 |
| -class WorkBook(object): |
45 |
| - def __init__(self): |
46 |
| - self._book = None |
47 |
| - self._sheet = None |
48 |
| - self._sheet_names = [] |
49 |
| - self._type = None |
50 |
| - self._nrows = 0 |
51 |
| - self._ncols = 0 |
52 |
| - |
53 |
| - def open_workbook(self, filename=None, on_demand=False): |
54 |
| - if not os.path.exists(filename): |
55 |
| - raise Exception('File not found') |
56 |
| - self._type = filename[filename.rfind('.') + 1:] |
57 |
| - try: |
58 |
| - if self._type == 'xls': |
59 |
| - self._book = xlrd.open_workbook(filename, on_demand=True) |
60 |
| - self._sheet_names = self._book.sheet_names() |
61 |
| - elif self._type == 'xlsx': |
62 |
| - self._book = oxl.load_workbook(filename, data_only=True) |
63 |
| - self._sheet_names = self._book.sheetnames |
64 |
| - elif self._type == 'csv': |
65 |
| - dataview = open(filename) |
66 |
| - things = csv.DictReader(dataview) |
67 |
| - self._sheet_names = ['n/a'] |
68 |
| - self._worksheet = [[]] |
69 |
| - for key in things.fieldnames: |
70 |
| - self._worksheet[-1].append(key) |
71 |
| - for cell in things: |
72 |
| - self._worksheet.append([]) |
73 |
| - for key in things.fieldnames: |
74 |
| - if cell[key].isdigit(): |
75 |
| - self._worksheet[-1].append(int(cell[key])) |
76 |
| - else: |
77 |
| - try: |
78 |
| - self._worksheet[-1].append(float(cell[key])) |
79 |
| - except: |
80 |
| - self._worksheet[-1].append(cell[key]) |
81 |
| - dataview.close() |
82 |
| - self.nrows = len(self._worksheet) |
83 |
| - self.ncols = len(self._worksheet[0]) |
84 |
| - except: |
85 |
| - raise Exception('Error opening file') |
86 |
| - |
87 |
| - def release_resources(self): |
88 |
| - if self._type == 'xls': |
89 |
| - self._book.release_resources() |
90 |
| - |
91 |
| - def sheet_names(self): |
92 |
| - return self._sheet_names[:] |
93 |
| - |
94 |
| - def sheet_by_index(self, sheetx): |
95 |
| - return self.get_sheet(sheetx) |
96 |
| - |
97 |
| - def sheet_by_name(self, sheet_name): |
98 |
| - try: |
99 |
| - sheetx = self._sheet_names.index(sheet_name) |
100 |
| - except ValueError: |
101 |
| - raise Exception('No sheet named <%r>' % sheet_name) |
102 |
| - return self.sheet_by_index(sheetx) |
103 |
| - |
104 |
| - def get_sheet(self, sheetx): |
105 |
| - self._sheet = self.WorkSheet(sheetx, self._type) |
106 |
| - try: |
107 |
| - if self._type == 'xls': |
108 |
| - self._sheet._sheet = self._book.sheet_by_index(sheetx) |
109 |
| - self._sheet.name = self._book.sheet_names()[sheetx] |
110 |
| - self._sheet.nrows = self._sheet._sheet.nrows |
111 |
| - self._sheet.ncols = self._sheet._sheet.ncols |
112 |
| - elif self._type == 'xlsx': |
113 |
| - self._sheet._sheet = self._book.worksheets[sheetx] |
114 |
| - self._sheet.name = self._book.sheetnames[sheetx] |
115 |
| - self._sheet.nrows = self._sheet._sheet.max_row |
116 |
| - self._sheet.ncols = self._sheet._sheet.max_column |
117 |
| - elif self._type == 'csv': |
118 |
| - # self._sheet = self._book.worksheets[sheetx] |
119 |
| - self._sheet.name = 'n/a' |
120 |
| - self._sheet._sheet = self._worksheet |
121 |
| - self._sheet.nrows = len(self._sheet._sheet) |
122 |
| - try: |
123 |
| - self._sheet.ncols = len(self._sheet._sheet[0]) |
124 |
| - except: |
125 |
| - self._sheet.ncols = 0 |
126 |
| - except: |
127 |
| - raise Exception('Error accessing sheet') |
128 |
| - return self._sheet |
129 |
| - |
130 |
| - class WorkSheet(object): |
131 |
| - def __init__(self, sheet, typ): |
132 |
| - self.name = sheet |
133 |
| - self._sheet = None |
134 |
| - self.nrows = 0 |
135 |
| - self.ncols = 0 |
136 |
| - self._type = typ |
137 |
| - |
138 |
| - def cell_value(self, row, col): |
139 |
| - if self._type == 'xls': |
140 |
| - return self._sheet.cell_value(row, col) |
141 |
| - elif self._type == 'xlsx': |
142 |
| - return self._sheet.cell(row=row + 1, column=col + 1).value |
143 |
| - elif self._type == 'csv': |
144 |
| - return self._sheet[row][col] |
145 |
| - |
146 |
| - |
147 | 39 | class DataView(QtWidgets.QDialog):
|
148 | 40 | procStart = QtCore.pyqtSignal(str)
|
149 | 41 |
|
@@ -646,9 +538,9 @@ def openFile(self, ifile):
|
646 | 538 | self.book = WorkBook()
|
647 | 539 | if 1 == 1: #try:
|
648 | 540 | if os.path.exists(ifile):
|
649 |
| - self.book.open_workbook(ifile, on_demand=True) |
| 541 | + self.book.open_workbook(ifile) |
650 | 542 | else:
|
651 |
| - self.book.open_workbook(self.scenarios + ifile, on_demand=True) |
| 543 | + self.book.open_workbook(self.scenarios + ifile) |
652 | 544 | else: #except:
|
653 | 545 | self.log.setText("Can't open file - " + ifile)
|
654 | 546 | return
|
@@ -727,6 +619,11 @@ def somethingChanged(self):
|
727 | 619 | def setSheet(self, isheet=''):
|
728 | 620 | if isheet == '':
|
729 | 621 | isheet = self.book.sheet_names()[0]
|
| 622 | + try: |
| 623 | + if self.book.sheet_names()[0] == 'Exclude': |
| 624 | + isheet = self.book.sheet_names()[1] |
| 625 | + except: |
| 626 | + pass |
730 | 627 | ndx = 0
|
731 | 628 | self.sheet.clear()
|
732 | 629 | j = -1
|
@@ -1047,6 +944,9 @@ def dv_setText():
|
1047 | 944 | self.maximums[keys[-1]][1].setText('')
|
1048 | 945 | else:
|
1049 | 946 | self.maximums[keys[-1]][0] = 0
|
| 947 | + if len(cols) == 0: |
| 948 | + self.log.setText('No data to display') |
| 949 | + return |
1050 | 950 | if len(cols) > 1 and self.multiple.isChecked():
|
1051 | 951 | multiple = True
|
1052 | 952 | else:
|
|
0 commit comments