pyExcelerator Anwendung
Verfasst: 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.
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()