首页 >Unity3D频道 >【Unity3D研究院之游戏开发】 > Unity3D研究院之在MAC上脚本写入Excel .xlsx格式(七十六)
2014
07-25

Unity3D研究院之在MAC上脚本写入Excel .xlsx格式(七十六)

今天同事告诉我了一个更好的方法进行unity中的读与写 (EPPlus)

https://epplus.codeplex.com/releases/view/118053

	[MenuItem("1/1")]
	static void Update () 
	{

		string path = Application.dataPath+ "/test.xlsx";
		FileStream fs = new FileStream(path,FileMode.Create);
		
		using (var package = new ExcelPackage(fs))
		{
		     ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("sheet1");
			 worksheet.Cells[1, 1].Value = "Company name1";
			 worksheet.Cells[1, 2].Value = "Address1";
			 
			 worksheet = package.Workbook.Worksheets.Add("sheet2");
			 worksheet.Cells[1, 1].Value = "Company name2";
			 worksheet.Cells[1, 2].Value = "Address2";
			 package.Save();
		}
		fs.Close();
        AssetDatabase.Refresh();
	}

 

这里还有个更详细的教程, http://tedgustaf.com/blog/2012/11/create-excel-20072010-spreadsheets-with-c-and-epplus/

return;

以前找了很久可以跨平台支持读写Excel的工具,我也试了很多种DLL。可在Windows上各个完美支持,可是在MAC上就各种恶心。为什么一开始我想找DLL呢?因为DLL很方便,因为它可以直接在Unity里面跨平台,现在开发小组里面都有人用MAC有人用Windows。感谢昨天微博好友给我说的一个办法,以前我一直围绕着DLL在研究,却忽略了别的方法,废话不多说,开始正文。

为什么要生成.XLSX呢?我的初衷是想把代码里面还有Prefab里面的中文提取出来用来做多语言,如果你有兴趣可以看看我的上一篇文章。https://www.xuanyusong.com/archives/2987

如下图所示,我先在C#代码里面把我需要写入Excel的内容生成出来,其实代码部分因为都是文件级的提取在python里面都可以提取,只是Prefab部分我就不知道怎么在python里搞了。加上我对python也不太懂,目前还在学习python中。考虑到策划可能已经翻译过了一些文字,所以在生成的时候尽量把新产生的中文KEY放在最后,或者生成的时候给它加个颜色来标识一下,而已经翻译过的就不要在生成成新的了。

Foxmail20140725_2

 

好了不说废话了, 我们用的工具是XLsxWriter https://pypi.python.org/pypi/XlsxWriter 或者在文章的最后你去下载我的工程。我把XlsxWriter放在我的Unity工程里面,如下图所示,examples下面就是它的例子。

Foxmail20140725_3

因为mac自带python所以也不用单独去安装,执行例子就是打开终端。

python xxxx/examples/demo.py

当我在直接执行python的时候发现了一个错误。

  File “/Users/MOMO/New Unity Project 15/Assets/Scripts/Editor/XlsxWriter-0.5.6/examples/demo.py”, line 7, in <module>

    import xlsxwriter

我的解决办法就是把需要执行的python脚本放在与xlsxwriter文件夹同级的目录下,也就是上图中demo的位置。

然后看看我写的python脚本,因为我以前没用过python所以也不太懂,也就是今天才开始学,目前感觉脚本语言写起来舒服很多了。

# -*- coding: utf-8-*-
import xlsxwriter
import sys
import os

#带生成excel的文本参数传递进来,这里取到它的目录 
folder,path=os.path.split(sys.argv[1])
#在他的同级目录下生成.xlsx
xlsxPath = folder + '/demo.xlsx'

#准备开始生成excel
workbook = xlsxwriter.Workbook(xlsxPath)
worksheet = workbook.add_worksheet()
row = 0

#读取文本,按照♀符号隔开的顺序
file = open(sys.argv[1], 'r')
lines = [ x.strip().split('♀') for x in file.readlines() ]

#循环遍历,把内容写进excel中
for line in lines[1:]:
	#这里要注意,因为设置文本的格式是UTF-8不然会报错喔
    worksheet.write(row, 0, unicode(line[0] , 'utf-8'))
    worksheet.write(row, 1, unicode(line[1] , 'utf-8'))
    row += 1

workbook.close()

在终端里面执行,参数1就是我用c#生成好的中文文本目录,这样在python里面去提取,最终将excel生成在和他同级目录下。

python /Users/MOMO/New Unity Project 15/Assets/Scripts/Editor/XlsxWriter-0.5.6/demo.py /Users/MOMO/New Unity Project 15/Assets/out.txt

如下图所示,最终我的中文已经完完整整的写入excel了。

Foxmail20140725_4

最后是完整的下载地址:http://pan.baidu.com/s/1dD1n7Vj

另外虽然xlsxwriter也支持读取excel的功能,但是我觉得如果仅仅是读取你最好看我之前文章介绍的这种方法

https://www.xuanyusong.com/archives/2429 它是完全基于mono的可以直接跨平台,它唯一的缺陷就是不支持写入excel。

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之在MAC上脚本写入Excel .xlsx格式(七十六)》有 19 条评论

  1. 小婉说:

    我用unity2017.1在editor下运行,workSheet.Cells 是null,雨松大大知道是什么情况吗

  2. 首先,谢谢MOMO提供的方法,经测试unity5.3.4f,unity5.3.5f完美运行EPPlus.dll,查看EPPlus.dll官方源代码后,知道了报错是因为在这两个版本中还要加入System.Drawing.dll和System.Security.dll,EPPlus.dll写入的代码网上有很多,下面附上读的几行代码:void Start () {string str = @”222.xlsx”;if (string.IsNullOrEmpty(str)) return;FileStream fs = new FileStream(str, FileMode.Open);ExcelPackage pack = new ExcelPackage(fs);int allSheet = pack.Workbook.Worksheets.Count;ExcelWorksheet workSheet = pack.Workbook.Worksheets Unity3D研究院之在MAC上脚本写入Excel .xlsx格式(七十六) - 雨松MOMO程序研究院 - 1 ;int colume = workSheet.Dimension.Columns;int row = workSheet.Dimension.Rows;for (int i = 1; i <= colume; i ){for (int j = 1; j <= row; j ){print(workSheet.GetValue(j, i));}}}至于能不能跨平台,没有环境无法测试,请有条件的朋友回复一下能否跨平台,谢谢!

  3. 首先,谢谢MOMO提供的方法,经测试unity5.3.4f,unity5.3.5f完美运行EPPlus.dll,查看EPPlus.dll官方源代码后,知道了报错是因为在这两个版本中还要加入System.Drawing.dll和System.Security.dll,EPPlus.dll写入的代码网上有很多,下面附上读的几行代码:void Start () { string str = @”222.xlsx”; if (string.IsNullOrEmpty(str)) return; FileStream fs = new FileStream(str, FileMode.Open); ExcelPackage pack = new ExcelPackage(fs); int allSheet = pack.Workbook.Worksheets.Count; ExcelWorksheet workSheet = pack.Workbook.Worksheets Unity3D研究院之在MAC上脚本写入Excel .xlsx格式(七十六) - 雨松MOMO程序研究院 - 1 ; int colume = workSheet.Dimension.Columns; int row = workSheet.Dimension.Rows; for (int i = 1; i <= colume; i++) { for (int j = 1; j <= row; j++) { print(workSheet.GetValue(j, i)); } } }至于能不能跨平台,没有环境无法测试,请有条件的朋友回复一下能否跨平台,谢谢!

  4. 强烈建议 MOMO 将 epplus 写个教程

  5. 法克鱿说:

    epplus在unity里面导出嵌入了VBA的xlsm会报错,不知道为什么

  6. 虾儿说:

    但是如果要发布出来就会报错的,就是说DLL不能被引用

  7. EPPlus.dll 无法导入Unity,我的是5.2.0f3,Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
    什么原因呢?还有什么方法可以在Unity里写入导出到excel吗?

  8. 514说:

    excel 打开时读取会报错

  9. 江涛说:

    excel 不是直接可以导出xml吗。。

  10. 陈龙说:

    哦,这样啊,那我们只有默默的支持你啦,多发发分享,让朋友们多多的来,希望MOMO天天都有咖啡喝!对了,MOMO还出了些什么书?你出的U3D的书,我有买哦,讲的很不错,可能因为我是美工的原因,我挺希望印刷是彩色的呢还有就是入门的书籍,我觉得最好还是站在一个小白的角度来出书,不然有些脚本还是不太容易理解的

  11. 陈龙说:

    MOMO早点开微信平台的关注吧!好期待哦!

  12. 陈龙说:

    想在微信上关注你哦,因为想要随时随地关注你的最新帖子

  13. frank28说:

    why not trying csv instead of xls?

留下一个回复

你的email不会被公开。 必填项已用 * 标注。