背景:
临时提供一个简单的网页,供其他人浏览数据库(Oracel、MSSQL)的某些数据,并导出Excel。
支持在配置文件中随时添加或修改sql。

实现:
把sql语句等信息保存一个xml文件中,前端页面提供一个下拉框,可以选择不同类型的sql语句,查询结果(暂没分页需要)直接绑定到GridView。

开发环境:VS2015
NuGet引入库:NPOI、Oracle.ManagedDataAccess.Client

一、VS目录

├─App_Code
│ DataBase.cs ---------数据库连接类
│ ExcelHelper.cs ---------导出Excel工具类
│ SqlEntity.cs ---------sql语句的实体类
│ SqlEntityList.cs---------把sql.xml转化为实体类

├─App_Data
│ sql.xml ---------sql语句

│ rpt.aspx ---------前端查询页面
│ rpt.aspx.cs ---------
│ Web.config ---------配置数据库连接信息

二、代码
1、Web.config

  <connectionStrings>
<add name="OracleString" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=testdb)));Persist Security Info=True;User ID=dev;Password=123456" providerName="Oracle.ManagedDataAccess.Client"/>
<add name="SqlServerString" connectionString="user id=sa; password=123456; database=test; server=localhost" providerName="System.Data.SqlClient"/>
</connectionStrings>

数据库连接字符串

2、DataBase.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Configuration; /// <summary>
/// DataBase 的摘要说明
/// </summary>
public class DataBase
{
private DbConnection cnn;//抽象类型
private DbCommand cmd;//抽象类型
private DbProviderFactory provider;
private string providerName; public DataBase(String connectionName)
{
providerName = WebConfigurationManager.ConnectionStrings[connectionName].ProviderName;
provider = DbProviderFactories.GetFactory(providerName);
cnn = provider.CreateConnection();
cnn.ConnectionString = WebConfigurationManager.ConnectionStrings[connectionName].ConnectionString;
cmd = provider.CreateCommand();
cmd.Connection = cnn;
}
#region 执行不带参数的SQL语句
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
public int ExecuteSQL(string sql)
{
return ExecuteSQL(sql, null);
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
public int ExecuteSqlTran(List<string> sqlList)
{
int count = -;
cnn.Open();
DbTransaction tx = cnn.BeginTransaction();
try
{
cmd.Transaction = tx;
for (int n = ; n < sqlList.Count; n++)
{
string strsql = sqlList[n].ToString();
if (strsql.Trim().Length > )
{
cmd.CommandText = strsql;
count = cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch (SqlException e)
{
tx.Rollback();
cnn.Close();
throw new Exception(e.Message);
}
return count;
} /// <summary>
/// 执行一条计算查询结果语句,返回查询结果(object)。
/// </summary>
public int ExecuteScalar(string sql)
{
return ExecuteScalar(sql, null);
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
public DataSet GetDataSet(string sql)
{
return GetDataSet(sql, null);
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
public DataTable GetDataTable(string sql)
{
return GetDataSet(sql).Tables[];
}
/// <summary>
/// 执行查询语句,返回DataReader(使用该方法切记要手工关闭DataReader和连接)
/// </summary>
public DbDataReader ExecuteReader(string sql)
{
return ExecuteReader(sql, null);
}
#endregion #region 执行带参数的SQL语句
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
public int ExecuteSQL(string sql, params DbParameter[] cmdParms)
{
try
{
CreateCommand(sql, cmdParms);
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (SqlException e)
{
cnn.Close();
throw new Exception(e.Message);
}
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
public int ExecuteSqlTran(Hashtable sqlList)
{
int count = -;
cnn.Open();
DbTransaction tx = cnn.BeginTransaction();
try
{
cmd.Transaction = tx;
foreach (DictionaryEntry myDE in sqlList)
{
string cmdText = myDE.Key.ToString();
DbParameter[] cmdParms = (DbParameter[])myDE.Value;
CreateCommand(cmdText, cmdParms);
count = cmd.ExecuteNonQuery();
}
tx.Commit();
}
catch (SqlException e)
{
tx.Rollback();
cnn.Close();
throw new Exception(e.Message);
}
return count;
} /// <summary>
/// 执行一条计算查询结果语句,返回查询结果(object)。
/// </summary>
public int ExecuteScalar(string sql, params DbParameter[] cmdParms)
{
try
{
CreateCommand(sql, cmdParms);
object o = cmd.ExecuteScalar();
return int.Parse(o.ToString());
}
catch (SqlException e)
{
cnn.Close();
throw new Exception(e.Message);
}
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
public DataSet GetDataSet(string sql, params DbParameter[] cmdParms)
{
DataSet ds = new DataSet();
try
{
CreateCommand(sql, cmdParms);
DbDataAdapter adapter = provider.CreateDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(ds);
}
catch (SqlException e)
{
cnn.Close();
throw new Exception(e.Message);
}
return ds;
}
/// <summary>
/// 执行查询语句,返回DataTable
/// </summary>
public DataTable GetDataTable(string sql, params DbParameter[] cmdParms)
{
return GetDataSet(sql, cmdParms).Tables[];
}
/// <summary>
/// 执行查询语句,返回DataReader(使用该方法切记要手工关闭DataReader和连接)
/// </summary>
public DbDataReader ExecuteReader(string sql, params DbParameter[] cmdParms)
{
try
{
CreateCommand(sql, cmdParms);
DbDataReader myReader = cmd.ExecuteReader();
return myReader;
}
catch (SqlException e)
{
cnn.Close();
throw new Exception(e.Message);
}
}
public DbParameter MakeParam(string ParamName, DbType DbType, Int32 Size, object Value)
{
DbParameter Param = cmd.CreateParameter();
Param.ParameterName = ParamName;
Param.DbType = DbType;
if (Size > )
Param.Size = Size;
if (Value != null)
Param.Value = Value;
return Param;
}
private DbCommand CreateCommand(string cmdText, DbParameter[] Prams)
{
return CreateCommand(CommandType.Text, cmdText, Prams);
}
private DbCommand CreateCommand(CommandType cmdType, string cmdText, DbParameter[] Prams)
{
if (cnn.State != ConnectionState.Open)
cnn.Open();
cmd.CommandType = cmdType;
cmd.CommandText = cmdText;
if (Prams != null)
{
cmd.Parameters.Clear();
foreach (DbParameter Parameter in Prams)
cmd.Parameters.Add(Parameter);
}
return cmd;
}
public DataSet GetDataSetByProc(string ProcName, DbParameter[] Params)
{
cnn.Open();
DbCommand cmd = CreateCommand(CommandType.StoredProcedure, ProcName, Params);
DbDataAdapter adapter = provider.CreateDataAdapter();
adapter.SelectCommand = cmd;
DataSet ds = new DataSet();
adapter.Fill(ds);
cnn.Close();
return ds;
}
#endregion
}

数据库连接类

3、ExcelHelper.cs

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Web; /// <summary>
/// ExcelHelper 的摘要说明
/// </summary>
public class ExcelHelper
{
public static void ExportXlsx(DataTable dt, string strFileName)
{
HttpContext curContext = HttpContext.Current;
MemoryStream ms = ExportXlsx(dt);
curContext.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8) + ".xlsx");
curContext.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.BinaryWrite(ms.ToArray());
ms.Close();
ms.Dispose();
curContext.Response.End(); }
private static MemoryStream ExportXlsx(DataTable dt)
{
XSSFWorkbook workbook = new XSSFWorkbook();
ISheet sheet = null; int headRowIndex = ;
string sheetName = "Sheet1";
if (!string.IsNullOrEmpty(dt.TableName))
{
sheetName = dt.TableName;
}
sheet = workbook.CreateSheet(sheetName);
int rowIndex = ; XSSFRow headerRow = (XSSFRow)sheet.CreateRow(headRowIndex); ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = HorizontalAlignment.Center;
IFont font = workbook.CreateFont();
font.FontHeightInPoints = ;
font.Boldweight = ;
headStyle.SetFont(font); foreach (DataColumn column in dt.Columns)
{
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
} foreach (DataRow row in dt.Rows)
{
rowIndex++;
XSSFRow dataRow = (XSSFRow)sheet.CreateRow(rowIndex);
foreach (DataColumn column in dt.Columns)
{
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
}
} MemoryStream ms = new MemoryStream();
workbook.Write(ms);
ms.Flush(); return ms;
}
}

导出Excel工具类

4、sql.xml

<?xml version="1.0" encoding="utf-8" ?>
<sql>
<item id="1" text="报表1" dbConnName="OracleString">
select * from tb
</item>
<item id="2" text="报表2" dbConnName="SqlServerString">
select * from tb
</item>
</sql>

保存sql语句等信息的xml

5、SqlEntity.cs

public class SqlEntity
{
public SqlEntity()
{
}
public int Id { get; set; }
public string text { get; set; }
public string sql { get; set; }
public string dbConnName { get; set; }
}

实体类

6、SqlEntityList.cs

public class SqlEntityList
{
public List<SqlEntity> GetXmlData(String xmlPath)
{
var list = new List<SqlEntity>();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlPath);
XmlNodeList xnl = xmlDoc.SelectSingleNode("sql").ChildNodes;
for (int i = ; i < xnl.Count; i++)
{
int id = int.Parse(xnl.Item(i).Attributes["id"].Value);
string text = xnl.Item(i).Attributes["text"].Value;
string dbConnName = xnl.Item(i).Attributes["dbConnName"].Value;
string sql = xnl.Item(i).InnerText; var model = new SqlEntity()
{
Id = id,
text = text,
dbConnName = dbConnName.ToLower(),
sql = sql
};
list.Add(model);
}
return list;
} }

xml内容转实体

7、rpt.aspx

        <div>
<asp:DropDownList ID="ddlType" DataTextField="text" DataValueField="id" runat="server">
</asp:DropDownList>
<asp:Button runat="server" ID="btnQuery" Text="查询" OnClick="btnQuery_Click"/>
<asp:Literal runat="server" ID="ltlInfo"></asp:Literal>
<asp:Button runat="server" ID="btnExport" Text="导出" OnClick="btnExport_Click" />
</div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" Width="100%"></asp:GridView>

前端页

8、rpt.aspx.cs

    protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlType.DataSource = getSqlList();
ddlType.DataBind();
}
} private List<SqlEntity> getSqlList()
{
String path = Server.MapPath("~/App_Data/sql.xml");
SqlEntityList sqlEntityList = new SqlEntityList();
List<SqlEntity> list = sqlEntityList.GetXmlData(path);
return list;
} private DataSet getDataSet(int type)
{
DataSet ds = new DataSet();
List <SqlEntity> list = getSqlList();
var m = list.FirstOrDefault(t => t.Id == type);
DataBase db = new DataBase(m.dbConnName);
ds = db.GetDataSet(m.sql);
ltlInfo.Text = "记录数:" + ds.Tables[].Rows.Count.ToString();
return ds;
} private void BindData(DataSet ds)
{
GridView1.DataSource = ds;
GridView1.DataBind();
} protected void btnQuery_Click(object sender, EventArgs e)
{
int type = int.Parse(ddlType.SelectedValue);
DataSet ds = getDataSet(type);
BindData(ds);
} protected void btnExport_Click(object sender, EventArgs e)
{
int type = int.Parse(ddlType.SelectedValue);
DataSet ds = getDataSet(type);
DataTable dt = ds.Tables[];
String fileName = ddlType.SelectedItem.Text;
ExcelHelper.ExportXlsx(dt, fileName);
}

前端页的后台代码

.net实现一个简单的通用查询数据、导出Excel的网页的更多相关文章

  1. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  2. 数据导出Excel,动态列

    今天碰到一个需求,要求将用户回答的问卷及问题导出Excel表格,问卷对应的问题数量不一致,需要动态添加列表头,简单记录. 要导出Excel需要添加poi.jar包 用户-问卷实体(固定列): pack ...

  3. 百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?

    好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系 ...

  4. 【asp.net】将GridView数据导出Excel

    概要: 中午睡了一会,醒来的时候看到老师叫我去办公室,需求是这样的,把excel表中的每个同学,判断图片目录中是否有对应的照片(图片的名字用的学号或身份证号码) 没有对应图片的学生记录,存入自己的数据 ...

  5. 写一个通用的List集合导出excel的通用方法

    前几天要做一个数据导出Excel 我就打算写一个通用的. 这样一来用的时候也方便,数据主要是通过Orm取的List.这样写一个通用的刚好. public static void ListToExcel ...

  6. JavaScript 上万条数据 导出Excel文件(改装版)

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  7. JavaScript 上万条数据 导出Excel文件 页面卡死

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  8. 将页面中表格数据导出excel格式的文件(vue)

    近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...

  9. PHP将数据导出Excel表中(投机型)

    1.简介 如何利用最简单粗糙暴力的方法将数据写入Excel文件中呢? 因为ms word和excel的文档都支持html文本格式,因此我们可以基于这个原理采用html文本格式进行数据的输出. 在htm ...

随机推荐

  1. ProjectServer2010升级到ProjectServer2016,Sharepoint2010升级到Sharepoint2016第三章

    继续上一章,转换了身份认证模式后继续将WSS_Content备份还原到2016数据库服务器上升级,发现还是报错,报错截图如下: 查看日志,提到某些网站集还体验还是2010的,需要升级,可是我明明升级了 ...

  2. mysql不等于判断时,空值过滤问题

    产生根源 比如我们有三条数据,对应的列名是delete_flag,对应的数据是'normal','delete',null. 此时我们查所有不等于delete的记录,我们期望的是两条记录 normal ...

  3. MySql 更新死锁问题 Deadlock found when trying to get lock; try restarting transaction

    文章导航-readme MySql 更新死锁问题 Deadlock found when trying to get lock; try restarting transaction 1.场景 //t ...

  4. Consul初探-服务注册和发现

    前言 经过上一篇的学习,现在已经来到了服务注册发现环节:Consul 的核心功能就是服务注册和发现,Consul 客户端通过将自己注册到 Consul 服务器集群,然后等待调用方去发现服务,实现代理转 ...

  5. dedecmsV5.7 后台上传m4a的音频之后不展示

    问题:dedecmsV5.7 在后台上传了m4a的音频文件(如何添加m4a的音频格式,更改系统-系统基本配置-附件设置)之后,列表里不展示,如图: 解决方案: 打开include/dialog/sel ...

  6. python浅见 (Python 3000)

    1.该版本不考虑向下兼容 2.下载地址: https://www.python.org/downloads/source/ # tar -zxvf Python-3.6.1.tgz # cd Pyth ...

  7. 【转载】解决:'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    注:网上能搜到的常规解决办法我都试了不好用,这个是最快的解决办法. 以下是转载的解决办法: ****************************************************** ...

  8. Java的反射机理

    Java反射是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的全部属性和方法等,调用方法以及访问属性,而且不需要提前在编译期知道运行的对象是什么 ...

  9. Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】

    Help Hanzo (LightOJ - 1197) [简单数论][筛区间质数] 标签: 入门讲座题解 数论 题目描述 Amakusa, the evil spiritual leader has ...

  10. shell中字典的一个用法示例

    1. shell中字典的用法示例, 数组用法同字典 2. 以上使用sell配合字典实现的功能, 使用awk能轻松搞定, 如下: awk '{print $2}' file.txt | sort | u ...