1
2 """
3 Import and export classes.
4 Created Oct 2008
5 Copyright (C) Damien Farrell
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 """
21
22 from Tkinter import *
23 import Pmw
24 import os, csv
25 import tkFileDialog
26
28 """Provides import utility methods for the Table and Table Model classes"""
29
31 """Setup globals"""
32
33 self.separator_list = {',':',',' ':'space','\t':'tab','blank':' ',':':':'}
34 self.var_sep = StringVar()
35 self.var_sep.set(',')
36 return
37
39 """Allows user to set some import options"""
40 self.parent=parent
41 self.master=Toplevel()
42 self.master.title("Import Data")
43 self.xsize = 450
44 self.ysize = 370
45 top=self.master.winfo_toplevel()
46 rootx=top.winfo_rootx()
47 rooty=top.winfo_rooty()
48
49 self.sep_choice = Pmw.OptionMenu(
50 parent = self.master,labelpos = 'w',
51 label_text = 'Record separator:',
52 menubutton_textvariable = self.var_sep,
53 items = self.separator_list.keys(),
54 initialitem = ',',
55 menubutton_width = 4,
56 command= self.update_display)
57
58 self.sep_choice.grid(row=0,column=0,sticky='nw',padx=2,pady=2)
59
60
61 self.textframe=Pmw.ScrolledFrame(self.master,
62 labelpos = 'n', label_text = 'Preview',
63 usehullsize = 1,
64 hull_width = 450,
65 hull_height = 300)
66 self.textframe.grid(row=1,column=0,columnspan=5,sticky='news',padx=2,pady=2)
67 self.previewarea = Text(self.textframe.interior(), bg='white', width=400, height=500)
68 self.previewarea.pack(fill=BOTH, expand=1)
69
70 self.openButton = Button(self.master, text = 'Open File',
71 command = self.do_openFile )
72 self.openButton.grid(row=3,column=0,sticky='news',padx=2,pady=2)
73 self.importButton = Button(self.master, text = 'Do Import',
74 command = self.do_ModelImport )
75 self.importButton.grid(row=3,column=1,sticky='news',padx=2,pady=2)
76 self.CancelButton = Button(self.master, text = 'Cancel',
77 command = self.close )
78 self.CancelButton.grid(row=3,column=2,sticky='news',padx=2,pady=2)
79 self.master.columnconfigure(0,weight=1)
80 self.master.rowconfigure(1,weight=1)
81 return self.master
82
87
89
90 savedir = os.getcwd()
91 filename=tkFileDialog.askopenfile(defaultextension='.csv',
92 initialdir=savedir,
93 initialfile='',
94 filetypes=[("Data file","*.csv"),
95 ("All files","*.*")],
96 title='Choose data from a .csv file saved as excel spreadsheet in .csv format (comma separated list)',
97 parent=parent)
98 if filename and os.path.exists(filename.name) and os.path.isfile(filename.name):
99 datafile = filename.name
100 return datafile
101
103 """Preview loaded file"""
104 sep = self.var_sep.get()
105 self.previewarea.delete(1.0, END)
106 reader = csv.reader(open(self.datafile, "rb"), delimiter=sep)
107 for row in reader:
108 self.previewarea.insert(END,row)
109 self.previewarea.insert(END,'\n')
110 return
111
113 """imports and places the result in self.modeldata"""
114 self.data = self.ImportTableModel(self.datafile)
115 self.close()
116 return
117
119 """Import table data from a comma separated file and create data for a model
120 This is reusable outside the GUI dialog also."""
121
122 if not os.path.isfile(filename):
123 return None
124 try:
125 sep = self.var_sep.get()
126 except:
127 sep = ','
128
129 dictreader = csv.DictReader(open(filename, "rb"), delimiter=sep)
130 dictdata = {}
131 count=0
132 for rec in dictreader:
133 dictdata[count]=rec
134 count=count+1
135 return dictdata
136
138 self.master.destroy()
139 return
140
143 """Provides export utility methods for the Table and Table Model classes"""
144
145 return
146
148 """Export table data to a comma separated file"""
149
150 parent=table.parentframe
151 import tkFileDialog
152 filename = tkFileDialog.asksaveasfilename(parent=parent,defaultextension='.csv',
153 filetypes=[("CSV files","*.csv")]
154 )
155 if not filename:
156 return
157 if sep == None:
158 sep = ','
159 writer = csv.writer(file(filename, "w"), delimiter=sep)
160
161 model=table.getModel()
162 recs = model.getAllCells()
163
164 colnames = model.columnNames
165 collabels = model.columnlabels
166 row=[]
167 for c in colnames:
168 row.append(collabels[c])
169 writer.writerow(row)
170
171 for row in recs.keys():
172 writer.writerow(recs[row])
173
174 return
175