提示: 作者被禁止或刪除 內容自動屏蔽

TOP

回覆 1# ~monkey~


我做梗類似嘅野。
將每幾百個一樣格式嘅EXCEL, 入面特定嘅內容summarize 返做一個EXCEL。
我用python 寫條script,用openpyxl, xlrd 兩個module 去read 每個EXCEL 嘅內容之後, 再寫入一個新EXCEL FILE。
都可以寫入其他EXCEL FILE, 但係如果個FILE 入面有有PIVOT TABLE嘅話會破壞咗個PIVOT TABLE,
要用PIVOT TABLE 嘅話要開個新FILE LINK過去避免寫入去時破壞咗個PIVOT TABLE。

另外我唔想喺其他電腦都裝python 先run到條script , 放埋個winpython上file server 就部部機都可以run到。

TOP

本帖最後由 ~monkey~ 於 2016-3-24 08:00 編輯
回覆  ~monkey~


我做梗類似嘅野。
將每幾百個一樣格式嘅EXCEL, 入面特定嘅內容summarize 返做一個EXCEL ...
hm7781 發表於 24/3/2016 06:36 AM



    我個ABC都係同format,可唔可以分享下d script

TOP

回覆 13# ~monkey~

講明先, 我冇學過programming , 只係上網左抄右抄人d script 一知半解咁用, 可能有錯, 仲可能寫得好怪。
話就話一樣格式但係間唔中梗有幾個excel 多一行少一行走晒位所以要逐個cell search :
  1. import os
  2. import openpyxl ##淨係可以讀寫xlsx
  3. import xlrd  ##淨係可以讀xls, 要寫要用xlwt, openpyxl 同xlrd 都要用pip 另外裝咗先用到

  4. dirpath = "/path/to/excel/files" ##準備個filelist 先
  5. FILES = []
  6. for DIRpaths,DIRnames,FILEnames in os.walk(dirpath):
  7.     for file in FILEnames:
  8.         row = []
  9.         row.append(DIRpaths)
  10.         row.append(file)
  11.         FILES.append(row)

  12. FILESxls = []  
  13. for DIRpaths, file in FILES:  ##filter 走唔關事嘅file
  14.     if (file.find('.xls') >= 0 and file.find('.xlsx') < 0):
  15.         FILESxls.append(os.path.join(DIRpaths,file))

  16. TABLE = []  ##開個table , 讀完所有data 之後一次過寫入去新xlsx
  17. for file in FILESxls:
  18.     workbook = xlrd.open_workbook(file)
  19.     worksheet = workbook.sheet_by_index(0) ## 逐個xls 開, read第一張sheet

  20.     num_of_row = worksheet.nrows
  21.     num_of_col = worksheet.ncols  ##先check 下有data 嘅範圍有幾大

  22.         ##set 返個limit, 費事有d人喺個xls 度寫到落65535咁就有排讀
  23.     if num_of_row > 100:
  24.         num_of_row = 100
  25.     if num_of_col > 13:
  26.         num_of_col = 13

  27.     for y in range(num_of_row):
  28.         for x in range(num_of_col):
  29.             cell = worksheet.cell_value(y,x) ##從上至下左至右逐個cell 讀, 先讀每個excel 只有一個嘅value
  30.             if isinstance(cell, str):

  31.                                 if "ABC" in cell:
  32.                     ABC = worksheet.cell_value(y+1,x) ##記低寫住"ABC"個cell 對落一格個value

  33.                                 if "CBA" in cell:
  34.                     CBA = []
  35.                     CBA.append(x)
  36.                     CBA.append(y) ##記低寫住"CBA"個cell 個座標

  37.                                 if "Date" in cell:
  38.                     DATE = worksheet.cell_value(y,x)
  39.                     DATE = '=text("'+str(DATE)+'","yyyy-mm-dd")' ##日子唔識搞, 夾硬用excel function 寫入去

  40.                                 if "1234567" in cell:
  41.                     STARTROW = []
  42.                     STARTROW.append(x)
  43.                     STARTROW.append(y)

  44.                 ENDROW = []
  45.                 ENDROW.append(1)
  46.                 ENDROW.append(num_of_row-1) ##指定某個範圍一陣再讀一次

  47.     for y in range(STARTROW[1]+3,ENDROW[1]-1):
  48.         row = []
  49.         row.append(DATE)
  50.                 row.append(ABC)
  51.         row.append(worksheet.cell_value(y,CBA[0])) ##根據之前記低個座標逐行讀落去

  52.         TABLE.append(row) ##逐行寫入table, 寫完loop 返上去去下一個xls


  53. workbook = openpyxl.Workbook() ## 開新xlsx 準備寫入去
  54. worksheet = workbook.active

  55. if TABLE:
  56.     n = ('DATE','ABC','CBA')
  57.     for x in range(len(TABLE[0])):
  58.         worksheet.cell(column=x+1,row=1).value = n[x] ##先寫第一行field names

  59.     num_of_head_row = 1

  60.     for y in range(len(TABLE)):
  61.         for x in range(len(TABLE[y])):
  62.             worksheet.cell(column=x+1,row=y+1+num_of_head_row).value = TABLE[y][x] ##跟住由上至下左至右逐個cell 寫入去

  63.         output = "/path/to/output/file"
  64.     workbook.save(output) ##save file, 完

  65. else:
  66.     print("no TABLE")
複製代碼

TOP

回覆  ~monkey~

講明先, 我冇學過programming , 只係上網左抄右抄人d script 一知半解咁用, 可能有錯, 仲 ...
hm7781 發表於 24/3/2016 09:10 PM



    THANKS~放心,我都冇學過programming,我會慢慢睇同慢慢試

TOP

標題

回覆 14# hm7781

請問下用python處理幾百個excel ,  大約用幾奈時間?

TOP

回覆  hm7781

請問下用python處理幾百個excel ,  大約用幾奈時間?
bongbong3481 發表於 2016-3-25 00:10


602 xls

real    0m28.087s
user    0m6.836s
sys     0m0.292s

TOP

回覆 17# hm7781

快成咁啊!

我系公司都系搞幾百個FILE(不過用VBS),只系不斷咁COPY 去一個FILE, 然後SET 番D FORMAT, 都用左20分鐘

TOP

回覆  hm7781

快成咁啊!

我系公司都系搞幾百個FILE(不過用VBS),只系不斷咁COPY 去一 ...
bongbong3481 發表於 2016-3-25 18:22


我嫌慢添, 不過叫做work 仲用到暫時頂住檔先, 有時間先再refine 下。
VBS 似乎可以搞多D EXCEL FORMAT 嘅野, 但個人覺得好難學搞佢唔掂,
對我嚟講都係python 易用D 。

TOP

602 xls

real    0m28.087s
user    0m6.836s
sys     0m0.292s
hm7781 發表於 2016-3-25 08:39


   
其實幾百個file經已唔係excel最有效率去做,用個database 裝會好好多

via HKEPC Ionic Reader v1.2.9 - iPad

TOP