一、前言

  在工作的过程中,我们有时可能会面临将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.basename(_file).split('.')
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
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

转载于:https://www.cnblogs.com/msxh/p/7858346.html

【游戏开发】Excel表格批量转换成CSV的小工具相关推荐

  1. 将excel(xls/xlsx)转换成csv文件

    将excel(xls/xlsx)转换成csv文件 首先pom.xml 需要引进的包如下: <dependency><groupId>net.sourceforge.jexcel ...

  2. excel中html批量转化为pdf文件,excel怎么批量转换成pdf格式

    时间:2020-02-10来源:百度经验作者:名字是代称阅读:5 Excel一直以来都是作为表格存入数据作用的,同时编辑数据也非常方便.但是若只用来阅读,却并不方便.而pdf格式很方便阅读,所以有人就 ...

  3. excel表格如何转换成word表格_pdf的表格怎么转换成word?教你掌握重要一步

    PDF的表格怎么转换成word? 习惯使用PDF文件的小伙伴们都知道,PDF文件是不能被轻易修改的.不知道大家伙有没有那种感觉,就是PDF文件看起来有种莫名的高级感.不管是图标,还是文件内容(可能是小 ...

  4. Excel表格如何转换成pdf格式

    我们在工作当中,很多时候给别人发送Excel文件的时候需要转换成PDF格式,这样别人只能阅读不好修改数据公式了,那么改如何操作呢,今天小编就和大家分享一个简单的方法,不需要下载软件,小文档每天都可以免 ...

  5. excel表格如何转换成word表格_如何免费将excel表格转换成Word文档?

    Excel能转成Word吗?有时为了日常工作的需求,可能会需要将表格转成其他格式的文档,比如Word,那么Excel应该如何操作才能转换成Word文档呢?一起来看看. 方法1:首先用极速表格打开Exc ...

  6. excel表格怎么转换成php格式转换,xls怎么转换成word格式

    xls怎么转换成word格式? 首先我们先打开需要将格式转换成word的excel文档,下图就是我们需要转换成word的文档,这时我们可以看到在表格的左上角有一个"microsoft off ...

  7. excel表格如何转换成word表格_Excel表格粘到Word中,全乱了!

    在实际工作中,Excel表格经常需要插入到Word文档中,如果直接粘贴,表格可能无法完全显示,而且行高和列宽全乱了. 其实你也可以粘成图片,格式没发生变化,但数据无法再更改. 怎么才能让格式不变,数据 ...

  8. excel表格如何转换成word表格_excel转化为word表格怎么做?

    excel转成word的步骤 打开要转换的文件. 选择定格菜单中的文件,然后点击另存为,选择一个地址. 在保存类型中选择"单个网页",点击选择:工作表. 单击发布,桌面上会出现另一 ...

  9. Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】

    背景    最近在使用JavaScript编写一些浏览器RPA脚本,脚本使用过程中遇到一些问题,脚本使用的数据往往存放在excel表,但运行时只能读取json数据,导致频繁人工excel转json,效 ...

最新文章

  1. 三维几何基础大合集(三维点积叉积、点线面、凸包)《计算几何全家桶(三)》
  2. 福布斯:2016年物联网预测和市场估算总结
  3. Ext2.0 form使用实例
  4. Go:go语言的认识理解、安装应用、语法使用之详细攻略
  5. AWT架构生成与设计Token
  6. 数据结构:二叉搜索树(BST)的基本操作
  7. oracle 存储过程字符替换,Oracle存储过程常用字符串处理函数整理
  8. Promise.allSettled
  9. python 检测直线 交点_Python+OpenCV图像处理——实现直线检测
  10. 《Unix环境高级编程》读书笔记 第5章-标准I/O流
  11. 12、阈值分割基础理论
  12. 华为云计算培训技术如何革新传统行业
  13. linux搭建steam服务器吗,如何在Linux系统服务器中安装steam play
  14. 基于Multisim14的弱信号放大电路的设计与仿真
  15. 无刷直流电机模糊PID控制
  16. 数据库常用操作,会持续更新
  17. make: *** [Makefile:44:obj/start.o] 错误 127
  18. 沟通管理--关于信息的有效传递和维护
  19. 十分钟搞定SSD1963液晶屏驱动
  20. 三人成虎,概率却不足十分之五?几个贝叶斯推理故事的分享

热门文章

  1. Servlet容器如何处理请求资源路径
  2. 数据结构与算法2——线性顺序存储
  3. 一个数学公式求解的优化
  4. 计算机网络---计算机网络分层结构
  5. html5特效 手机震动,html5 可以让用户按一下手机键盘手机震动一下吗
  6. 五百兆电信宽带玩穿越火线,电信区,延时卡70到80怎么回事,换的千兆猫和路由器,线都是六类?
  7. 为什么要多读书?多看书?
  8. 海员可以饮用蒸馏海水吗?
  9. 亲情可以冷酷到什么地步?大家有亲身经历的吗?
  10. 空中楼阁成语故事,空中楼阁用来比喻什么?