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?
>

Reply via email to