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();

        }

  

时间: 2025-01-17 05:50:42

WPF嵌入WORD文档的相关文章

允许嵌入到PDF,Word文档和其他文件的条形码控件UPC/EAN Barcode Font Advantage Package

IDAutomation的UPC/EAN Barcode Font Advantage Package是一个先进的字体产品,它所用的工具,宏和源代码可以使用一个单一的字体文件来创建UCC-12, UPCA, UPCE, EAN8, EAN13, JAN, ISBN 和Bookland条形码.该字体满足ANSI, ISO和IEC 2000规格说明要求(ISO 15420:2000). 具体功能: 为了创建合适的UPC和EAN条形码类型,打印的字符必须要从UPC/EAN条形码字体数据表上定义的表格上

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

还在为画“类Word文档报表”而发愁吗?

?Word 是非常强大的文档编辑工具,一些行业制式文档都是使用Word来创建的,像教育行业的申请表,履历表,审批表等,像石油业的勘探记录表,记录报告,检测报告等,如房地产业的制式合同,不仅包含大量的文字描述,还会嵌入图片,表格等一些数据控件.我们通常选择使用 Word 来创建这些文档,因为它有着极强的图文混排的能力能够实现集图表,表格,图片等组成的一个混合布局的复杂报表. 但使用Word越是创建这些复杂的结构,越需要耗费过多的时间来"画"出这些复杂的样式, 且所有的数据都需要手动输入,

asp.net如何实现word文档在线预览

原文:asp.net如何实现word文档在线预览 实现方式:office文档转html,再在浏览器里面在线浏览 1.首先引入com组件中office库,然后在程序集扩展中引入word的dll 2.将Microsoft.Office.Interop.Word的嵌入互操作类型设置为 false,如图 3.主要代码 C# 代码   复制 using System; using System.Collections.Generic; using System.Linq; using System.Web

Word文档换台电脑打开后字体、排版等会发生变化的原因及解决方案!

情景说明: 有时候,我们好不容易用Word写好文档,做好排版发给别人,别人会告诉你格式怎么是乱的啊,标题.正文.页眉页脚什么的格式都变了, 想尽各种办法都没能得到解决,那么出现这种情况的原因到底是什么呢?下面我把我的经验总结一下告诉大家,希望大家能有所受益! 会引起排版变化的原因如下: 一.Office版本不同: 首先给大家普及一下Office的发展史吧:   Office 97 Office 2000 Office XP Office 2003 Office 2007 Office 2010

2.QT中操作word文档

 Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合.ActiveQt由两个模块组成: A   QAxContainer模块允许我们使用COM对象并且可以在Qt应用程序中嵌入QActive控件. B   QAxServer模块允许我们导出使用Qt编写的自定义的COM对象和Active控件. C   在这里,我们使用了QAxContainer模块,所以在.pro中,需要使用下面这一项来链接这个QAxContainer模块:CONFIG+=qaxcont

向Docx4j生成的word文档添加图片和布局--第一部分

原文标题:Adding images and layout to your Docx4j-generated word documents, part 1 原文链接:http://blog.iprofs.nl/2012/10/22/adding-images-and-layout-to-your-docx4j-generated-word-documents-part-1/ 原文作者:lvdpal 发表日期:2012年10月22日 注:由于我对docx4j也不是很熟悉,所以很多专业名词不会翻译,

使用FreeMarker生成Word文档

FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件. FreeMarker是免费的,基于Apache许可证2.0版本发布.其模板编写为FreeMarker Template Language(FTL),数据简单.专用的语言.需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显

[转载]Java生成Word文档

在开发文档系统或办公系统的过程中,有时候我们需要导出word文档.在网上发现了一个用PageOffice生成word文件的功能,就将这块拿出来和大家分享. 生成word文件与我们编辑word文档本质上是相同的,只不过在用程序生成word文档的时候换成了用代码来操作.下面的例子中主要有添加标题,正文(段落.字体.字号.倍行间距.对齐方式.首行缩进等),插入图片等操作.这里写的例子给出的内容只是PageOffice 组件生成word文件的部分方法,需要使用更多方法的还是要自己根据实际的需求去查看AP