博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录一下WPF开发(三)--- 基于Word书签的XPS报表
阅读量:4029 次
发布时间:2019-05-24

本文共 4672 字,大约阅读时间需要 15 分钟。

制作报表可有很多方案,这里记录一种C#版的报表方案:利用Word做好模板,并为动态内容添加书签,然后通过程序另存为后缀名为XPS的文件。为什么要XPS的报表呢,第一是因为Win7以上的系统都自带,XP安装也比较方便,第二报表效果非常好看,还可设置签名。

Word制作模板,并添加书签在此略过。

提供一个Word模板处理工具,具体思路是,

1.根据路径打开模块,然后创建一个临时文件,因为Word程序是直接操作原模板,会改变模板的结构,所以要先检查是否存在,如果存在的话先删掉,再复制原模板与临时文件中,再进行处理。

2.找到书签,写入数据

3.另存为xps文件

ReportUtil.cs如下

class ReportUtil    {        private _Application wordApp = null;        private _Document wordDoc = null;               public _Application Application        {            get { return wordApp; }            set             {                wordApp = value;             }        }        public _Document Document        {            get            {                return wordDoc;            }            set            {                wordDoc = value;            }        }               public void CreateNewDocument(string filePath)        {                       killWinWordProcess();            wordApp = new ApplicationClass();            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;            wordApp.Visible = false;            object missing = System.Reflection.Missing.Value;            //String path = Directory.GetParent(Environment.CurrentDirectory).Parent.FullName.ToString();            string TempTemplateFile = Session.EvenDir + @"/WordTemplate/Temp.doc";              if(File.Exists(TempTemplateFile))            {                File.Delete(TempTemplateFile);            }             File.Copy(filePath, TempTemplateFile);             object templateName = TempTemplateFile;            wordDoc = wordApp.Documents.Open(ref templateName, ref missing,                ref missing, ref missing, ref missing, ref missing, ref missing,                ref missing, ref missing, ref missing, ref missing, ref missing,                ref missing, ref missing, ref missing, ref missing);                   }               public bool SaveDocument(string filePath)        {            bool result = true;            object fileName = filePath;            object format = WdSaveFormat.wdFormatXPS;                     object miss = System.Reflection.Missing.Value;            try            {                wordDoc.SaveAs(ref fileName, ref format, ref miss,                ref miss, ref miss, ref miss, ref miss,                ref miss, ref miss, ref miss, ref miss,                ref miss, ref miss, ref miss, ref miss,                ref miss);            }            catch (Exception e)            {                MessageBox.Show("已经开启一个报表");                result = false;            }                                              //object miss1 = System.Reflection.Missing.Value;                                                        //    ref miss);            object SaveChanges = WdSaveOptions.wdSaveChanges;            object OriginalFormat = WdOriginalFormat.wdOriginalDocumentFormat;            object RouteDocument = false;            wordDoc.Close(ref SaveChanges, ref OriginalFormat, ref RouteDocument);            wordApp.Quit(ref SaveChanges, ref OriginalFormat, ref RouteDocument);            killWinWordProcess();            return result;        }         public bool InsertValue(string bookmark, string value)        {            object bkObj = bookmark;            if (wordApp.ActiveDocument.Bookmarks.Exists(bookmark))            {                wordApp.ActiveDocument.Bookmarks.get_Item(ref bkObj).Select();                wordApp.Selection.TypeText(value);                return true;            }            return false;        }         public void killWinWordProcess()        {            System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("WINWORD");            foreach (System.Diagnostics.Process process in processes)            {                bool b = process.MainWindowTitle == "";                if (process.MainWindowTitle == "")                {                    process.Kill();                }            }        }    }
调用方式为

string filePath = Session.EvenDir + @"/WordTemplate/template.doc";                ReportUtil report = new ReportUtil();                report.CreateNewDocument(filePath);                Dictionary
d = ClassProperty.GetProperties(t); foreach (KeyValuePair
a in d) { report.InsertValue(a.Key, a.Value); } bool b = report.SaveDocument(Session.EvenDir + @"\WordTemplate\report"); if (b) { Process.Start("xpsrchvw.exe", Session.EvenDir + @"\WordTemplate\report.xps"); }
生成xps文件后,调用系统的xps程序,打开该xps文件。

ps:ClassProperty是一个工具,熟悉获取器,通过传人一个泛型类,获取到该类的所有字段的属性和名称,并以hash的方式返回

转载地址:http://yrlbi.baihongyu.com/

你可能感兴趣的文章
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
jQuery性能优化指南
查看>>
Oracle 物化视图
查看>>
Multi-Task Networks With Universe, Group, and Task Feature Learning-阅读笔记
查看>>
A Survey of Zero-Shot Learning: Settings, Methods, and Applications-阅读笔记
查看>>