之前做项目基本都是在本地读读数据,最多搞个截图就行了,最近客户突然提出要将实验报告(UGUI,包括图片、按钮、输入框、文字等),这就有点懵,好在经过一段时间的研究,可以在Unity内通过NPOI类库(没听说的可以找度娘问一下)创建和修改Word文档,OK,进入正题吧!
我直接把所需要的dll文件全都打包出来了,在官网下的比较麻烦,不怕麻烦的童靴可以自己去官网逛一下学习学习,以下附上链接,可直接在百度网盘下载(提取码:kkkk)。
https://pan.baidu.com/s/1fE9hmm62ms_KgPj5HffEVA
别忘了类库文件一定要放在Plugins文件夹里面才能在C#中引用哦,在引用后发现报错,这里需要把Unity的Scripting Runtime Version改成 .NET 4.6 的(我是用Unity 2017.2.0 测试的)
先来引用以下吧
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using NPOI.XWPF.UserModel;
using System.IO;
using System;
定义好文件路径、文件名称,在这里我用一个Path准备缝合路径
///
/// 文件路径
///
private const string filePath = @"C:/Users/Administrator/Desktop";
///
/// 文件名称
///
private string fileName = "david.docx";
private string path;
///
/// word文档
///
private XWPFDocument doc = new XWPFDocument();
private void Start()
{
//缝合路径
path = Path.Combine(filePath, fileName);
}
开始写入文档并保存在本地,这里涉及到字体大小、字体颜色、段落内容。
///
/// 创建段落
///
/// 对齐方式
/// 字体大小
/// 字体颜色(16进制)
/// 内容
private void CreateParagraph(ParagraphAlignment _alignment, int _fontSize,
string _color, string _content)
{
XWPFParagraph paragraph = doc.CreateParagraph();
paragraph.Alignment = _alignment;
XWPFRun run = paragraph.CreateRun();
run.FontSize = _fontSize;
run.SetColor(_color);
run.FontFamily = "宋体";
run.SetText(_content);
FileStream fs = new FileStream(path, FileMode.Create);
doc.Write(fs);
fs.Close();
fs.Dispose();
Debug.Log("写入成功");
}
OK,现在回到Unity后把该脚本随便挂到一个游戏物体身上,引用这个方法,运行游戏会发现在指定路径下创建了一个Word文档(并且有我们写入的内容哦)。
个人感觉创建文件并没有什么卵用,举个例子,咱们做一个带有考核的项目,最终的实验报告文字和图片基本上都是固定的,需要改动的只有姓名、学号、成绩等等字段对不对,那么问题来了,如果所有的内容都是通过API手动创建的话(能够想到有多麻烦,文字居中、标题大小、创建表格等等等。。。)。因此修改文档内容才是最高效和简便的方法,直接进入主题。
首先,当然先搞一个Word文档了,PS:这里的路径一定要和Unity里面的路径保持一致。
这个{$test}就相当于一个字段,为了与其他文字或者符号区分,这里我只是为了方便测试,才用test代替,当然也可以用score、name等等名称,最关键的要来了。
///
/// 读写文件
///
private void ReadWriteFile()
{
path = Path.Combine(filePath, fileName);
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
XWPFDocument doc = new XWPFDocument(fs);
//遍历段落
foreach (var para in doc.Paragraphs)
{
string oldText = para.ParagraphText;
if (oldText == "")
{
continue;
}
//记录段落文本
string tempText = para.ParagraphText;
//查找标记并修改内容
if (tempText.Contains("{$test}"))
{
tempText = tempText.Replace("{$test}", "我的测试");
}
//替换内容
para.ReplaceText(oldText, tempText);
}
FileStream output = new FileStream(path, FileMode.Create);
doc.Write(output);
fs.Close();
fs.Dispose();
output.Close();
output.Dispose();
Debug.Log("修改文件");
}
通过指定路径读取Word文档,然后遍历每个段落,可以看到,通过API可以获取文档内是否有我们自定义的字段,找到了可以直接替换成我们需要改成的内容,最后在进行输出,文件就得到更新了,是不是很简单。
OK,内容最终得到了完美的修改,是不是很方便呢,实验报告生成后直接打印出来就可以看到考核的成绩了。