又來啦,又要說偷懶的主張了。在實際的項目中,資料的導入導出是經常能遇的到的,到底有沒有辦法可以做成動態的呢? 開發人員開發出來后,剩下的可以將由HELPDESK組去維護,后續如果還要增加類似的功能,HELPDESK組人員就自己可以去處理,而我們開發人員可以不用處理,節省一些不必要的時間,或者可以花更多的時間到某件事情上,而不必受過多的打擾呢。答案是有的,接下我們先講一下導出的實現,導出在這里相對簡單一點。導入將放到后面的隨筆。這里的導入導出與網上大多數人的ExcelHelper或者COM形式的導出還是有比較大的區別。
動態,所謂的動態,就是很容易的就實現數據源的切換,還有某數據源其中的一部分數據。這里我們主要用到EAI接口,按指定格式導入書寫xml,然后讀取這個XML以獲得動態的數所輸出。實現起來也不會太難。
1.前臺頁面設計。

從別的畫面到跳出這個導出面面,只需要指定相應的XML
function btn_ExUR() { window.open('/ImportAndExport/SelectFields.aspx?loadXml=UserRightMapping', 'ExportSelFields', 'top=' + (screen.height - 525) / 2 + ', left=' + (screen.width - 820) / 2 + ', width=820, height=525, toolbar=no, menubar=no, scrollbar=no, resizable=no, location=no, status=no') }運行后按XML動態產生字段。
然后用戶可以動態選擇所需要的導出字段。

導出結果如下

下面大家看一下XML到底是如何構成的。
<?xml version="1.0" encoding="utf-8" ?><EAI xmlns="urn:mapping-schema" from="SqlServerDataBase" to="ExcelFile"> <Source> <table name="CENTRAL_USERIGHT" dataSourceName="SqlServer" handType="EAI.DataBaseHandler.SqlServerExport"> <fields> <field name="SUSER" mapping="員工帳號" dbType="Char"/> <field name="MODNAME" mapping="模組" dbType="Char"/> <field name="CANREAD" mapping="只讀" dbType="Bit"/> <field name="CANINS" mapping="新增" dbType="Bit"/> <field name="CANUPD" mapping="修改" dbType="Bit"/> <field name="CANDEL" mapping="刪除" dbType="Bit"/> </fields> </table> </Source> <Target> <file range="A2" dataSourceName="Test.xls" name="Sheet1" titleLine="1" autoGenColumnTitle="false" handType="EAI.FileHandler.ExcelImport"> <fields> <field name="SUSER" mapping="員工帳號"大家一看,相信也不難理解。后續如果用戶還需要導出其它數據,HELPDESK人員可以按XML做一個類似的文檔,同時在前臺寫個按鈕直接把XML參數傳給這個SelectFields頁面就可以了。開發人員不需再管任何事情。
下面把SelectFields頁面的后臺代碼也帖出。如果有人想要EAI的動態庫的話,可以留下郵箱。如果方便,順便給個贊唄。
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.sessionState;using System.Web.Profile;using System.Text;using System.IO;namespace WebApp.ImportAndExport{ public partial class SelectFields : WebBase, IRequiresSessionState { // Fields private const string btnHideSearch = "<div id='hideSearch' style=/"height:25px; position:absolute; z-index:-20px;/"><input type=/"button/" name=/"btnSearch/" id=/"btnSearch/" value=/"搜索/" class=/"SUB-BUTTON/" style=/"visibility:hidden;/" onclick=/"btnSearchClick()/"/></div>"; private const string btnShowSave = "<div id='showSave' style=/"height:25px;/"><input type=/"button/" name=/"btnSave/" id=/"btnSave/" value=/"保存/" class=/"SUB-BUTTON/" style=/"visibility:visible; background-color:#54bd24; color:#FFFFFF; font-weight:bold/" onclick=/"btnSaveClick()/"/></div>"; private const string btnShowSearch = "<div style=/"height:25px/"><input type=/"button/" name=/"btnSearch/" id=/"btnSearch/" value=/"搜索/" class=/"SUB-BUTTON/" style=/"visibility:visible;/" onclick=/"btnSearchClick()/"/></div>"; private string compareKey; private string compareValue; private Dictionary<string, string> dicChkSel = new Dictionary<string, string>(); private Dictionary<string, string> dicMap; private const string disabledCheckBox = "<li style=/"height:22px/"><input type=/"checkbox/" name=/"{0}/" id=/"{0}/" checked=/"checked/" disabled=/"true/"/><label for=/"{0}/" class=/"font-12/">{1}</label></li>"; private const string enabledCheckBox = "<li style=/"height:22px/"><input type=/"checkbox/" name=/"{0}/" id=/"{0}/" checked=/"checked/"/><label for=/"{0}/" class=/"font-12/">{1}</label></li>"; private string equalKey; private string equalValue; private string jField; private string jTable; private string loadXml; private string tField; private const string unselDisabledCheckBox = "<li style=/"height:22px/"><input type=/"checkbox/" name=/"{0}/" id=/"{0}/" disabled=/"true/"/><label for=/"{0}/" class=/"font-12/">{1}</label></li>"; private string whereCase; private XmlFieldsToTable xmlFieldsToTable; // Methods protected void BuildPage(BtnType btnType) { string str = " <div id=/"loadPic/" class=/"font-12/" style=/"display:none; color:#336699; float:left; width: 500px;/"><img src=/"../images/connecting.gif/" style=/"width: 140px; height: 13px/" />。下載中。</div>"; StringBuilder builder = new StringBuilder(); if (btnType == BtnType.Search) { builder.Append("<div style=/"height:25px/"><input type=/"button/" name=/"btnSearch/" id=/"btnSearch/" value=/"搜索/" class=/"SUB-BUTTON/" style=/"visibility:visible;/" onclick=/"btnSearchClick()/"/></div>"); builder.Append(str); } else { builder.Append("<div id='hideSearch' style=/"height:25px; position:absolute; z-index:-20px;/"><input type=/"button/" name=/"btnSearch/" id=/"btnSearch/" value=/"搜索/" class=/"SUB-BUTTON/" style=/"visibility:hidden;/" onclick=/"btnSearchClick()/"/></div>"); builder.Append("<div id='showSave' style=/"height:25px;/"><input type=/"button/" name=/"btnSave/" id=/"btnSave/" value=/"保存/" class=/"SUB-BUTTON/" style=/"visibility:visible; background-color:#54bd24; color:#FFFFFF; font-weight:bold/" onclick=/"btnSaveClick()/"/></div>"); builder.Append(str); } builder.Append("<div style=/"margin:0px 0px 0px 0px; background-color:#EFEFEF/"><ul>"); this.xmlFieldsToTable = new XmlFieldsToTable(base.Server.MapPath("~/XmlMapping/" + this.loadXml + ".xml"), SelXmlNodeMode.TargetNode, SelXmlNodeInfo.MappingOnly); this.dicMap = this.xmlFieldsToTable.DicMap; if (btnType == BtnType.Search) { foreach (string str2 in this.dicMap.Keys) { builder.Append(string.Format("<li style=/"height:22px/"><input type=/"checkbox/" name=/"{0}/" id=/"{0}/" checked=/"checked/"/><label for=/"{0}/" class=/"font-12/">{1}</label></li>", str2.ToString(), this.dicMap[str2.ToString()])); } } else { if (this.Session["selectCheckList"] != null) { this.dicChkSel = this.Session["selectCheckList"] as Dictionary<string, string>;
新聞熱點
疑難解答