https://files.cnblogs.com/files/liuchenxing/jquery.table2excel.js
用jquery-table2excel,进行导出excel
jquery-table2excel是一款可以将HTML表格的内容导出到微软Excel电子表格中的jQuery插件。该插件可以根据你的需要导出表格中的内容,不需要的行可以不导出。 它文件体积小,使用非常方便。
1、写好前端的按钮,还需要一个table(要导出的内容存放处)。
<input type="button" value="导出" class="Button" onclick="Export();" /> <table id='exceltable'><td>内容内容内容</td></table>
2、初始化js
function Export(){ $("#exceltable").table2excel({ //exceltable为存放数据的table // 不被导出的表格行的CSS class类 exclude: ".noExl", // 导出的Excel文档的名称 name: "表格-" + new Date().getTime(), // Excel文件的名称 filename: "表格-" + new Date().getTime() + ".xls", bootstrap: false }); }
//table2excel插件的可用配置参数有:
//exclude:不被导出的表格行的CSS class类。
//name:导出的Excel文档的名称。
//filename:Excel文件的名称。
//exclude_img:是否导出图片。
//exclude_links:是否导出超链接
//exclude_inputs:是否导出输入框中的内容。
var json = { contry:{ area:{ man:"12万", women:"10万" } } };
//方式一:使用eval解析
var obj = eval(json);
alert(obj.constructor);
alert(obj.contry.area.women);
//方式二:使用Funtion函数
var strJSON = "{name:'json name'}";//得到的JSON
var obj = new Function("return" + strJSON)();//转换后的JSON对象
alert(obj.name);//json name
alert(obj.constructor);
//复杂一点的json数组数据的解析
var value1 = [{"c01":"1","c02":"2","c03":"3","c04":"4","c05":"5","c06":"6","c07":"7","c08":"8","c09":"9"},
{"c01":"2","c02":"4","c03":"5","c04":"2","c05":"8","c06":"11","c07":"21","c08":"1","c09":"12"},
{"c01":"5","c02":"1","c03":"4","c04":"11","c05":"9","c06":"8","c07":"1","c08":"8","c09":"2"}];
var obj1 = eval(value1);
alert(obj1[0].c01);
//复杂一点的json的另一种形式
var value2 = {"list":[ {"password":"1230","username":"coolcooldool"}, {"password":"thisis2","username":"okokok"}],
"array":[{"password":"1230","username":"coolcooldool"},{"password":"thisis2","username":"okokok"}]};
var obj2 = eval(value2);
alert(obj2.list[0].password);
bootstrap-table-editable.js
首先来看看bootstrap-table-editable.js这个文件
这个js其实是对x-editable做了一个简单的封装,增加了列的editable属性以及编辑保存后的一些事件。有了这个作为基础,于是我们行内编辑的代码变成了这样。
需要引用的文件如下:
<link href="/Content/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<link href="~/Content/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet" />
<link href="/Content/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" />
<script src="/Scripts/jquery-1.9.1.min.js"></script>
<script src="/Content/bootstrap/js/bootstrap.min.js"></script>
<script src="~/Content/bootstrap3-editable/js/bootstrap-editable.js"></script>
<script src="~/Content/bootstrap-table/bootstrap-table.js"></script>
<script src="/Content/bootstrap-table/locale/bootstrap-table-zh-CN.js"></script>
<script src="~/Content/bootstrap-table/extensions/editable/bootstrap-table-editable.js"></script>
//(****************************************
js 代码
$(function () {
$("#tb_user").bootstrapTable({
toolbar: "#toolbar",
idField: "Id",
pagination: true,
showRefresh: true,
search: true,
clickToSelect: true,
queryParams: function (param) {
return {};
},
url: "/Editable/GetUsers",
columns: [{
checkbox: true
}, {
field: "UserName",
title: "用户名",
editable: {
type: 'text',
title: '用户名',
validate: function (v) {
if (!v) return '用户名不能为空';
}
}
}, {
field: "Age",
title: "年龄",
}, {
field: "Birthday",
title: "生日",
formatter: function (value, row, index) {
var date = eval('new ' + eval(value).source)
return date.format("yyyy-MM-dd");
}
},
{
field: "DeptName",
title: "部门"
}, {
field: "Hobby",
title: "爱好"
}],
onEditableSave: function (field, row, oldValue, $el) {
$.ajax({
type: "post",
url: "/Editable/Edit",
data: row,
dataType: 'JSON',
success: function (data, status) {
if (status == "success") {
alert('提交数据成功');
}
},
error: function () {
alert('编辑失败');
},
complete: function () {
}
});
}
});
});
//*********************
后台对应的更新方法
public JsonResult Edit(User user)
{
//更新实体
return Json(new { }, JsonRequestBehavior.AllowGet);
}
经过测试,用户名这一列基本可以自由编辑。同样,年龄这一列也可改成这样
复制代码
{
field: "Age",
title: "年龄",
editable: {
type: 'text',
title: '年龄',
validate: function (v) {
if (isNaN(v)) return '年龄必须是数字';
var age = parseInt(v);
if (age <= 0) return '年龄必须是正整数';
}
}
}
复制代码
有了上面的知识作为基础,我们来初始化生日这一列:
复制代码
{
field: "Birthday",
title: "生日",
formatter: function (value, row, index) {
var date = eval('new ' + eval(value).source)
return date.format("yyyy-MM-dd");
},
editable: {
type: 'date',
title: '生日'
}
}
复制代码
表单编辑里面还有一个重要的标签就是select了。上文我们知道x-editable为我们提供了下拉框的编辑模式,比如我们的部门这一列的编辑可以写成这样:
复制代码
{
field: "DeptId",
title: "部门",
editable: {
type: 'select',
title: '部门',
source:[{value:"1",text:"研发部"},{value:"2",text:"销售部"},{value:"3",text:"行政部"}]
}
}
复制代码
{
field: "DeptId",
title: "部门",
editable: {
type: 'select',
title: '部门',
source: function () {
var result = [];
$.ajax({
url: '/Editable/GetDepartments',
async: false,
type: "get",
data: {},
success: function (data, status) {
$.each(data, function (key, value) {
result.push({ value: value.ID, text: value.Name });
});
}
});
return result;
}
}
}
//**************************
除了上述几种常见的编辑框,x-editable还为我们提供了复选框组的编辑。比如:
复制代码
{
field: "Hobby",
title: "爱好",
editable: {
type: "checklist",
separator:",",
source: [{ value: 'bsb', text: '篮球' },
{ value: 'ftb', text: '足球' },
{ value: 'wsm', text: '游泳' }],
}
}
复制代码
1.连接数据库,查询数据
Private Sub CommandButton1_Click()
'
'Dim conn As ADODB.Connection
'Set conn = New ADODB.Connection
'
' Dim rs As ADODB.Recordset
'
' Set rs = New ADODB.Recordset
'conn.ConnectionString = "Provider=SQLOLEDB;Server=192.168.*.*;Database=testdb;Uid=sa;Pwd=*****"
'conn.Open
'MsgBox ("连接成功!" & vbCrLf & "数据库状态:" & conn.State & vbCrLf & "数据库版本:" & conn.Version)
' MsgBox ("连接成功!" & conn.State)
' rs.Open "select id,name from table ", conn
'
'指定页面单元格赋值
' Sheet3.Range("A1:B1").Value = Array("id77777", "caption88888")
'
'设置表头
' Range("A1:B1").Value = Array("id", "name")
''将数据输出到工作表
' Range("A2").CopyFromRecordset rs
''关闭连接
' rs.Close: Set rs = Nothing
' conn.Close: Set conn = Nothing
End Sub
2.单元格取值赋值
Private Sub CommandButton2_Click()
'指定页面单元格取值
' MsgBox Sheet3.Range("A3").Value
'指定页面单元格赋值
' Sheet3.Range("A1:B1").Value = 43434343
End Sub
******************************************************
3.单元格选中单击事件,获取指定行指定列
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'MsgBox "777888999"
获取指定行指定列
'If Target.Column = 3 And Target.Row = 5 Then
'If Target.Column = 3 Then
' MsgBox "你选中了:" & Target.Text & "行:" & Target.Row
' End If
'End Sub
***************************************************8
' Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' If Target.Column = 1 And Target.Row = 1 Then
' MsgBox "你选中了:" & Target.Text
' End If
' If Target.Column = 3 And Target.Row = 5 Then
' MsgBox "你选中了:" & Target.Text
' End If
' End Sub
将select 查询结果拼接成字串
select
(
select
id+
''
,name+
','
from
table1
for
xml path(
''
))
QL update select语句
最常用的update语法是:
1 2 | UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = VALUE |
如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦
第一,要select出来放在临时变量上,有很多个很难保存。 第二,再将变量进行赋值。
列多起来非常麻烦,能不能像Insert那样,把整个Select语句的结果进行插入呢? 就好象下面::
1 2 3 | INSERT INTO table1 (c1, c2, c3) (SELECT v1, v2, v3 FROM table2) |
答案是可以的,具体的语法如下:
1 2 3 4 5 6 | UPDATE table1 alias SET (column_name,column_name ) = ( SELECT (column_name, column_name) FROM table2 WHERE column_name = alias.column_name) WHERE column_name = VALUE |
下面是这样一个例子: 两个表a、b,想使b中的memo字段值等于a表中对应id的name值 表a:
1 2 3 4 | id name 1 王 2 李 3 张 |
表b:
1 2 3 4 | id ClientName 1 2 3 |
(MS SQL Server)语句:
1 | UPDATE b SET ClientName = a.name FROM a,b WHERE a.id = b.id |
(Oralce)语句:
1 | UPDATE b SET (ClientName) = (SELECT name FROM a WHERE b.id = a.id) |
update set from 语句格式 当where和set都需要关联一个表进行查询时,整个update执行时,就需要对被关联的表进行两次扫描,显然效率比较低。
对于这种情况,Sybase和SQL SERVER的解决办法是使用UPDATE…SET…FROM…WHERE…的语法,实际上就是从源表获取更新数据。
在 SQL 中,表连接(left join、right join、inner join 等)常常用于 select 语句。 其实在 SQL 语法中,这些连接也是可以用于 update 和 delete 语句的,在这些语句中使用 join 还常常得到事半功倍的效果。
1 2 | UPDATE T_OrderForm SET T_OrderForm.SellerID =B.L_TUserID FROM T_OrderForm A LEFT JOIN T_ProductInfo B ON B.L_ID=A.ProductID |
用来同步两个表的数据!
Oralce和DB2都支持的语法:
1 | UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID) |
MS SQL Server不支持这样的语法,相对应的写法为:
1 | UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A LEFT JOIN B ON A.ID = B.ID |
个人感觉MS SQL Server的Update语法功能更为强大。MS SQL SERVER的写法:
1 | UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A, B WHERE A.ID = B.ID |
在Oracle和DB2中的写法就比较麻烦了,如下:
1 2 | UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID) WHERE ID IN (SELECT B.ID FROM B WHERE A.ID = B.ID) |
public static void Readjson()
{
string jsonfile = "D://tsconfig1.json";
using (System.IO.StreamReader file = System.IO.File.OpenText(jsonfile))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject o = (JObject)JToken.ReadFrom(reader);
string a = o["lotname"].ToString();
var b = o["other"];
var c = b["lotaddress"];
var d = o["devices"];
foreach(JObject e in d)
{
var deviceID = e["deviceID"];
var name = e["name"];
var IP = e["IP"];
}
}
}
}
tsconfig1.json文件内容
{
"lotname": "停车系统",
"devices": [
{
"deviceID": "EI1001",
"name": "东道进口相机",
"type": "进口",
"IP": "192.168.1.100"
},
{
"deviceID": "EI1002",
"name": "东道进口语音屏",
"type": "进口",
"IP": "192.168.1.102"
},
{
"deviceID": "EO1003",
"name": "东道出口相机",
"type": "出口",
"IP": "192.168.1.103"
},
{
"deviceID": "EO1004",
"name": "东道出口语音屏",
"type": "出口",
"IP": "192.168.1.104"
}
],
"other": { "lotname": "wz001", "lotaddress": "wenzhou" }
}
注意:记事本另存为 以上内容时编码选择 U-TF8
DataTable转换到List
方法一:
public static IList<T> ConvertTo<T>(DataTable table)
{
if (table == null)
{
return null;
}
List<DataRow> rows = new List<DataRow>();
foreach (DataRow row in table.Rows)
{
rows.Add(row);
}
return ConvertTo<T>(rows);
}
public static IList<T> ConvertTo<T>(IList<DataRow> rows)
{
IList<T> list = null;
if (rows != null)
{
list = new List<T>();
foreach (DataRow row in rows)
{
T item = CreateItem<T>(row);
list.Add(item);
}
}
return list;
}
public static T CreateItem<T>(DataRow row)
{
T obj = default(T);
if (row != null)
{
obj = Activator.CreateInstance<T>();
foreach (DataColumn column in row.Table.Columns)
{
PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);
try
{
object value = row[column.ColumnName];
prop.SetValue(obj, value, null);
}
catch
{ //You can log something here
//throw;
}
}
}
return obj;
}
*************************************
/// </summary>
/// <param name="Json"></param>
/// <returns></returns>
public static object ToJson(this string Json)
{
return JsonConvert.DeserializeObject(Json);
}
public static string ToJson(this object obj)
{
IsoDateTimeConverter idtc = new IsoDateTimeConverter();
idtc.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
JsonSerializerSettings jsonSettings = new JsonSerializerSettings
{
};
jsonSettings.Converters.Add(idtc);
return JsonConvert.SerializeObject(obj, jsonSettings);
}
在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>、DataTable转换为Json格式。特别在使用Extjs框架的时候,Ajax异步请求的数据格式就是Json。鉴于此,我今天来分享将DataTable 转换成 Json的3种方法。换句话说如何在ASP.NET将一个DataTable序列化为 Json数组。或者如何从一个DataTable返回一个Json字符串。这篇文章将采用StringBuilder,JavaScriptSerializer和 Json.Net DLL (Newtonsoft) 这3种方法实现这一目标。
Json概述
JavaScript Object Notation (Json)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。这些特性使Json成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。Json采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯,包括C、C++、C#、Java、JavaScript、Perl、Python等等。
这些特性使Json成为一种理想的数据交换语言。因此 基于AJAX应用程序,Json已经成为一种用于数据交换的流行格式。总之,Json是一种存储和交换数据的语法,易于操作,也是除XML之外的不二之选。
步骤:
首先我们从Microsoft SQL Server 获取数据到DataTable,也可以给DataTable动态添加行。代码如下:
private DataTable getData()
{
DataTable dt = new DataTable();
dt.Columns.Add("编号", typeof(Int32));
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("性别", typeof(string));
dt.Columns.Add("学历", typeof(string));
dt.Rows.Add(1, "王超", "男", "本科");
dt.Rows.Add(2, "周丽", "女", "专科");
dt.Rows.Add(3, "李娟", "女", "专科");
dt.Rows.Add(4, "杨明", "男", "硕士");
dt.Rows.Add(5, "张德", "男", "本科");
return dt;
}
下面开始通过每一种方法实现DataTable转换成 Json 对象。
方法1:使用StringBuilder
这是Json样本数据的样子: {"姓名 ":"张三", "年龄":"30"}。Json里用花括号保存对象,它可以包含多个名称/值对。所以使用StringBuilder我们可以创建一个类似的Json字符串。
由于要使用StringBuilder类,我们首先需要导入System.Text命名空间,如下:
using System.Text;
下面的代码将生成一个Json字符串,遍历DataTable的行和列,获取数据,添加到一个StringBuilder对象 JsonString,然后返回这个对象。
public string DataTableToJson(DataTable table)
{
var JsonString = new StringBuilder();
if (table.Rows.Count > 0)
{
JsonString.Append("[");
for (int i = 0; i < table.Rows.Count; i++)
{
JsonString.Append("{");
for (int j = 0; j < table.Columns.Count; j++)
{
if (j < table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\",");
}
else if (j == table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\"");
}
}
if (i == table.Rows.Count - 1)
{
JsonString.Append("}");
}
else
{
JsonString.Append("},");
}
}
JsonString.Append("]");
}
return JsonString.ToString();
}
方法2:使用 JavaScriptSerializer.
首先我们添加System.Web.Script.Serialization命名空间,如下:
using System.Web.Script.Serialization;
JavaScriptSerializer这个类是由异步通信层内部使用来序列化和反序列化数据。如果序列化一个对象,就使用序列化方法。反序列化Json字符串,使用Deserialize或DeserializeObject方法。在这里,我们使用序列化方法得到Json格式的数据。代码以下:
public string DataTableToJsonWithJavaScriptSerializer(DataTable table)
{
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
List < Dictionary < string, object >> parentRow = new List < Dictionary < string, object >> ();
Dictionary < string, object > childRow;
foreach(DataRow row in table.Rows)
{
childRow = new Dictionary < string, object > ();
foreach(DataColumn col in table.Columns)
{
childRow.Add(col.ColumnName, row[col]);
}
parentRow.Add(childRow);
}
return jsSerializer.Serialize(parentRow);
}
方法3:使用Json.Net DLL (Newtonsoft)。
这个方法中要添加Json.Net DLL引用,我们可以从Newtonsoft下载Json.Net DLL,再导入命名空间,代码如下:
using Newtonsoft.Json;
public string DataTableToJsonWithJsonNet(DataTable table)
{
string JsonString=string.Empty;
JsonString = JsonConvert.SerializeObject(table);
return JsonString;
}
StringBuilder方法的全部代码:
using System;
using Susing System.Data;
public partial class Default2 : System.Web.UI.Page
private string sasss;
protected void Page_Load(object sender, EventArgs e)
{
DataTable table = getData();
sasss = DataTableToJson(table);
Response.Write(sasss + "<br/>");
}
public string DataTableToJson(DataTable table)
{
var JsonString = new StringBuilder();
if (table.Rows.Count > 0)
{
JsonString.Append("[");
for (int i = 0; i < table.Rows.Count; i++)
{
JsonString.Append("{");
for (int j = 0; j < table.Columns.Count; j++)
{
if (j < table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\",");
}
else if (j == table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\"");
}
}
if (i == table.Rows.Count - 1)
{
JsonString.Append("}");
}
else
{
JsonString.Append("},");
}
}
JsonString.Append("]");
}
return JsonString.ToString();
}
private DataTable getData()
{
DataTable dt = new DataTable();
dt.Columns.Add("编号", typeof(Int32));
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("性别", typeof(string));
dt.Columns.Add("学历", typeof(string));
dt.Rows.Add(1, "王超", "男", "本科");
dt.Rows.Add(2, "周丽", "女", "专科");
dt.Rows.Add(3, "李娟", "女", "专科");
dt.Rows.Add(4, "杨明", "男", "硕士");
dt.Rows.Add(5, "张德", "男", "本科");
return dt;
}
}
引用名称空知间using System.Web.Script.Serialization;(如果无法引用,请道添加程序集)
JavaScriptSerializer js = new JavaScriptSerializer();
//序列化成回json字符串
string json= js.Serialize("数据库查询出答来的数据");
/// <summary>
/// 将datatable转换为json
/// </summary>
/// <param name="dtb">Dt</param>
/// <returns>JSON字符串</returns>
public static string Dtb2Json(DataTable dtb)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
System.Collections.ArrayList dic = new System.Collections.ArrayList();
foreach (DataRow dr in dtb.Rows)
{
System.Collections.Generic.Dictionary<string, object> drow = new System.Collections.Generic.Dictionary<string, object>();
foreach (DataColumn dc in dtb.Columns)
{
drow.Add(dc.ColumnName, dr[dc.ColumnName]);
}
dic.Add(drow);
}
//序列化
return jss.Serialize(dic);
}