海上月明

          editer by sun
          posts - 162, comments - 51, trackbacks - 0, articles - 8
             :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

          PYTON與EXCEL:使用pyExcelerator來讀寫 Excel文件

          Posted on 2014-11-21 09:35 pts 閱讀(2391) 評論(0)  編輯  收藏 所屬分類: PythonOffice
          【FROM】http://blog.csdn.net/suofiya2008/article/details/5589627   
          我們寫程序,經(jīng)常會需要輸出一些數(shù)據(jù)進(jìn)行保存,對于格式固定的大量數(shù)據(jù),Excel表格會是比較好的一個選擇。如果你需要在Python下寫入Excel文件,那么就需要用到PyExcelerator了。

          PyExcelerator是一個第三方庫,用來處理Excel文件。它的優(yōu)點(diǎn)是:

          簡單易用,上手快。

          寫操作很方便,適合用來生成Excel文件記錄數(shù)據(jù)。

          不需要WinCOM支持,沒裝Office也 可以生成Excel表格

          當(dāng)然,PyExcelerator也是有缺點(diǎn)的,它所提供的讀寫操作方式相對簡單,要對已有的Excel文件進(jìn)行修改,就顯得比較麻煩了。

          如果要對已有的Excel表格進(jìn)行較復(fù)雜的修改操作,選擇PyExcelerator就不太合適了,這時候可以試試另外的方法。比如使用pywin32通過WinCOM來操作Excel表格,或者使用xlrd。

          PyExcelerator的官方主頁是http://sourceforge.net/projects/pyexcelerator,程序包中并沒有太多的教程文檔,不過包含了一些簡單的示范操作的小例子,如果需要更詳細(xì)的信息,就只能讀源代碼了。

           

          一。初始pyExcelerator

           

               pyExcelerator是一個基于python的可以讀寫excel文件的產(chǎn)品。和xlrd相比,pyExcelrator的主要特點(diǎn)在于可以對excel文件進(jìn)行寫操作。但是在讀取數(shù)據(jù)方面,功能就沒有xlrd強(qiáng)大了。

            pyExcelerator只能提供關(guān)于表單內(nèi)容的基礎(chǔ)數(shù)據(jù),對于表單行數(shù)、列數(shù)、單元格數(shù)據(jù)類型等詳細(xì)信息都沒有提供訪問接口。因此開發(fā)人員必須了解表單的具體結(jié)構(gòu),才對表單中的數(shù)據(jù)進(jìn)行正確的分析轉(zhuǎn)換。

            將pyExcelerator產(chǎn)品包(pyexcelerator-0.6.3a.tgz)上傳到服務(wù)器上之后解壓縮,然后在產(chǎn)品目錄下鍵入如下命令:

               # python setup.py install
          
          
          
          
          
          
          
          在命令行中,你將看到一連串的running,creating,copying,byte—compiling命令結(jié)果,吧啦吧啦。。。
          
          
          
          最后一行出現(xiàn)
          
          Writing C:/Python26/Lib/site-packages/pyExcelerator-0.6.4.1-py2.6.egg-info
          
          
          
          說明已經(jīng)將插件安裝到你的python環(huán)境中了,至此安裝完成。
          
          
          
          這里提一個小例子:
          1. from pyExcelerator import *  
          2.   
          3.   
          4.   
          5. w = Workbook() #創(chuàng)建一個工作簿  
          6.   
          7.   
          8.   
          9. ws = w.add_sheet('Hey, Hades'#創(chuàng)建一個工作表  
          10.   
          11.   
          12.   
          13. ws.write(0,0,'bit'#在1行1列寫入bit  
          14.   
          15.   
          16.   
          17. ws.write(0,1,'huang'#在1行2列寫入huang  
          18.   
          19.   
          20.   
          21. ws.write(1,0,'xuan'#在2行1列寫入xuan  
          22.   
          23.   
          24.   
          25. w.save('mini.xls'#保存  
          二、Excel文件讀取

          from pyExcelerator import *
          sheets = parse_xls('d:/a.xls')

          很簡單,與 xlrd 不同。xlrd 需要先調(diào)用book = xlrd.open_workbook(filename)打開文檔,然后再調(diào)用sh= book.sheet_by_index(i)來得到第幾個sheet,然后再使用sh.cell_value(i,j)得到i行j列的單元格的值。操作多了一點(diǎn)。而上面的parse_xls(filename)則直接返回一個列表,每一項(xiàng)就是一個sheet的數(shù)據(jù)。每項(xiàng)是一個二元組(表名,單元格數(shù)據(jù))。其中單元格數(shù)據(jù)為一個字典,鍵值就是單元格的索引(i,j)。如果某個單元格無數(shù)據(jù),那么就不存在這個值??此坪唵危珡奶幚砩喜幌?nbsp; xlrd 一樣,可以知道每個sheet的最大行數(shù)和列數(shù),然后進(jìn)行循環(huán)。而使用 pyExcelerator好象沒有最大行數(shù)和列數(shù),再加上空數(shù)據(jù)又不存在,因此在處理上相對麻煩一些。這樣在處理上還需要注意。它與 xlrd 一樣都支持 unicode,但好象沒有 xlrd 一樣方便地判斷單元格的類型的方法,感覺還是 xlrd在功能上可能要強(qiáng)一些。當(dāng)然這只是個人感覺,再加上只是看了看例子,并沒有怎么使用。

          三、Excel文件寫入

          這個才是重頭。那么安裝好 pyExcelerator 之后,讀了 Readme.txt 之后了解到它的文檔正在進(jìn)行當(dāng)中,因此想多了解如何使用它需要看它所帶的例子,甚至看源程序。下面是我從例子中了解的如何寫一個 Excel 文檔需要了解的。

          為了方便,在導(dǎo)入這個模塊中使用了import *的方式。

          from pyExcelerator import *

          首先導(dǎo)入模塊,然后是生成工作薄。

          w = Workbook()

          接著是加入一個工作表(sheet)。

          ws = w.add_sheet('Hey, Dude')

          然后就可以保存了。

          w.save('mini.xls')

          上面的代碼加在一起就是:

          from pyExcelerator import *

          w = Workbook()
          ws = w.add_sheet('Hey, Dude')
          w.save('mini.xls')

          這就是最小的一個例子了,在例子中叫mini.py。你可以在例子目錄下運(yùn)行mini.py看一看是不是生成了一個空的Excel文件。

          如果想加入中文很簡單,改為:

          #coding=cp936
          from pyExcelerator import *

          w = Workbook()
          ws = w.add_sheet(u'這是中文')
          w.save('mini.xls')

          這樣上面的執(zhí)行結(jié)果是生成一個空Excel文件,但它的第一個sheet的名字為“這是中文”。就這樣,只要保證你寫入時使用unicode就行了。

          空文件可以生成,那么如何插入單元格呢?

          ws.write(i, j, value)

          其中value為值,可以是unicode。

          接著,我們可能想改變單元格的樣式,如字體:

          font0 = Font()
          font0.name = 'Times New Roman'
          font0.struck_out = True
          font0.bold = True

          style0 = XFStyle()
          style0.font = font0

          這樣我們創(chuàng)建了一個字體,然后又生成了一個樣式。注意,真正起作用的是樣式,字體不過是樣式中的一種效果。

          這樣在寫入單元格時帶著這個樣式就行了,還是使用上面的write()方法:

          ws.write(1, 1, 'Test', style0)

          這是在名為ws的sheet中的第(1,1)單元格寫入了值為"Test"的內(nèi)容,并且它的樣式為style0。

          然后我們還可以設(shè)置單元格的邊框:

              borders = Borders()
              borders.left = 5
              style.borders = borders

          上面創(chuàng)建了一個邊框效果,設(shè)置了左邊框,至于5是什么意思,我也不清楚,隨便寫的。然后放到樣式中。
          上面的例子可以參考format.py程序

          其它還有許多的效果,簡單地列一下:

           示例名說明 
           col_width.py改變單元格寬度 
           row_style.py設(shè)置行的高度 
           merged*.py

          單元格合并 

           image.py

          插入圖片 

           outline*.py

          大綱效果(以前真沒用過) 

           wsprops.py

          sheet的屬性值打印 

           xls2*.py

          Excel轉(zhuǎn)為其它的文件格式 

          大家有興趣自已照著例子學(xué)吧。

           

           

           

          四: 時間小示例

           

          給俺的boss寫的一個小工具,使用Python對Excel進(jìn)行統(tǒng)計,然后把結(jié)束生成一個新的Excel表格,使用到了xlrdpyExcelerator兩個庫。
          簡單的介紹一下這兩個庫,先說xlrd,這個庫讀Excel比較方便,各種方法使用起來也挺方便:
          bk = xlrd.open_workbook('your.xls')
          sh = bk.sheets()[-1]
          上面兩句就可以打開Excel表格中的一個sheet,sheets得到的是一個list,存放所有的sheet。
          sh.nrows是該sheet中的行數(shù),知道這個后就可以使用for循環(huán)來讀所有的單元格了:
          sh.row(i)[3]這個就代表第i行的第4列。
          再看看pyExcelerator,這個用起來有點(diǎn)別扭:
          sheets = parse_xls('result.xls')
          先打開一個表格,sheets是一個list,包含了所有表格的內(nèi)容,每一項(xiàng)就是一個sheet,而每個sheet是二元tuple,第一個是該sheet的名字,第二個是一個dict,dict的key是一個二元組,表示單元格的坐標(biāo),如(0,0),第一行第一列。
          從上面的分析中可以得出要訪問Excel中第一個sheet的第一行第一列元素需要:
          sheets[0][1][(0,0)]
          pyExcelerator也不能得到行列數(shù)。
          寫文件也比較簡單:
          wb = Workbook()
          ws = wb.add_sheet('result')
          ws.write(0,0,“hello”)
          wb.save('result.xls')
          就不解釋了:-)
          寫文件時需要注意直接寫Unicode內(nèi)容進(jìn)去,而不要寫編碼過的內(nèi)容。
          給boss的代碼:PYTHON:
          #!/usr/bin/env python
          # -*- coding=utf-8 -*-
          #Using GPL v2

          import xlrd
          from pyExcelerator import *

          city = [(u'山城','[2,3]d+'),(u'水國','4d+'),(u'火縣','5d+'),
                 (u'土城','6d+'),(u'土國','7d+'),(u'火鄉(xiāng)','8[1-5]d+'),
                 (u'水鄉(xiāng)','8[067]d+'),]

          fname = '0107CRM.xls'
          bk = xlrd.open_workbook(fname)
          sh = bk.sheets()[-1]
          nrows = sh.nrows
          #result中按順序存放各city中各套餐的數(shù)量
          #順序?yàn)閄Ta+、XTb、XTb+
          result = []
          for i in range(len(city)):
              result.append([0,0,0])


          for r in range(1,nrows):
              num = str(sh.row(r)[3])[7:]
              flag = False
              for i in range(len(city)):
                  if re.match(city[i][1],num):
                      flag = True
                      if sh.row(r)[2].value == 3001.0:
                          break
                      name = sh.row(r)[0].value.encode('utf8')
                      if 'XTa+' in name:
                          result[i][0]+=1
                      if 'XTb' in name and 'XTb+' not in name:
                          result[i][1]+=1
                      if 'XTb+' in name:
                          result[i][2]+=1
              if not flag:
                  print "NO:"+num

          print result

          titles = [u'局向',u'數(shù)',u'M錄入數(shù)',u'X數(shù)',…………]
          wb = Workbook()
          ws = wb.add_sheet('result')
          for i in range(len(titles)):
              ws.write(0,i,titles[i])

          for i in range(len(city)):
              ws.write(i+1,0,city[i][0])
              ws.write(i+1,1,result[i][0])
              ws.write(i+1,4,result[i][1])
              ws.write(i+1,7,result[i][2])
              ws.write(i+1,10,result[i][0]+result[i][1]+result[i][2])
          ws.write(i+2,1,"=SUM(B2:B8)")
          wb.save('result.xls')


          后記:

          python對excel的操作確實(shí)不太強(qiáng)大,目前為止我只用過pyExcelerator,還有一個xlrd-xlwt的plugin;貌似這幾個對日常簡單的excel操作就夠用了!

          最近回頭看這篇blog的閱讀量還是挺大,今天工作之余寫下此后記,希望能和各位python高手們交流,共同提高!


          excel相關(guān)文章:

          1.xlrd-xlwt模塊  xlrd讀取excel文件(基本功能)

          2. 我同事魷魚哥解決excel2007讀寫的文章 openpyxl 讀寫excel2007使用筆記【感謝魷魚哥】

          主站蜘蛛池模板: 吕梁市| 张家港市| 淳化县| 绵阳市| 门头沟区| 和林格尔县| 来安县| 连云港市| 达拉特旗| 石河子市| 桂平市| 樟树市| 阿克苏市| 营山县| 家居| 竹溪县| 皋兰县| 凉城县| 宁都县| 双桥区| 永胜县| 博野县| 科技| 甘南县| 保定市| 大余县| 红安县| 龙南县| 建始县| 福建省| 广元市| 大余县| 无锡市| 高雄县| 林芝县| 高安市| 永和县| 蕲春县| 罗城| 新乡市| 墨玉县|