1. 程式人生 > >記錄一下WPF開發(三)--- 基於Word書籤的XPS報表

記錄一下WPF開發(三)--- 基於Word書籤的XPS報表

製作報表可有很多方案,這裡記錄一種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<String, String> d = ClassProperty.GetProperties(t);
                foreach (KeyValuePair<String, String> 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的方式返回

相關推薦

記錄一下WPF開發--- 基於Word書籤XPS報表

製作報表可有很多方案,這裡記錄一種C#版的報表方案:利用Word做好模板,併為動態內容新增書籤,然後通過程式另存為字尾名為XPS的檔案。為什麼要XPS的報表呢,第一是因為Win7以上的系統都自帶,XP安裝也比較方便,第二報表效果非常好看,還可設定簽名。 Word製作模板,並

基於Html5 Plus + Vue + Mui 移動App開發-文件操作讀取、保存、更新數據

mes das parse 移動 分享 gif ont 包括 ole   實全資訊采用基於Html5 Plus + Vue + Mui 移動App。主要實現功能包括: 實現搜索站點設置 實現搜索關鍵字定義 實現搜索資訊保存、刪除功能。 主界面實現關鍵字搜

基於html5 plus + Mui 移動App開發-食全庫

  食全庫-食品安全知識庫。   食品安全(food safety)指食品無毒、無害,符合應當有的營養要求,對人體健康不造成任何急性、亞急性或者慢性危害。根據倍諾食品安全定義,食品安全是“食物中有毒、有害物質對人體健康影響的公共衛生問題”。食品安全也是一門專門探討在食品加工、儲存、銷售等過程中確保食品衛生及

基於 Django 框架的敏捷 Web 開發

Django模組的部署 在Django中,與工程全域性相關的設定都需要在配置檔案settings.py中新增。筆者使用MySQL作為後臺資料庫,並且已經在MySQL中建立名為django_news的資料庫。則需要在settings.py檔案中的相應位置設定DATABASE_

基於python-flask搭建後臺,HTML+CSS+JSjQuery寫前端的web全棧開發——3.2 普通按鈕點選事件與後臺互動

    在上一篇文章,我們講解了基於外掛實現的上傳圖片到後臺處理,並將處理後得到的結果圖與原圖在前端顯示。    主要idea是將圖片先在後臺進行快取,我們傳回兩張圖片的途徑,在file的done函式中對<img/>標籤的src屬性進行更新。    但是這樣子存在

disconf實踐基於XML的分布式配置文件管理,自動reload

blog exce conf redis 信息 exceptio res pan ram 上一篇介紹了基於xml的非自動reload的分布式配置文件管理,這一篇介紹自動reload的方式(基於disconf實踐二)。 1. 修改RedisConfig.java 1 pa

SpringMVC詳解------基於註解的入門實例

frame hello text 1.0 har ret doc 4.0 進行   前兩篇博客我們講解了基於XML 的入門實例,以及SpringMVC運行的詳細流程。但是我們發現基於 XML 的配置還是比較麻煩的,而且,每個 Handler 類只能有一個方法,在實際開發中肯

weex 項目開發 weex + weex-ui

too set http one exp pos 效果圖 left light github地址:weex-ui https://github.com/alibaba/weex-ui 官網: https://alibaba.github.io/weex-ui/#/cn

數據結構——基於順序存儲結構的線性表

img pro 存儲空間 沒有 順序存儲 聲明 操作符重載 cas turn 數據結構(三)——基於順序存儲結構的線性表 一、基於順序存儲結構的線性表實現 1、順序存儲的定義 線性表的順序存儲結構是用一段地址連續的存儲單元依次存儲線性表中的數據元素。 2、順序存儲

vue+webpack開發

font efault pat port ebp 定義 round obj 文件 上一篇博文講了怎麽使用路由,這次主要講講怎麽編寫一個vue組件 vue定義了一種“單文件組件”後綴為‘.vue’的文件,大概長這樣子: <template> <div&

QtCreator插件開發——QtCreator架構

QtCreator架構QtCreator插件開發(三)——QtCreator架構 一、QtCreator架構簡介 QtCreator的核心就是一個插件加載器,其所有功能都是通過插件實現的。QtCreator架構如下:QtCreator的核心功能由Core Plugin (Core::ICore)實現。插件管理

星雲鏈智能合約開發:運行星雲鏈

星雲鏈智能合約開發 安裝星雲鏈 創世區塊配置 在項目根目錄下的conf/default/genesis.conf,為創世區塊配置文件。 meta { # 每條鏈的唯一標識 # 每個區塊和交易只會屬於一條唯一的鏈,保證安全性 chain_id: 100 } consensus { #

EOS Dapp開發1-基於Docker的開發環境搭建

rbo err 通過命令 plugin cat cti nec docker 反饋 隨著EOS主網的上線,相信基於EOS的Dapp開發會越來越多,查閱了很多資料相關的開發資料都不是很多,只能自己摸索,按照網上僅有的幾篇教程,先git clonehttps://github.

Go語言開發、Go語言內置容器

第一個 支持 指向 ice 美國 p值 索引 叠代 指定大小 Go語言開發(三)、Go語言內置容器 一、Go語言數組 1、Go語言數組簡介 Go語言提供了數組類型的數據結構。數組是具有相同唯一類型的一組已編號且長度固定的數據項序列,類型可以是任意的原始類型例如×××、字符串

React學習及實例開發——用react-router跳轉頁面

con 版本 wid css strong extends fault img doc 本文基於React v16.4.1 初學react,有理解不對的地方,歡迎批評指正^_^ 一、定義路由 1、安裝react-router npm install react-route

linux驅動開發 字符設備驅動框架(自動創建設備節點)

The module __line__ mage fail goto div on() sys 代碼如下 #include <linux/init.h> #include <linux/module.h> #include <linux/ke

基於SSM+Redis+Nginx+FastDFS的部落格網站

上一篇主要介紹了SSM整合以及測試。 這一篇主要介紹登入模組,登入模組用到了過濾器,配置過濾器時需要在web.xml裡面進行配置,相關配置已經在第二篇的web.xml有註明。  本篇涉及的類有:控制層的LoginController、過濾器CheckLoginFilte

一步一步學習Android TV/盒子開發

本文主要說的就是在TV開發中常遇到的問題總結 焦點丟失問題 在使用ListView、GridView及RecyclerView時有時會出現,這時需要在xml中,新增 android:descendantFocusability="afterDescendants" 1

ZigBee協議棧開發

1、cc2530在正常執行時需要一個高頻時鐘訊號和一個低頻時鐘訊號,高頻時鐘訊號主要供給CPU,保證程式的執行。低頻時鐘訊號主要供給看門狗、睡眠定時器等片上外設。 高頻時鐘訊號的來源:晶片內部的16M RC電路和外接的32M石英晶振; 低頻時鐘訊號的來源:晶片內部的32K RC電路和外接的32.

C#微信公眾號開發 -- 使用者關注之後自動回覆

通過了上一篇文章之後的微信開發者驗證之後,我們就可以做微信公眾號的程式碼開發了。 當我們點選關注某個公眾號的時候,有時候會發現他會自動給我們回覆一條訊息,比如歡迎關注XXX公眾號。這個功能其實是在點選關注的時候,使用者觸發了微信定義的事件,同時微信會返回給我們一個XML資料包,微信官方的解釋如下: 推送X