간단한 Excel 문서 병합 도구를 공유하는 python

21297 단어
python을 처음 접한 것은 2009년 가을이었고, 이제야 열심히 공부하고 알게 되었다.
마침 최근에 작업 로그를 작성하고 있는데 여러 개의 excel 문서를 반복해서 합쳐야 하기 때문에 일주일 넘게 고생을 했고, 보수를 위해python으로 이런 작은 것을 썼다.
1. 여러 개의 excel 문서를 통합하는 데 사용됩니다. 몇 번째 작업표인지 지정할 수 있습니다. 기본값은 마지막 작업표입니다.
2. 초라하다. 단순히 한 줄의 데이터를 한 문서에 합친 것일 뿐 형식도 병합 문서에 가져오지 않았다.
3. excel 2003의 문서 통합에만 사용할 수 있습니다.
4. 코드는 윈도우에서 Python 자체 IDEL에 쓰여있고,python 버전은 2.7.3입니다.
구체적인 코드는 다음과 같습니다.
  1 ##2012-05-06 14:27
  2 # -*- coding:utf-8 -*-
  3 from Tkinter import *
  4 import tkFileDialog
  5 import tkMessageBox
  6 import os
  7 import xlrd
  8 import xlwt
  9 
 10 class combination(Frame):
 11     """combine excel files"""
 12     def __init__(self,parent=None):
 13         Frame.__init__(self,parent)
 14         self.sheetNo = 0
 15         self.filepath = []
 16         self.outpath = ""
 17         self.flag_ckbtn = IntVar()
 18         self.pack(side=TOP)
 19         self.init_entry()
 20         self.init_btn()
 21 
 22 
 23     def init_entry(self):
 24         """get sheet No by the Entry"""
 25         eframe = Frame(self)
 26         eframe.pack()
 27         Label(eframe,width=9,text='Sheet No:').pack(side='left',pady=15)
 28         en_sheetNo = Entry(eframe,width=3)
 29         en_sheetNo.pack(side='left',pady=15)
 30         en_sheetNo.bind('', (lambda event:self.getsheetNo(en_sheetNo.get())))
 31         Label(eframe,width=9,text='1st row:').pack(side='left',pady=15)
 32         ##v = IntVar()
 33         Checkbutton(eframe,onvalue=0,offvalue=1,variable=self.flag_ckbtn).pack(side='left',pady=15)
 34         
 35     def getsheetNo(self,num):
 36         """pass out sheetNo"""
 37         try:
 38             self.sheetNo = int(num)
 39         except ValueError: tkMessageBox.showinfo("Illegal Input","please input number!")
 40         
 41     def init_btn(self):
 42         """two buttons"""
 43         btn_frame = Frame(self)
 44         btn_frame.pack()
 45         btn_import = Button(btn_frame,text='Import',command=self.importx,width=8)
 46         btn_import.pack(side='left',padx=20)
 47         btn_combine = Button(btn_frame,text='Combine',command=self.combine,width=8)
 48         btn_combine.pack(side='left',padx=20)
 49 
 50     #Get filepath
 51     def importx(self):
 52         """Get input files route"""
 53         filenames = tkFileDialog.askopenfilenames()
 54         self.filepath = filenames.lstrip('{').rstrip('}').split('} {')
 55                 
 56     def combine(self):
 57         """combine excel files and write into out.xls"""
 58         if self.validation(self.filepath):
 59             allrows = self.getAllRows(self.filepath,self.sheetNo)                    
 60             path = self.filepath[0].split("/")
 61             path = "/".join(path[0:-1])+"/out.xls"
 62             self.writeIntoExcel(path,allrows)
 63 
 64     def validation(self,filepath):
 65         """Validation for excel files"""            
 66         if filepath == [''] or len(self.filepath) == 0:
 67             tkMessageBox.showinfo("Combine Failed!","You need import several Excel files before combination")
 68             return False       
 69         if filepath[0][-3:] != "xls":
 70             tkMessageBox.showinfo("Combine Failed!","Only Excel files can be combined!")
 71             return False
 72         return True
 73         
 74 
 75     def getAllRows(self,filepath,sheetNo):
 76         """combine all rows into a list"""
 77         allrows = []        #clear before store rows
 78         for fname in filepath:
 79             try:
 80                 data = xlrd.open_workbook(fname)
 81             except IOError:
 82                 tkMessageBox.showinfo("IOError","Please select at least one file!")
 83                 return
 84             
 85             #get sheet number
 86             if sheetNo in range(data.nsheets+1):
 87                 pass
 88             else: sheetNo = data.nsheets
 89             table = data.sheet_by_index(sheetNo-1)
 90             
 91             #import all rows except or inculde the first one
 92             for rownum in range(self.flag_ckbtn.get(),table.nrows):
 93                 row = table.row_values(rownum)
 94                 fa = cmp(row[0].encode("utf-8"), "") # fa=0 if no value in first columen
 95                 fb = cmp(row[0].encode("utf-8"), " ") # fb=0 if equal the special value
 96                 colnum = len(row)
 97                 if fa!=0 and fb!=0 and row:
 98                     app=[]
 99                     for i in range(colnum):
100                         app.append(row[i])
101                     allrows.append(app)
102         return allrows
103 
104     def writeIntoExcel(self,path,allrows):
105         """write list into an excel file"""
106         wbk = xlwt.Workbook()
107         sheet = wbk.add_sheet('combined sheet')
108         for i in range(len(allrows)):
109             for j in range(len(allrows[i])):
110                 sheet.write(i,j,allrows[i][j])
111         #wbk.save(unicode(path,"utf-8"))
112         try:
113             wbk.save(path)
114         except IOError:
115             tkMessageBox.showinfo("Generate Failed!","Please close 'out.xls'")
116             return
117         tkMessageBox.showinfo("Combination Finished!","The combined file locate at: "+path)
118         return
119         
120                 
121 root = Tk()
122 root.title("Excel files combination")
123 root.geometry("240x100+550+300")
124 comb = combination(root)
125 root.mainloop()

다음으로 전송:https://www.cnblogs.com/Alex-Python-Waiter/archive/2012/05/10/excelCombination.html

좋은 웹페이지 즐겨찾기