unity 本地生成检索关键字替换生成word

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);//打开指定文件
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值