pyExcelerator Anwendung

Code-Stücke können hier veröffentlicht werden.
Antworten
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Sonntag 18. Juni 2006, 19:43

Hallo,

ich habe mir Gedanken gemacht, ob ich überhaupt ein Skript posten soll, daß pyExcelerator nutzt, aber vielleicht wird ja noch der eine oder andere auf den Geschmack kommen. Mein Problem war / ist Daten, die auf einem Linux-System (deshalb nicht win32-Zeugs) anfallen schnell zu prozessieren und per Hand editieren zu können. In unserer AG laufen die meisten Maschinen unter XP (inkl. Office). Was liegt da näher die Daten in ein EXCEL-Sheet zu übernehmen und auf diese Weise einigermaßen flexibel zu sein? Nun kann man zwar die Daten auch per Hand in EXCEL oder OpenOffice importieren, aber wozu seine Stunden auf diese Weise verschwenden? (Es gibt auch noch andere automatische Importmöglichkeiten - ich weiß - aber ich habe einen guten Teil anderer Tools für diese Art Daten in Python geschrieben, da will man diese Dinge ja auch noch nutzen.)

Anbei also ein Beispielskript - recht umfangreich und es muß auch noch nacheditiert werden, aber es bietet (denke ich jedenfalls) eine Fülle von Anregungen. (Ich gebrauche nämlich so ziemlich alles was pyExcelerator bietet.) Leider werdet ihr dieses Skript so nicht nutzen können, aber die Kommentare helfen vielleicht weiter - im Gegensatz zu den Beispielen von pyExcelerator.

Gruß,
Christian

PS Vor einiger Zeit habe ich noch für vergleichbare Dinge pyXLWriter genutzt, aber das ist ja inzwischen auf Eis gelegt und pyExcelerator scheint mir eigentlich auch sehr gut zu sein - zumindest ist es schnell.

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: iso-8859-1 -*-

<snip>

def CreateExcelTemplate(data,output):
    """
        will dumpt all data in the specified EXCEL output file
        in a format suitable for further preliminary processing
    """
    workbook = xl.Workbook()
    
    ###################################
    #define heading
    heading_font = xl.Font()
    heading_font.name = 'Arial'
    heading_font.bold = True
    heading_font.height = 14*0x14
    heading_font.outline = True
    heading_font.colour_index = 4
    
    heading_pattern = xl.Pattern()
    heading_pattern.pattern = xlPattern.SOLID_PATTERN
    heading_pattern.pattern_back_colour = 0x4
    heading_pattern.pattern_fore_colour = 0x4    
    
    heading_style = xl.XFStyle()
    heading_style.font = heading_font
    heading_style.pattern = heading_pattern
    
    ###################################
    # define centered alignment
    centered_align = xl.Alignment()
    centered_align.horz = xlAlignment.HORZ_CENTER
    centered_align.vert = xlAlignment.VERT_CENTER
    
<snip - noch mehr Formate>
    
    ###################################
    # define bottom left box
    bottom_left_font = simple_bold_font
    
    bottom_left_border = xl.Borders()
    bottom_left_border.left = 2
    bottom_left_border.bottom = 2
    
    bottom_left_style = xl.XFStyle()
    bottom_left_style.font = bottom_left_font
    bottom_left_style.borders = bottom_left_border
    bottom_left_style.alignment = centered_align
    
 <snip - noch mehr Formate>
    
    #loop over all datasets
    for d in data:
        Message("Working on ... %s           \r" % d.attributes['name'])
        #creating worksheet
        ws = workbook.add_sheet(d.attributes['name'])
        ws.set_col_default_width(100)
        #freeze first 32 rows - the entire header
        #ws.panes_frozen = True
        #ws.horz_split_pos = 32
        
        #write out header
        ws.write_merge(0,0,0,7,"%s recorded at %s" % (d.attributes['name'],d.attributes['date']),heading_style)
        
        #write out paramters ---------
        #actual measurement
        ws.write(3,0,'Plot Titel:',top_left_style)
        ws.write_merge(3,1,1,4,xl.Formula('A1'),top_right_style)
        ws.write_merge(4,4,0,4,'',seperator)
        ws.write(5,0,'Date:',simple_left_style)
        ws.write_merge(5,1,1,2,'%s' % d.attributes['date'],sbs)
        ws.write(5,3,'File Name:')
        ws.write(5,4,'%s' % d.get_name(),r_border_style)
        ws.write_merge(6,7,0,2,'',simple_left_style)
        ws.write_merge(6,7,3,3,'Enter',sbs)
        ws.write_merge(6,7,4,4,'Used Factors',r_border_style)
        
        ###################################
        # write out measurement associated data and polish
        ws.write_merge(8,12,0,0,'Measurement',lbs)
        ws.write(8,1,'transmission',sbs) ; ws.write(8,3,_transmission,bold_highlight); ws.write(8,4,'',r_border_style)
        ws.write(9,1,'realtime',scs) ; ws.write(9,2,'[s]',scs); ws.write(9,3,d.attributes['realtime'],sbs);ws.write(9,4,'',r_border_style) 
        ws.write(10,1,'livetime',sbs) ; ws.write(10,2,'[s]',scs); ws.write(10,3,d.attributes['lifetime'],bold_highlight); ws.write(10,4,'',r_border_style)
        ws.write(11,1,'concentration',sbs); ws.write(11,2,'[mg/ml]',scs)
        #write out concentration, only if defined in the data set
        if d.attributes.has_key('concentration'):
            ws.write(11,3,d.attributes['concentration'],sbs)
        else: ws.write(11,3,'None given',sbs)
        ws.write(11,4,'',r_border_style)
        ws.write_merge(12,12,1,3,'')
        ws.write(12,4,xl.Formula('(3600/$D$11)/$D$9'),rhabs)
        ws.write_merge(13,13,0,4,'',seperator)
        
        ###################################
        #write out moving slit measurement associated data
        ws.write_merge(14,20,0,0,'Moving Slit',lbs)
        
        #get data of moving slit measurements:
        number = d.get_name()[:2] #get the first two digits
        #one file below:
        first = str(int(number)-1).zfill(2)
        ms1st = MovingSlitLookUp(first)
        #one file above
        second = str(int(number)+1).zfill(2)
        ms2nd = MovingSlitLookUp(second)
        
        ws.write(14,1,'Name',sbs) ; ws.write_merge(14,14,2,3,'%s' % ms1st.get_name(),scs)
        ws.write_merge(14,14,5,6,'%s' % ms2nd.get_name(),rtbs)
        
        ws.write(15,1,'Energy Counts',scs);ws.write(15,2,'[counts]',scs)
        ws.write(15,3, ms1st.attributes['energy_counts'],scs)
        ws.write(15,5,'[counts]',scs)
        ws.write(15,6, ms2nd.attributes['energy_counts'],r_border_style)
        
        ws.write(16,1,'Position Counts',sbs);ws.write(16,2,'[counts]',scs)
        ws.write(16,3, ms1st.attributes['position_counts'],bold_highlight)
        ws.write(16,5,'[counts]',scs)
        ws.write(16,6, ms2nd.attributes['position_counts'],right_bold_highlight)
        
        ws.write(17,1,'# moving slits',sbs)
        ws.write(17,3, _repeats ,bold_highlight)
        ws.write(17,6, _repeats ,right_bold_highlight)
        
        ws.write(18,1,'Realtime',sbs);ws.write(18,2,'[s]',scs)
        ws.write(18,3, ms1st.attributes['realtime'],bold_highlight)
        ws.write(18,5,'[s]',scs)
        ws.write(18,6, ms2nd.attributes['realtime'],right_bold_highlight)
        
        ws.write(19,1,'Lifetime',sbs);ws.write(19,2,'[s]',scs)
        ws.write(19,3, ms1st.attributes['lifetime'],bold_highlight)
        ws.write(19,5,'[s]',sbbs)
        ws.write(19,6, ms2nd.attributes['lifetime'],bold_highlight_bottom_right)
        
        ws.write_merge(20,20,1,3,'')
        ws.write(20,4,xl.Formula('(10000/20)*((20*$D$18-($D$19-$D$20))/$D$17+(20*$G$18-($G$19-$G$20))/$G$17)/2'),rhabs)
        ws.write_merge(21,21,0,4,'',seperator)
        ws.write_merge(22,22,0,4,'',seperator)
        
        ###################################
        #write out detector specific data
        ws.write_merge(23,27,0,0,'constants',bottom_left_style)
        
        ws.write(23,1,'Primary Beam',sbs);ws.write(23,2,'[channel]',scs)
        #calculate primary beam positions
        pos1 = ms1st.fit_gaussian()[0][1]
        pos2 = ms2nd.fit_gaussian()[0][1]
        merged_pos = int(round((pos1+pos2)/2.0))
        ws.write(23,3, merged_pos ,bold_highlight)
        ws.write(23,4,xl.Formula('D24'),rhabs)
 
<snip - ab hier nur Wiederholungen fuer andere Daten>
        
if __name__ == "__main__":
    #since this script takes a while to run:
    #run it in the background
    os.nice(1)
    main()
Antworten