
做U3d编辑器xlsx批量生成csv和python批量转
发布日期:2021-05-04 15:53:11
浏览次数:24
分类:原创文章
本文共 6180 字,大约阅读时间需要 20 分钟。
做U3d编辑器xlsx批量生成csv
xlsx编辑就是用强大的office Excel 2013 ,
也就是说 不管是程序还是美术只需要维护这个Excel就够了,然后一键批量转化为csv文件即可! 打包不会打包Excel,游戏中也不用这个!然后来到Unity3d的编辑器菜单。
在Unity的Editor文件夹下面需要这四个文件:
参考了:http://www.codeproject.com/Articles/246772/Convert-xlsx-xls-to-csv 的window窗口程序。
游戏中使用CSV的方法,在github上有一个很好的方法:
Unity CSV转为C#文件 来省去解析csv的步骤,节省游戏加载时间。
有人会问?为什么不直接使用Excel的xlsx文件,因为相同的内容文件大小比csv大很多。
看看代码吧: 相关的路径可以根据项目进行更改!
using UnityEngine;using System.Data;using System.IO;using Excel;using UnityEditor;/// <summary>/// Xlsl to CS./// </summary>public class XlslToCSV : EditorWindow { static string foldername = Application.dataPath; static DataSet result = new DataSet(); [MenuItem("Games/Excel To CSV &%#c")] // 要访问的Excel static void Menu_Click() { string Chosen_File = Application.dataPath + "/Editor" + "/test.xlsx"; // Excel的 xlsx的文件路径 getExcelData(Chosen_File); } static void getExcelData(string file) { if (file.EndsWith(".xlsx")) { // Reading from a binary Excel file (format; *.xlsx) FileStream stream = File.Open(file, FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); result = excelReader.AsDataSet(); excelReader.Close(); } if (file.EndsWith(".xls")) { // Reading from a binary Excel file ('97-2003 format; *.xls) FileStream stream = File.Open(file, FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); result = excelReader.AsDataSet(); excelReader.Close(); } // List<string> items = new List<string>(); // 得到所有表的表名 for (int i = 0; i < result.Tables.Count; i++) {// items.Add(result.Tables[i].TableName.ToString()); converToCSV(i, result.Tables[i].TableName.ToString()); } } static void converToCSV(int index, string OLdfileName) { // sheets in excel file becomes tables in dataset //result.Tables[0].TableName.ToString(); // to get sheet name (table name) string a = ""; int row_no = 0; while (row_no < result.Tables[index].Rows.Count) { for (int i = 0; i < result.Tables[index].Columns.Count; i++) { a += result.Tables[index].Rows[row_no][i].ToString() + ","; } row_no++; a += "\n"; } string output = foldername + "/Editor" + "\\" + OLdfileName + ".csv"; // 要保存的文件路径 StreamWriter csv = new StreamWriter(@output, false); csv.Write(a); csv.Close(); Debug.Log("File converted succussfully"); return; }}
其实这样做也是存在一个问题,策划也是很少使用Unity的, 他们在配置完xlsx后总不能都要打开Unity然后点击菜单进行转化吧。
那么现在就说说强大的python实现方式: 参考
也是借助第三方的扩展。
将xls xlsx 格式的文件转换为csv(','分隔,以‘\\n’行结束符(当然也可以设置为其他的呀!))
需要安装xlrd模块 (安装说明在本文最后!)
使用方法:
将xls文件和当前模块放同一个文件夹,执行脚本,自动在当前文件生成csv
xls2csv.py
# encoding: utf-8import os,sys,inspect,reimport xdrlib,xlrdreload(sys)sys.setdefaultencoding("utf-8")#分割符C_SPACE = ","#结束符C_END = "\n"#获取脚本文件的当前路径def cur_file_dir(): path = os.path.realpath(sys.path[0]) print path if os.path.isfile(path): print "exe" path = os.path.dirname(path) return os.path.abspath(path) else: print "文件" caller_file = inspect.stack()[1][1] return os.path.abspath(os.path.dirname(caller_file))#搜索指定文件夹下面的文件(默认当前目录)def find_file_by_pattern(pattern='.*', base=".", circle=True): '''''查找给定文件夹下面所有 ''' re_file = re.compile(pattern) if base == ".": base = cur_file_dir() print "开始搜索文件夹:",base final_file_list = [] cur_list = os.listdir(base) for item in cur_list: # print item if item == ".svn": continue full_path = os.path.join(base, item) if full_path.startswith("~"): continue if full_path.endswith(".xlsx") or full_path.endswith(".xls"): print "in:" + 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#打开exceldef 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 = [] # print heads '''开始读取数据''' 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:# elif isinstance(v, str): vstr = v if i > 0: content = content + C_SPACE content = content + vstr content = content + C_END #生成文件后缀 fname = os.path.splitext(_file) filename = fname[0] + ".csv" #写文件 if len(filename)>0 and len(content)>0: # filename = _path + "/" + filename print "out:" + filename file_object = open(filename, 'w') file_object.write(content) file_object.close()def main(): filelist = find_file_by_pattern() if len(filelist) > 0: path = "" # if not os.path.isdir(path): # os.makedirs(path) #遍历文件生成csv for file in filelist: datalist = excel_table_byindex(file, 0) if len(datalist)>0: savaToCSV(file, datalist, path) else: print "没有找到任何excel技能文件!"if __name__=="__main__": main()
python环境变量配置:
在“Path”行,添加python安装在win下面的路径即可,本人python安装在E:\Python27,所以在后面,添加该路径即可。
ps:记住,路径直接用分号“;”隔开!
ps:记住,路径直接用分号“;”隔开!
ps : 安装xlrd-0.9.3.tar。 由于我没把python安装在系统盘所以要手动的拷贝scripts 和 xlrd 到python的系统安装路径中(有的是 合并文件夹)。
ps : 建议安装python就安装在系统盘中即可。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月07日 12时22分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
线程的退出
2019-03-04
2-MySQL性能性能优化实战
2019-03-04
M - 简单字符串排序
2019-03-04
SQL case when写法
2019-03-04
Mybatis使用collection导致分页总数过多
2019-03-04
常用运放电路分析
2019-03-04
CUDA编成:从GPU的物理体系结构到逻辑结构
2019-03-04
安全工具大全(持续补充中)
2019-03-04
使用docker搭建redis-cluster集群
2019-03-04
Java多线程3种实现方式
2019-03-04
PyQt5按键创建的几种方法
2019-03-04
JNI系列(一)JNI简介
2019-03-04
Maven学习笔记(二)-仓库
2019-03-04
CentOS7报: ping: unknown host www.baidu.com
2019-03-04
Maven学习笔记(五)-使用Nexus搭建Maven私服
2019-03-04
Ubuntu15安装Redis
2019-03-04
Maven手动安装dubbo到本地仓库
2019-03-04
window中使用git安装PyMySQL
2019-03-04
centos7 elasticsearch5.2.2安装kibana5.2.2
2019-03-04