Yep, I've got a processing app that spits out all sorts of csv files based
on data gathered from multiple sources.
Here's a little helper function I use
def csv_export(records, column_names, fields, mode = 'dal'):
"""Export DAL result set, list of dicts or list of lists to CSV stream
for returning to user
Arguments:
records = the data to be returned
column_names (list)= the column names/headings for the first row in the
CSV file
Example ['First Name', 'Last Name', 'Email']
fields (list) = the names of the fields (as they appear in records) in
the order they
should be in the CSV. Example ['f_name', 'l_name',
'email']
or ['table_a.f_name', 'table_a.l_name', 'table_b.email']
If mode = 'list' and your records are in the correct
order then fields may be None
otherwise use [1,3,0] if you list is in a different
order
mode (string) = what type of data is in records? 'dal' (Default),
'dict' or 'list'
'dal' if records came from a regular dal query (Default)
'dict' if records are a list of dicts (for example
using db.executesql() with as_dict = True)
'list' if records are a list of lists/tuples (for
example using db.executesql() with as_dict = False)
"""
#create fake file object
import cStringIO
file = cStringIO.StringIO()
#setup csv writer
import csv
csv_file = csv.writer(file)
#write first row withspecified column headings/names
csv_file.writerow(column_names)
#which mode - dal or dict?
if mode.lower() == 'dal' or mode.lower() == 'dict':
for record in records:
csv_file.writerow([record[field] for field in fields])
elif mode.lower() == 'list':
if fields == None:
csv_file.writerows(records)
else:
for record in records:
csv_file.writerow([record[field] for field in fields])
return file
Then in a controller you can have something like
csv_stream = csv_export(processed_dataset, column_names, fields, mode =
'dict')
response.headers['Content-Type']='application/vnd.ms-excel'
response.headers['Content-Disposition']='attachment;
filename=data_for_%s.csv' % date.today()
return csv_stream.getvalue()
which will cause browser to download the csv file with your chosen filename
you could also turn around and save the datafile to the filesystem if you
wanted.
Hope this helps!
Brian
On Saturday, April 28, 2012 5:20:15 AM UTC-5, rahulserver wrote:
>
> I wish to generate a few reports in csv or txt or other file formats based
> on some database data maintained through a crud application. Previously, it
> was done through an asp.net application with vb as scripting language.But
> as I explored the wonderful capabilities of web2py, I have become a fan of
> this terrific framework.
> Is it possible to do it in web2py. And if it is, then how and where should
> the code be placed.In the view or model or controller?
>