WPF嵌入WORD文档

  最近项目中遇到要嵌入WORD文档 ,网上查找了些资料,发现VS是提供这个控件的。

  DocumentViewer控件可插入WORD EXCEL PDF TXT等等,很强大的一个东西。

  我的需求是嵌入word的文档,显示数据以及保持时将数据以及数据的样式以二进制的形式存入数据库。这就涉及3步,1读取WORD文档 2将数据存入数据库 3下次打开的时候需要从数据库的数据显示在嵌入的word的文档中。

  首先第一步使用DocumentViewer控件 我单独将这个控件拿出来了

  

<Grid>
        <DocumentViewer Grid.Row="1" Name="documentviewWord" VerticalAlignment="Top" HorizontalAlignment="Left"/>
    </Grid>

  后台代码

  

 public  string wordFilePath
        {
            set;
            get;
        }

        private XpsDocument ConvertWordToXps(string wordFilename, string xpsFilename)
        {
            // Create a WordApplication and host word document
            Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
            try
            {
                wordApp.Documents.Open(wordFilename);

                // To Invisible the word document
                wordApp.Application.Visible = false;

                // Minimize the opened word document
                wordApp.WindowState = WdWindowState.wdWindowStateMinimize;

                Document doc = wordApp.ActiveDocument;

                doc.SaveAs(xpsFilename, WdSaveFormat.wdFormatXPS);

                XpsDocument xpsDocument = new XpsDocument(xpsFilename, FileAccess.Read);
                return xpsDocument;
            }
            catch (Exception ex)
            {
                MessageBox.Show("发生错误,该错误消息  " + ex.ToString());
                return null;
            }
            finally
            {
                wordApp.Documents.Close();
                ((_Application)wordApp).Quit(WdSaveOptions.wdDoNotSaveChanges);
            }
        }

        /// <summary>
        /// 将word转换为XPS文件
        /// </summary>
        /// <param name="wordDocName"></param>
        public void ConvertWordToXPS(string wordDocName)
        {
            string wordDocument = wordDocName;
            if (string.IsNullOrEmpty(wordDocument) || !File.Exists(wordDocument))
            {
                MessageBox.Show("该文件是无效的。请选择一个现有的文件.");
            }
            else
            {
                string convertedXpsDoc = string.Concat(Path.GetTempPath(), "\\", Guid.NewGuid().ToString(), ".xps");
                XpsDocument xpsDocument = ConvertWordToXps(wordDocument, convertedXpsDoc);
                if (xpsDocument == null)
                {
                    return;
                }

                documentviewWord.Document = xpsDocument.GetFixedDocumentSequence();
            }
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            if (wordFilePath != null)
            {
                try
                {
                    ConvertWordToXPS(wordFilePath);
                }
                catch (Exception)//纯string文本
                {

                }
            }

        }

  

wordFilePath是word路径是由调用的该自定义控件的界面传入的。
这时候遇到一个问题,怎么把
XpsDocument 格式的数据转为二进制的呢 以及二进制如何转换为 XpsDocument格式呢,我找了半天也没解决。后来,想了个折中的办法,将word转为二进制存入数据库这个简单,然后下次读取的时候将二进制存到当前系统的临时文件夹下面,存为word,然后和上面一样读取word,这样就解决了,哈哈。如果有人知道
XpsDocument 和二进制之间的转换,欢迎指点。
这里讲word与二进制之间的转换贴出来
/// <summary>
        /// 文件转换为二进制
        /// </summary>
        /// <param name="wordPath"></param>
        /// <returns></returns>
        private byte[] wordConvertByte(string wordPath)
        {
            byte[] bytContent = null;
            System.IO.FileStream fs = null;
            System.IO.BinaryReader br = null;
            try
            {
                fs = new FileStream(wordPath, System.IO.FileMode.Open);
            }
            catch
            {
            }
            br = new BinaryReader((Stream)fs);
            bytContent = br.ReadBytes((Int32)fs.Length);

            return bytContent;
        }

  

/// <summary>
        /// 将二进制保存为word
        /// </summary>
        /// <param name="data"></param>
        /// <param name="filepath"></param>
        protected void ConvertWord(byte[] data, string filepath)
        {
            FileStream fs = new FileStream(filepath, FileMode.CreateNew);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write(data, 0, data.Length);
            bw.Close();
            fs.Close();

        }

  

转载于:https://www.cnblogs.com/fanmiao/p/4019121.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值