Skip to content

Commit 4d10820

Browse files
committed
Make WorkBook class to handle csv, xls and xlsx input files
1 parent dc8f331 commit 4d10820

14 files changed

+511
-753
lines changed

dataview.py

+11-111
Original file line numberDiff line numberDiff line change
@@ -19,131 +19,23 @@
1919
# <http://www.gnu.org/licenses/>.
2020
#
2121

22-
import csv
23-
import openpyxl as oxl
2422
import os
2523
import sys
2624
import time
2725
from PyQt5 import QtCore, QtGui, QtWidgets
2826
from PyQt5.Qt import QColor
2927
#
3028
import configparser # decode .ini file
31-
import xlrd
32-
#xlrd.xlsx.ensure_elementtree_imported(False, None)
33-
#xlrd.xlsx.Element_has_iter = True
3429
import displayobject
3530
from editini import SaveIni
3631
from getmodels import getModelFile
37-
from senutils import ClickableQLabel, getParents, getUser, strSplit, techClean
32+
from senutils import ClickableQLabel, getParents, getUser, strSplit, techClean, WorkBook
3833

3934
def rreplace(s, old, new, occurrence):
4035
li = s.rsplit(old, occurrence)
4136
return new.join(li)
4237

4338

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-
14739
class DataView(QtWidgets.QDialog):
14840
procStart = QtCore.pyqtSignal(str)
14941

@@ -646,9 +538,9 @@ def openFile(self, ifile):
646538
self.book = WorkBook()
647539
if 1 == 1: #try:
648540
if os.path.exists(ifile):
649-
self.book.open_workbook(ifile, on_demand=True)
541+
self.book.open_workbook(ifile)
650542
else:
651-
self.book.open_workbook(self.scenarios + ifile, on_demand=True)
543+
self.book.open_workbook(self.scenarios + ifile)
652544
else: #except:
653545
self.log.setText("Can't open file - " + ifile)
654546
return
@@ -727,6 +619,11 @@ def somethingChanged(self):
727619
def setSheet(self, isheet=''):
728620
if isheet == '':
729621
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
730627
ndx = 0
731628
self.sheet.clear()
732629
j = -1
@@ -1047,6 +944,9 @@ def dv_setText():
1047944
self.maximums[keys[-1]][1].setText('')
1048945
else:
1049946
self.maximums[keys[-1]][0] = 0
947+
if len(cols) == 0:
948+
self.log.setText('No data to display')
949+
return
1050950
if len(cols) > 1 and self.multiple.isChecked():
1051951
multiple = True
1052952
else:

0 commit comments

Comments
 (0)