又来啦,又要说偷懒的主张了。在实际的项目中,资料的导入导出是经常能遇的到的,到底有没有办法可以做成动态的呢? 开发人员开发出来后,剩下的可以将由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="员工帐号" primaryKey="true" canNull="false" dbType="Char" length="20"/><field name="MODNAME" mapping="模组" canNull="false" dbType="NChar" length="255"/><field name="CANREAD" mapping="只读" dbType="Bit" defaultValue="0" replace="是,1|否,0|是,TRUE|否,FALSE"/><field name="CANINS" mapping="新增" dbType="Bit" defaultValue="0" replace="是,1|否,0|是,TRUE|否,FALSE"/><field name="CANUPD" mapping="修改" dbType="Bit" defaultValue="0" replace="是,1|否,0|是,TRUE|否,FALSE"/><field name="CANDEL" mapping="删除" dbType="Bit" defaultValue="0" replace="是,1|否,0|是,TRUE|否,FALSE"/>        </fields></file></Target>
</EAI>

大家一看,相信也不难理解。后续如果用户还需要导出其它数据,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{// Fieldsprivate 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;\" οnclick=\"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\" οnclick=\"btnSaveClick()\"/></div>";private const string btnShowSearch = "<div style=\"height:25px\"><input type=\"button\" name=\"btnSearch\" id=\"btnSearch\" value=\"搜索\" class=\"SUB-BUTTON\" style=\"visibility:visible;\" οnclick=\"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;// Methodsprotected 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;\" οnclick=\"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;\" οnclick=\"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\" οnclick=\"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>;}foreach (string str3 in this.dicMap.Keys)  //保存按钮时,所有的选项均为不可以选
                {if (this.dicChkSel.ContainsKey(str3.ToString())){builder.Append(string.Format("<li style=\"height:22px\"><input type=\"checkbox\" name=\"{0}\" id=\"{0}\" checked=\"checked\" disabled=\"true\"/><label for=\"{0}\" class=\"font-12\">{1}</label></li>", str3.ToString(), this.dicMap[str3.ToString()]));}else{builder.Append(string.Format("<li style=\"height:22px\"><input type=\"checkbox\" name=\"{0}\" id=\"{0}\" disabled=\"true\"/><label for=\"{0}\" class=\"font-12\">{1}</label></li>", str3.ToString(), this.dicMap[str3.ToString()]));}}}builder.Append("</ul></div>");//this.Page.RegisterClientScriptBlock("createControl", builder.ToString());this.ClientScript.RegisterClientScriptBlock(this.GetType(), "createControl", builder.ToString());}protected string ExecAction(string whereCase, string loadXml, Dictionary<string, string> excludeDic){ExportSearch search = new ExportSearch(whereCase, loadXml, excludeDic, new RowFilterDictionary(this.tField, this.jTable, this.jField, this.compareKey, this.compareValue, this.equalKey, this.equalValue).RowFilterList);string importExcelDataTable = search.GetImportExcelDataTable();this.Session["OutputFileName"] = search.Name;return importExcelDataTable;}protected void Page_Load(object sender, EventArgs e){ // 其它通过网页前台实现。// base.Request.Form["ThisFormJustForSelectFields"] 这个是网页前台提交的值this.Page.Title =  "XXX Crop : " + this.Page.Title;this.SetContextTitle();if ((base.Request.Form["ThisFormJustForSelectFields"] == null) && (this.Session["SelectFieldsToExportPath"] == null)){   //1. 第一次生成搜索网页this.loadXml = (base.Request.QueryString["loadXml"] == null) ? "" : base.Request.QueryString["loadXml"];this.BuildPage(BtnType.Search);}else if ((base.Request.Form["ThisFormJustForSelectFields"] != null) && (this.Session["SelectFieldsToExportPath"] != null)){   //4.下载所需要的文件string path = base.Server.MapPath("~/export/" + HttpContext.Current.User.Identity.Name + this.Session["SelectFieldsToExportPath"].ToString() + ".xls");if (File.Exists(path)){FileInfo info = new FileInfo(path);base.Response.ClearHeaders();base.Response.ClearContent();base.Response.ContentType = "APPLICATION/OCTET-STREAM";base.Response.AppendHeader("Content-Disposition", string.Format("Attachment; Filename=\"{0}\"", this.Session["SelectFieldsToExportPath"].ToString() + ".xls"));base.Response.AppendHeader("Content-Length", info.Length.ToString());base.Response.Flush();base.Response.WriteFile(info.FullName);this.Session["selectCheckList"] = null;this.Session["SelectFieldsToExportPath"] = null;base.Response.End();}}else if ((base.Request.Form["ThisFormJustForSelectFields"] == null) && (this.Session["SelectFieldsToExportPath"] != null)){   //3.生成保存网页,供用户可以下载生成的表格this.loadXml = (base.Request.QueryString["loadXml"] == null) ? "" : base.Request.QueryString["loadXml"];this.BuildPage(BtnType.Save);//this.Page.RegisterClientScriptBlock("showSaveMsg", "\r\n  <script type='text/javascript'>$('loadPic').innerHTML='文件已下载,请保存!';\r\n            $('loadPic').style.display = 'block'; $('hideSearch').style.display='none';\r\n            </script>");this.ClientScript.RegisterClientScriptBlock(this.GetType(), "showSaveMsg", "\r\n <script type='text/javascript'>$('loadPic').innerHTML='文件已下载,请保存!';\r\n   $('loadPic').style.display = 'block'; $('hideSearch').style.display='none';\r\n  </script>");}else{   //2.按照选择的字段生成文件,同时再跳转回目前网页 转到第3步this.loadXml = (base.Request.QueryString["loadXml"] == null) ? "" : base.Request.QueryString["loadXml"];this.whereCase = (this.Session["SearchSqlString"] == null) ? "" : this.Session["SearchSqlString"].ToString();this.tField = (base.Request.QueryString["tField"] == null) ? "" : base.Request.QueryString["tField"].ToString();this.jTable = (base.Request.QueryString["jTable"] == null) ? "" : base.Request.QueryString["jTable"].ToString();this.jField = (base.Request.QueryString["jField"] == null) ? "" : base.Request.QueryString["jField"].ToString();this.compareKey = (base.Request.QueryString["compareKey"] == null) ? "" : base.Request.QueryString["compareKey"].ToString();this.compareValue = "";// base.userpositionid;this.equalKey = (base.Request.QueryString["equalKey"] == null) ? "" : base.Request.QueryString["equalKey"].ToString();this.equalValue = base.userinfo.Trim().ToLower();this.xmlFieldsToTable = new XmlFieldsToTable(base.Server.MapPath("~/XmlMapping/" + this.loadXml + ".xml"), SelXmlNodeMode.TargetNode, SelXmlNodeInfo.MappingOnly);this.dicMap = this.xmlFieldsToTable.DicMap;foreach (string str2 in base.Request.Form.AllKeys){if (this.dicMap.ContainsKey(str2)){this.dicMap.Remove(str2);this.dicChkSel.Add(str2, "");}}this.Session["selectCheckList"] = this.dicChkSel;StringBuilder builder = new StringBuilder();builder.Append(this.ExecAction(this.whereCase, this.loadXml, this.dicMap));base.DeleteTemp();this.Session["SelectFieldsToExportPath"] = DateTime.Now.Ticks.ToString();FileStream stream = new FileStream(base.Server.MapPath("~/export/" + HttpContext.Current.User.Identity.Name + this.Session["SelectFieldsToExportPath"].ToString() + ".xls"), FileMode.Create);StreamWriter writer = new StreamWriter(stream, Encoding.Unicode);writer.Write(builder.ToString());writer.Flush();writer.Close();stream.Close();HttpContext.Current.Response.Redirect(HttpContext.Current.Request.Url.ToString());}}protected void SetContextTitle(){if (this.Session["ExportContextTitle"] == null){this.Label3.Text = "员工权限表"; //员工基本资料
            }else{this.Label3.Text = this.Session["ExportContextTitle"].ToString();}}// Nested Typesprotected enum BtnType{Search,Save}}}

View Code

转载于:https://www.cnblogs.com/Geton/p/4171431.html

动态资料导出导入平台(一)相关推荐

  1. C++静态库和动态库的导入导出

    文章目录 一.静态库的导入和导出 1.导出静态库 2.导入静态库 二.动态库的导入和导出(函数) 1.导出动态库(函数) 2.导入动态库(函数) 三.动态库的导入和导出(类) 1.导出动态库(类) 2 ...

  2. 【DB宝50】Oracle异构平台迁移之完全可传输导出导入(Full Transportable Export Import)

    文章目录 一.简介 1.1.使用场景 1.2.限制条件 二.完全可传输操作步骤 三.案例演示 3.1.环境 3.2.源库操作 3.2.1.将需要传输的用户表空间设置为RO状态 3.2.2.使用Data ...

  3. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)

    <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...

  4. C++ 动态库导出函数名“乱码”及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef ...

  5. BCP导出导入大容量数据实践

    前言 SQL SERVER提供多种不同的数据导出导入的工具,也可以编写SQL脚本,使用存储过程,生成所需的数据文件,甚至可以生成包含SQL语句和数据的脚本文 件.各有优缺点,以适用不同的需求.下面介绍 ...

  6. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)

    转载自:http://www.cnblogs.com/jyzhao/p/4530575.html 目的:指导项目侧自行进行简单的数据泵迁移工作. 本文实验环境:Oracle 11.2.0.4,利用数据 ...

  7. Oracle exp/imp导出导入命令及数据库备份

    Oracle exp/imp导出导入命令及数据库备份 Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令 ...

  8. nodejs导出导入_NodeJS导出和导入模块

    nodejs导出导入 In my previous posts, we have discussed about "How to install Enide Studio 2014 IDE& ...

  9. C++ 动态库导出函数名乱码及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef ...

最新文章

  1. Spring系列之一 Spring MVC
  2. weblogic启动方法
  3. 5G NR中的两套绝对频域位置:GSCN和ARFCN
  4. Python定时任务调度——APScheduler
  5. django项目的创建与启动
  6. CLR via C# 3 读书笔记(4):第1章 CLR执行模型 — 1.4 执行程序集代码
  7. Windows Internet Explorer 8 for Windows Vista 和 Windows Server 2008
  8. Android开发笔记(成长轨迹)
  9. 知名厂商设备图标库大全
  10. 麦克风阵列入门(一)
  11. 计算机服务添加打印机服务,无法添加打印机报错后台程序服务没有运行的解决方法...
  12. android实现天气预报App(0)
  13. 固定linux虚拟机ip地址,虚拟机下linux 系统网卡配置、固定IP地址
  14. Kibana启动常见报错信息的解决方案
  15. android如何拨打电话
  16. 小米球ngrok 给你惊喜
  17. Ubuntu Fcitx 繁简输入切换
  18. 服务器在机柜中的安装位置,服务器上机柜的安装方法
  19. Spring Cloud Gateway +Oauth2 +JWT+Vue 实现前后端分离RBAC权限管理
  20. Python入门(二)——IDE选择PyCharm,输入和输出,基础规范,数据类型和变量,常量,字符串和编码,格式化

热门文章

  1. 9-分析事物问题并编写 Utils 文件
  2. 度量.net framework 迁移到.net core的工作量(转)
  3. 启动与关闭WebService
  4. 物理综合:关于UDSM后端设计总结
  5. python控制gpio的一段代码抄的
  6. 【树】Kth Smallest Element in a BST(递归)
  7. win7下简单FTP服务器搭建
  8. 如何高效的使用vim
  9. Scrum敏捷开发沉思录
  10. 基于Spring cloud Ribbon和Eureka实现客户端负载均衡