1. 程式人生 > >【遊戲開發】Excel表格批量轉換成CSV的小工具

【遊戲開發】Excel表格批量轉換成CSV的小工具

作用 span all 腳本開發 class lob 索引 之前 並保存

一、前言

  在工作的過程中,我們有時可能會面臨將Excel表格轉換成CSV格式文件的需求。這尤其在遊戲開發中體現的最為明顯,策劃的數據文檔大多是一些Excel表格,且不說這些表格在遊戲中讀取的速度,但就論占用內存來說,同樣的數據量Excel表格所占用的內存要遠遠大於CSV,因此將Excel轉換成CSV勢在必行。如果單單轉換一個Excel表格還好,直接另存為就搞定的,但是如何將一個文件下的N個Execl表格轉成CSV呢?今天馬三就來和大家一起用Python擼一個Excel表格批量轉換CSV的小工具——Xls2CSV。

二、準備開發環境

  馬三在網上找到了一些現有的Excel批量轉換小工具,但是他們或多或少都有些不甚好用,裏面的註釋又不全。馬三在它們的基礎上進行了優化,支持自定義輸入輸出路徑,解決了中文亂碼的問題,並且添加了較為全面的註釋。下面先簡單介紹一下開發環境:

  • 轉化工具由Python2.7.x開發,依賴xlrd包(用於處理Excel表格)
  • 首先安裝Python2.7.x並配置環境變量,這不必多說,網上有很多教程
  • 然後安裝我們的依賴包xlrd,到https://pypi.python.org/pypi/xlrd 下載xlrd源碼包到本地,如圖1所示
  • 在解壓後的源碼包內執行 python setup.py install ,安裝xlrd模塊
  • 重啟命令行即可生效

  技術分享圖片

  圖1:xlrd源碼包下載

三、Xls2CSV腳本開發  

  開發環境準備好之後,我們就可以進行開發工作了。首先還是上一下整體的代碼,然後在解釋一下它的工作思路:

技術分享圖片
  1 # -*- coding: utf-8 -*-  
  2 
  3 import os,sys,inspect,re
  4 import xdrlib,xlrd
  5 
  6 # 防止中文亂碼
  7 reload(sys)
  8 sys.setdefaultencoding("utf-8")
  9 
 10 # 分割符
 11 C_SPACE = ","
 12 # 結束符
 13 C_END = "\n"
 14 # 輸入路徑(存放xls文件的路徑)
 15 IN_PATH = ""
 16 # 輸出路徑(導出csv文件的路徑)
 17
OUT_PATH = "" 18 19 20 # 讀取配置文件 21 def read_config(): 22 config_file = open("config.ini","r") 23 cur_line = config_file.readline().rstrip("\r\n").split(,) 24 global IN_PATH 25 IN_PATH = cur_line[1] 26 cur_line = config_file.readline().rstrip("\r\n").split(,) 27 global OUT_PATH 28 OUT_PATH = cur_line[1] 29 30 # 過濾路徑 31 def cur_file_dir(path): 32 if os.path.isfile(path): 33 path = os.path.dirname(path) 34 print path 35 return os.path.abspath(path) 36 37 # 搜索指定文件夾下面的文件 38 def find_file_by_pattern(pattern=.*, base=".", circle=True): 39 # 查找給定文件夾下面所有xls文件 40 re_file = re.compile(pattern) 41 # 第一次搜索的時候過濾下路徑,遞歸之後直接搜索base路徑即可 42 if base == ".": 43 base = cur_file_dir(IN_PATH) 44 print u"開始搜索文件夾:",base 45 46 # 存儲xls文件的列表 47 final_file_list = [] 48 # 遍歷指定路徑下的文件 49 cur_list = os.listdir(base) 50 for item in cur_list: 51 # 忽略一些幹擾的文件,如果你還有其他需要忽略的文件,直接在後面繼續添加即可 52 if item == ".svn": 53 continue 54 # 拼接路徑 55 full_path = os.path.join(base, item) 56 # 忽略臨時文件 57 if full_path.startswith("~"): 58 continue 59 # 篩選出xlsx\xls文件 60 if full_path.endswith(".xlsx") or full_path.endswith(".xls"): 61 print u"輸入文件:" + full_path 62 bfile = os.path.isfile(item) 63 if os.path.isfile(full_path): 64 if re_file.search(full_path): 65 final_file_list.append(full_path) 66 else: 67 final_file_list += find_file_by_pattern(pattern, full_path) 68 69 # 返回文件列表 70 return final_file_list 71 72 73 # 打開excel 74 def open_excel(file= file.xls): 75 try: 76 data = xlrd.open_workbook(file) 77 return data 78 except Exception,e: 79 print str(e) 80 81 82 #根據索引獲取Excel表格中的數據 參數:file:Excel文件路徑, colnameindex:表頭列名所在行的索引, by_index:表的索引 83 def excel_table_byindex(file=file.xls, colnameindex=0, by_index=0): 84 data = open_excel(file) 85 table = data.sheets()[by_index] 86 nrows = table.nrows #行數 87 ncols = table.ncols #列數 88 rowlist = [] 89 90 ‘‘‘開始讀取數據‘‘‘ 91 for rownum in range(colnameindex, nrows): 92 rowdata = table.row_values(rownum) 93 if rowdata: 94 collist = [] 95 for i in range(ncols): 96 collist.append(rowdata[i]) 97 rowlist.append(collist) 98 return rowlist 99 100 #保存csv文件 101 def savaToCSV(_file, _list, _path): 102 filename = "" 103 content = "" 104 #生成文件內容 105 for collist in _list: 106 for i in range(len(collist)): 107 v = collist[i] 108 vstr = "" 109 # print k,v 110 if isinstance(v, float) or isinstance(v, int): 111 vstr = str(int(v)) 112 else: 113 vstr = v 114 if i > 0: 115 content = content + C_SPACE 116 content = content + vstr 117 content = content + C_END 118 119 #生成文件後綴 120 fname = os.path.splitext(_file) 121 filename = fname[0] + ".csv" 122 123 #寫文件 124 if len(filename)>0 and len(content)>0: 125 #filename = OUT_PATH + "/" + filename 126 print u"輸出文件:" + filename 127 file_object = open(filename, w) 128 file_object.write(content) 129 file_object.close() 130 131 132 def main(): 133 134 read_config() 135 filelist = find_file_by_pattern() 136 if len(filelist) > 0: 137 path = "" 138 #遍歷文件生成csv 139 for file in filelist: 140 datalist = excel_table_byindex(file, 0) 141 if len(datalist)>0: 142 savaToCSV(file, datalist, path) 143 else: 144 print u"沒有找到任何excel文件!" 145 146 if __name__=="__main__": 147 main()
View Code

  轉表工具的工作思路如下:

  • 首先,從配置文件中讀取到輸入路徑和輸出路徑
  • 接著,過濾路徑,並在輸入路徑下執行搜索,如果是xls文件的話,則把其路徑+文件名加入一個filelist列表中保存待用;如果是其他文件,則跳過;如果是目錄的話,則對該目錄也進行相同的搜索(即遞歸調用搜索函數)
  • 然後,遍歷之前保存的filelist列表,取出xls文件的路徑,然後利用xlrd模塊打開Excel表格,並提取其中的信息
  • 最後,根據之前的xls文件名,創建出對應的輸出路徑(輸出路徑+Execl文件名.csv),然後將讀取出的數據,逐行寫入CSV文件並保存

  具體每塊函數和代碼的作用,已經在註釋裏面寫清了,直接看註釋就好。

四、Xls2CSV工具的使用

  工具開發完了,如何使用呢?其實它使用起來很簡單,只需兩步操作:

  • 打開 config.ini 配置文件,配置輸入路徑以及輸出路徑,將路徑替換成自己的就好 ,如圖2所示
  • 執行 xlsx2csv.py 腳本進行自動導表,這一步最好在命令行下執行腳本,這樣如果有報錯信息的話也可以直觀地看到。如果雙擊執行的話,很有可能一閃而過,腳本報錯了也不知道

  技術分享圖片

  圖2:配置輸入輸出路徑

五、其他優秀的轉表工具   

  上面我們寫的Excel批量轉換工具其實還是太簡陋了,tolua的開發者已經為廣大的Unity開發人員制作了一款可以將Excel表格數據導出為Lua table、csv、json形式的工具,兼帶數據檢查功能以及導出、導入MySQL數據庫功能。除此之外,還支持GUI界面等很多實用的功能,大家感興趣的話可以到Github去查看該項目的具體內容:https://github.com/zhangqi-ulua/XlsxToLua

六、總結

  通過本篇博客,我們一起學習了如何使用Python制作一款批量轉換Excel表格為CSV文件的小工具,從而提升我們的工作效率。因為本工具並沒有經過大量項目和數據的測試,所以很有可能存在未知的bug,因此如果大家在商業項目中應用的話,最好還是使用上面所說的成熟的tolua中的轉表工具,會更穩定一些。本篇博客只是為大家拋磚引玉,提供一種Excel批量轉換的思路。

  本篇博客中的所有代碼已經托管到Github,開源地址:https://github.com/XINCGer/Unity3DTraining/tree/master/XlsxTools/xls2csv 歡迎fork!

作者:馬三小夥兒
出處:http://www.cnblogs.com/msxh/p/7858346.html
請尊重別人的勞動成果,讓分享成為一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!

【遊戲開發】Excel表格批量轉換成CSV的小工具