海上月明

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

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

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

          PyExcelerator是一個第三方庫,用來處理Excel文件。它的優點是:

          簡單易用,上手快。

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

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

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

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

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

           

          一。初始pyExcelerator

           

               pyExcelerator是一個基于python的可以讀寫excel文件的產品。和xlrd相比,pyExcelrator的主要特點在于可以對excel文件進行寫操作。但是在讀取數據方面,功能就沒有xlrd強大了。

            pyExcelerator只能提供關于表單內容的基礎數據,對于表單行數、列數、單元格數據類型等詳細信息都沒有提供訪問接口。因此開發人員必須了解表單的具體結構,才對表單中的數據進行正確的分析轉換。

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

               # python setup.py install
          
          
          
          
          
          
          
          在命令行中,你將看到一連串的running,creating,copying,byte—compiling命令結果,吧啦吧啦。。。
          
          
          
          最后一行出現
          
          Writing C:/Python26/Lib/site-packages/pyExcelerator-0.6.4.1-py2.6.egg-info
          
          
          
          說明已經將插件安裝到你的python環境中了,至此安裝完成。
          
          
          
          這里提一個小例子:
          1. from pyExcelerator import *  
          2.   
          3.   
          4.   
          5. w = Workbook() #創建一個工作簿  
          6.   
          7.   
          8.   
          9. ws = w.add_sheet('Hey, Hades'#創建一個工作表  
          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 需要先調用book = xlrd.open_workbook(filename)打開文檔,然后再調用sh= book.sheet_by_index(i)來得到第幾個sheet,然后再使用sh.cell_value(i,j)得到i行j列的單元格的值。操作多了一點。而上面的parse_xls(filename)則直接返回一個列表,每一項就是一個sheet的數據。每項是一個二元組(表名,單元格數據)。其中單元格數據為一個字典,鍵值就是單元格的索引(i,j)。如果某個單元格無數據,那么就不存在這個值。看似簡單,但從處理上不象  xlrd 一樣,可以知道每個sheet的最大行數和列數,然后進行循環。而使用 pyExcelerator好象沒有最大行數和列數,再加上空數據又不存在,因此在處理上相對麻煩一些。這樣在處理上還需要注意。它與 xlrd 一樣都支持 unicode,但好象沒有 xlrd 一樣方便地判斷單元格的類型的方法,感覺還是 xlrd在功能上可能要強一些。當然這只是個人感覺,再加上只是看了看例子,并沒有怎么使用。

          三、Excel文件寫入

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

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

          from pyExcelerator import *

          首先導入模塊,然后是生成工作薄。

          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。你可以在例子目錄下運行mini.py看一看是不是生成了一個空的Excel文件。

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

          #coding=cp936
          from pyExcelerator import *

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

          這樣上面的執行結果是生成一個空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

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

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

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

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

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

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

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

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

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

          單元格合并 

           image.py

          插入圖片 

           outline*.py

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

           wsprops.py

          sheet的屬性值打印 

           xls2*.py

          Excel轉為其它的文件格式 

          大家有興趣自已照著例子學吧。

           

           

           

          四: 時間小示例

           

          給俺的boss寫的一個小工具,使用Python對Excel進行統計,然后把結束生成一個新的Excel表格,使用到了xlrdpyExcelerator兩個庫。
          簡單的介紹一下這兩個庫,先說xlrd,這個庫讀Excel比較方便,各種方法使用起來也挺方便:
          bk = xlrd.open_workbook('your.xls')
          sh = bk.sheets()[-1]
          上面兩句就可以打開Excel表格中的一個sheet,sheets得到的是一個list,存放所有的sheet。
          sh.nrows是該sheet中的行數,知道這個后就可以使用for循環來讀所有的單元格了:
          sh.row(i)[3]這個就代表第i行的第4列。
          再看看pyExcelerator,這個用起來有點別扭:
          sheets = parse_xls('result.xls')
          先打開一個表格,sheets是一個list,包含了所有表格的內容,每一項就是一個sheet,而每個sheet是二元tuple,第一個是該sheet的名字,第二個是一個dict,dict的key是一個二元組,表示單元格的坐標,如(0,0),第一行第一列。
          從上面的分析中可以得出要訪問Excel中第一個sheet的第一行第一列元素需要:
          sheets[0][1][(0,0)]
          pyExcelerator也不能得到行列數。
          寫文件也比較簡單:
          wb = Workbook()
          ws = wb.add_sheet('result')
          ws.write(0,0,“hello”)
          wb.save('result.xls')
          就不解釋了:-)
          寫文件時需要注意直接寫Unicode內容進去,而不要寫編碼過的內容。
          給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'火鄉','8[1-5]d+'),
                 (u'水鄉','8[067]d+'),]

          fname = '0107CRM.xls'
          bk = xlrd.open_workbook(fname)
          sh = bk.sheets()[-1]
          nrows = sh.nrows
          #result中按順序存放各city中各套餐的數量
          #順序為XTa+、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'數',u'M錄入數',u'X數',…………]
          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的操作確實不太強大,目前為止我只用過pyExcelerator,還有一個xlrd-xlwt的plugin;貌似這幾個對日常簡單的excel操作就夠用了!

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


          excel相關文章:

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

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

          主站蜘蛛池模板: 苍山县| 恭城| 外汇| 衡山县| 蓬安县| 塔河县| 北辰区| 和龙市| 隆尧县| 右玉县| 隆安县| 惠东县| 潮州市| 隆子县| 奎屯市| 五峰| 贺州市| 饶平县| 确山县| 西丰县| 任丘市| 墨江| 武宣县| 全南县| 通州区| 五华县| 深泽县| 台前县| 天祝| 绍兴市| 民乐县| 寿宁县| 嵩明县| 故城县| 阳信县| 兴业县| 武鸣县| 江油市| 志丹县| 甘泉县| 武定县|