Here's an old post with the solution that I use for this
https://groups.google.com/d/msg/web2py/4QhEULmJ8YE/aNBcJv81RocJ
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, March 28, 2015 at 11:14:44 AM UTC-5, Adam Scarlat wrote:
>
> Hi,
>
> I use an external mysql database in my application and use the
> executesql(str(query), as_dict=True)) to run queries on it.
> I want to have a download link for a csv files of different queries in my
> application. If I were to work locally I would have used the following
> mysql command:
>
> 'SELECT * FROM SOME_TABLE INTO OUTFILE '/tmp/test1.csv' FIELDS TERMINATED
> BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n''
>
> In my application a user can select certain criteria, a query is built in
> the controller according to the criteria and is executed with the
> executesql() method
> which returns a dictionary like object.
>
> My question is: is there a way to make a download link in the view to
> download a csv file of results returned by the executesql() method?
>
> Thank you!
> Adam
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.