【游戏开发】Excel表格批量转换成CSV的小工具
一、前言
在工作的过程中,我们有时可能会面临将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脚本开发
开发环境准备好之后,我们就可以进行开发工作了。首先还是上一下整体的代码,然后在解释一下它的工作思路:
# -*- coding: utf-8 -*- import os,sys,inspect,re
import xdrlib,xlrd # 防止中文乱码
reload(sys)
sys.setdefaultencoding("utf-8") # 分割符
C_SPACE = ","
# 结束符
C_END = "\n"
# 输入路径(存放xls文件的路径)
IN_PATH = ""
# 输出路径(导出csv文件的路径)
OUT_PATH = "" # 读取配置文件
def read_config():
config_file = open("config.ini","r")
cur_line = config_file.readline().rstrip("\r\n").split(',')
global IN_PATH
IN_PATH = cur_line[1]
cur_line = config_file.readline().rstrip("\r\n").split(',')
global OUT_PATH
OUT_PATH = cur_line[1] # 过滤路径
def cur_file_dir(path):
if os.path.isfile(path):
path = os.path.dirname(path)
print path
return os.path.abspath(path) # 搜索指定文件夹下面的文件
def find_file_by_pattern(pattern='.*', base=".", circle=True):
# 查找给定文件夹下面所有xls文件
re_file = re.compile(pattern)
# 第一次搜索的时候过滤下路径,递归之后直接搜索base路径即可
if base == ".":
base = cur_file_dir(IN_PATH)
print u"开始搜索文件夹:",base # 存储xls文件的列表
final_file_list = []
# 遍历指定路径下的文件
cur_list = os.listdir(base)
for item in cur_list:
# 忽略一些干扰的文件,如果你还有其他需要忽略的文件,直接在后面继续添加即可
if item == ".svn":
continue
# 拼接路径
full_path = os.path.join(base, item)
# 忽略临时文件
if full_path.startswith("~"):
continue
# 筛选出xlsx\xls文件
if full_path.endswith(".xlsx") or full_path.endswith(".xls"):
print u"输入文件:" + full_path
bfile = os.path.isfile(item)
if os.path.isfile(full_path):
if re_file.search(full_path):
final_file_list.append(full_path)
else:
final_file_list += find_file_by_pattern(pattern, full_path) # 返回文件列表
return final_file_list # 打开excel
def open_excel(file= 'file.xls'):
try:
data = xlrd.open_workbook(file)
return data
except Exception,e:
print str(e) #根据索引获取Excel表格中的数据 参数:file:Excel文件路径, colnameindex:表头列名所在行的索引, by_index:表的索引
def excel_table_byindex(file='file.xls', colnameindex=0, by_index=0):
data = open_excel(file)
table = data.sheets()[by_index]
nrows = table.nrows #行数
ncols = table.ncols #列数
rowlist = [] '''开始读取数据'''
for rownum in range(colnameindex, nrows):
rowdata = table.row_values(rownum)
if rowdata:
collist = []
for i in range(ncols):
collist.append(rowdata[i])
rowlist.append(collist)
return rowlist #保存csv文件
def savaToCSV(_file, _list, _path):
filename = ""
content = ""
#生成文件内容
for collist in _list:
for i in range(len(collist)):
v = collist[i]
vstr = ""
# print k,v
if isinstance(v, float) or isinstance(v, int):
vstr = str(int(v))
else:
vstr = v
if i > 0:
content = content + C_SPACE
content = content + vstr
content = content + C_END #生成文件后缀
fname = os.path.basename(_file).split('.')
filename = fname[0] + ".csv" #写文件
if len(filename)>0 and len(content)>0:
filename = OUT_PATH + "/" + filename
print u"输出文件:" + filename
file_object = open(filename, 'w')
file_object.write(content)
file_object.close() def main(): read_config()
filelist = find_file_by_pattern()
if len(filelist) > 0:
path = ""
#遍历文件生成csv
for file in filelist:
datalist = excel_table_byindex(file, 0)
if len(datalist)>0:
savaToCSV(file, datalist, path)
else:
print u"没有找到任何excel文件!" if __name__=="__main__":
main()
转表工具的工作思路如下:
- 首先,从配置文件中读取到输入路径和输出路径
- 接着,过滤路径,并在输入路径下执行搜索,如果是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的小工具的更多相关文章
- 【游戏开发】Excel表格批量转换成lua的转表工具
一.简介 在上篇博客<[游戏开发]Excel表格批量转换成CSV的小工具> 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用.实际在Unity开发中,很多游 ...
- 数据库表转换成javaBean对象小工具
package test.utils; import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter; ...
- 转换成CSV文件、Word、Excel、PDF等的方法--读取CSV文件的方法
1. 转换成CSV文件: http://www.dotnetgallery.com/lab/resource93-Export-to-CSV-file-from-Data-Table-in-Aspne ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新
本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...
- 将DataTable转换成CSV文件
DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记 ...
- 用 unoconv 将 xls 转换成 csv
在 Linux 下,用 unoconv 将 xls 转换成 csv. unoconv -f csv -v input.xlsx
- Excel将秒转换成标准的时间格式HH:MM:SS
Excel将秒转换成标准的时间格式HH:MM:SS 比如120秒,转换成00:02:00 Excel公式为: =TEXT(A1/86400,"[hh]:mm:ss") A1为秒数据 ...
随机推荐
- JS类继承常用方式发展史
JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...
- javascript小节
javascript 语法总结 知识概要: (1)Javascript概述 1.1javascript是什么? 1.2JavaScript语言组成 1.3JavaScript与Html的结 ...
- 远程连接MySQL,防火墙阻止访问,解决方法
远程连接MySQL,防火墙阻止访问,解决方法 xp/2003添加防火墙例外端口 打开防火墙,选择例外选项卡,添加端口 名称:mysqlport 端口号:3306 选中TCP win7添加防火墙例外 ...
- VS2015智能提示由英文改为中文
使用 VS2015 时,在 4.0 下智能提示显示中文,在 4.5 下显示英文,对于我这种爱(ying)国(yu)人(tai)士(lan)来说,用起来太不方便了,于 是在 知乎 上找到个好方法如下: ...
- Win10下python3和python2同时安装并解决pip共存问题
特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似. 使用python开发,环境有Python2和 python3 两种,有时候需要两种环境切换使用,下 ...
- commonjs模块和es6模块的区别
commonjs模块与es6模块的区别 到目前为止,已经实习了3个月的时间了.最近在面试,在面试题里面有题目涉及到模块循环加载的知识.趁着这个机会,将commonjs模块与es6模块之间一些重要的的区 ...
- 使用Gradle构建Android项目
阅读目录 Gradle是什么? 环境需求 Gradle基本结构 任务task的执行 基本的构建定制 目录配置 签名配置 代码混淆设置 依赖配置 输出不同配置的应用 生成多个渠道包(以Umeng为例) ...
- Extjs6(四)——侧边栏导航根据路由跳转页面
本文基于ext-6.0.0 之前做的时候这个侧边栏导航是通过tab切换来切换页面的,但是总感觉不太对劲,现在终于发现怎么通过路由跳转了,分享给大家,可能有些不完善的地方,望大家读后可以给些指点.欢迎留 ...
- Javascript常见浏览器兼容问题
常见浏览器原生javascript兼容性问题主要分为以下几类: 一.Dom 1.获取HTML元素,兼容所有浏览器方法:document.getElementById("id")以I ...
- JavaScript注释之HTML注释(<!-- & //-->)
JavaScript中支持HTML注释 //用法 <script language="javascript"> <!-- alert("我是注释内的JS ...