npoi 本地生成实验报告(需要添加unity\Editor\Data\Mono\lib\mono\unity下方 I18N...dll系列文件,否则发布exe不运行)
using System.Collections.Generic;
using UnityEngine;
using NPOI.XWPF.UserModel;
using System.IO;
using System.Diagnostics;
using System;
using System.Collections;
using Debug = UnityEngine.Debug;
public class ReadWrite : MonoBehaviour
{
/// <summary>
/// 存放word中需要替换的关键字以及对应要更改的内容
/// </summary>
public Dictionary<string, string> DicWord = new Dictionary<string, string>();
/// <summary>
/// 更改后的文件路径
/// P.S. 当然可以直接修改模板文件,这里另外生成文件是个人为了方便测试。
/// </summary>
private string targetPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)+"/fan_test.docx";
public string a, b;
/// <summary>
/// Word模板路径
/// </summary>
string path;
private void Start()
{
path = Application.dataPath + "/david.docx";
DicWord.Add(a, b);
DicWord.Add("$心得体会$", "假如生活欺骗了你");
DicWord.Add("$剧情介绍$", "普希金");
DicWord.Add("$收集系统$", "假如生活欺骗了你假如生活欺骗了你,不要悲伤,不要心急!忧郁的日子里须要镇静:相信吧,快乐的日子将会来临!心儿永远向往着未来;现在却常是忧郁。一切都是瞬息,一切都将会过去;而那过去了的,就会成为亲切的怀恋。");
DicWord.Add("$阵营系统$", "黄药师");
DicWord.Add("$人物好感度系统$", "欧阳锋");
DicWord.Add("$知识问答系统$", "一灯");
DicWord.Add("$评价$", "洪七公");
DicWord.Add("$本章总得分$", "59");
print(path);
ReplaceKeyword();
}
/// <summary>
/// 截取游戏屏幕内的像素
/// </summary>
/// <param name="rect">截取区域:屏幕左下角为0点</param>
/// <param name="fileName">文件名及存储路径</param>
/// <param name="callBack">截图完成回调</param>
/// <returns></returns>
public IEnumerator ScreenCapture(Rect rect, string fileName, Action callBack = null)
{
yield return new WaitForEndOfFrame();//等到帧结束,不然会报错
Texture2D tex = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.ARGB32, false);//新建一个Texture2D对象
tex.ReadPixels(rect, 0, 0);//读取像素,屏幕左下角为0点
tex.Apply();//保存像素信息
byte[] bytes = tex.EncodeToPNG();//将纹理数据,转化成一个png图片
System.IO.File.WriteAllBytes(fileName, bytes);//写入数据
Debug.Log(string.Format("截取了一张图片: {0}", fileName));
callBack?.Invoke();
#if UNITY_EDITOR
UnityEditor.AssetDatabase.Refresh();//刷新Unity的资产目录
#endif
}
/// <summary>
/// 替换关键字
/// </summary>
private void ReplaceKeyword()
{
using (FileStream stream = File.OpenRead(path))
{
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 != "" && oldText != string.Empty && oldText != null)
{
string tempText = para.ParagraphText;
foreach (KeyValuePair<string, string> kvp in DicWord)
{
if (tempText.Contains(kvp.Key))
{
tempText = tempText.Replace(kvp.Key, kvp.Value);
para.ReplaceText(oldText, tempText);
}
}
}
}
//遍历表格
var tables = doc.Tables;
//指定位置插入图片
if (tables != null)
{
//NPOI 插入图片用的是流 Stream ,所以前提得有这个图片(可用上方IEnumerator ScreenCapture方法在截取“屏幕像素”到指定路径上),这里面内置了一张5.jpg
string path_imag = Application.streamingAssetsPath + "/5.jpg";
//for循环放在外面,是因为每插入一张图片就得重新刷新,如果都放在里面,会出现有图片位置区域但无显示图片的问题
for (int i = 0; i < tables[0].Rows.Count; i++)
{
using (FileStream picData = new FileStream(path_imag, FileMode.Open, FileAccess.Read))
{
//图片的文件流 图片类型 图片名称 设置的宽度以及高度
tables[0].GetRow(i).GetCell(0).AddParagraph().CreateRun().AddPicture(picData, (int)PictureType.JPEG, "one.jpg", (int)(500.0 * 9525), (int)(500.0 * 9525));
}
}
}
//遍历表格
foreach (var table in tables)
{
foreach (var row in table.Rows)
{
foreach (var cell in row.GetTableCells())
{
foreach (var para in cell.Paragraphs)
{
string oldText = para.ParagraphText;
if (oldText != "" && oldText != string.Empty && oldText != null)
{
//记录段落文本
string tempText = para.ParagraphText;
foreach (KeyValuePair<string, string> kvp in DicWord)
{
if (tempText.Contains(kvp.Key))
{
tempText = tempText.Replace(kvp.Key, kvp.Value);
//替换内容
para.ReplaceText(oldText, tempText);
}
}
}
}
}
}
}
//生成指定文件
FileStream output = new FileStream(targetPath, FileMode.Create);
//设置 不可编辑(悬挂填充模板保护)
doc.EnforceFillingFormsProtection();
//将文档信息写入文件
doc.Write(output);
//一些列关闭释放操作
fs.Close();
fs.Dispose();
output.Close();
output.Dispose();
Process.Start(targetPath);//打开指定文件
}
}
}