using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

using System.IO;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using A = DocumentFormat.OpenXml.Drawing;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

namespace OfficeOpenXmlHelp.Word
{
    /// <summary>
    /// word帮助类，完成后请调用Dispose()
    /// </summary>
    public class WordOpenXml
    {
        /// <summary>
        /// 获取的 WordprocessingDocument 对象
        /// </summary>
        private WordprocessingDocument wordDoc;

        /// <summary>
        /// 初始化一个word
        /// </summary>
        /// <param name="fileStream"></param>
        public WordOpenXml(Stream fileStream, bool isEditable)
        {
            wordDoc = WordprocessingDocument.Open(fileStream, isEditable);
        }

        /// <summary>
        ///  搜索和替换文档<w:t></w:t>的内容。
        ///  快速方便地搜索和替换。 因为它检索的字符串格式的 XML 文档，它可能不可靠。 根据正则表达式，可能会无意中替换 XML 标记并损坏文档。
        /// </summary>
        /// <param name="oldValue">查找字符串</param>
        /// <param name="newValue">替换字符串</param>
        public void Replace(string oldValue, string newValue)
        {
            Replace(new Dictionary<string, string>()
            {
                { oldValue, newValue }
            });
        }

        /// <summary>
        ///  搜索和替换文档<w:t></w:t>的内容。
        ///  快速方便地搜索和替换。 因为它检索的字符串格式的 XML 文档，它可能不可靠。 根据正则表达式，可能会无意中替换 XML 标记并损坏文档。
        /// </summary>
        /// <param name="ky">多个替换内容</param>
        public void Replace(Dictionary<string, string> ky)
        {
            string docText = string.Empty;
            //在打开文件进行编辑之后，可使用 StreamReader 对象读取该文件。
            using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
            {
                docText = sr.ReadToEnd();
            }

            foreach (var item in ky)
            {
                //创建正则表达式对象，再将该文本值替换文本
                //文本在xml中为： <w:t>Title</w:t>
                //加上前后匹配，增加可靠性
                Regex regexText = new Regex("t>" + item.Key + "</w");
                docText = regexText.Replace(docText, "t>" + item.Value + "</w");
            }

            //保存
            using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
            {
                sw.Write(docText);
            }
        }

        /// <summary>
        /// 保存+关闭
        /// </summary>
        public void Save()
        {
            wordDoc.Dispose();
        }

    }
}
