顯示具有 JQuery Plugin 標籤的文章。 顯示所有文章
顯示具有 JQuery Plugin 標籤的文章。 顯示所有文章

2015年8月14日 星期五

用filesaver.js 輕鬆將html table的資料匯出成Excel

過去有關Excel的匯出我都是用NPOI套件來撰寫,之前也有寫過類似的文章:

[鐵人30天]當ASP.NET MVC 遇見 Angular.js MVC 客戶管理系統(23) – NPOI匯出功能

但看到同事有使用filesaver.js這個套件來做匯出,個人覺得蠻方便的,就來分享一下

唯一有個限制,因為是用Html5的Blob來實現的,所以較舊的瀏覽器不支援

而有些版本只要再加載Blob.js也可正常運作

c85eee520a2e43589c3188a35b6ed0da

資訊來自 filesaver.js Github

官網已經有Demo示範匯出 png . txt . xhtml 的類型,以下就來實作實務上很常見的匯出table raw data

首頁Github整個clone下來會發現filesaver.min.js這個檔案,將這個檔案載入到你的網頁

e7a4119874a646ff9c98b135453ca671

接著我們寫個html假資料,並加個匯出按鈕,當然實際上你的資料來源可能是後端提供而來

ed9c7e3d3ce34582b205dcdc3784598e

22927ec38a9544ea871d38fcf1ce6978

接著我們用jQuery button click的時候,將tbData這個div底下的資料匯出

$(function () {
$('Button').click(function () {
var blob = new Blob([document.getElementById('tbData').innerHTML], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
});
var strFile = "Report.xls";
saveAs(blob, strFile);
return false;
});
});

這樣就可以很方便的匯出資料了!


780e1092f82642c59ffae31dead7beb5


Technorati 的標籤: ,,,

2013年12月30日 星期一

KendoUI & ASP.NET MVC系列文章

前言

在ASP.NET WebForm我們有非常多的伺服器控制項,這些控制項減少了Web程式設計師很多工,隨著技術演進,前端技術越來越火紅,越來越多JavaScript函式庫出現(JQuery、knockout.js、Angular.js…),就連UI套件也有JQuery UI、EasyUI、jqGrid等等出現…。開發ASP.NET MVC時,並沒有那些伺服器控制項了,前後端拆分越來越明確,所以開始找尋適合自己的UI FreamWork,後來Study到KendoUI這個套件,開發上還蠻順利的,至於為什麼不用WebForm+KendoUI呢?是因為我覺得Webform本身架構不太適合Ajax,還是用那些伺服器控制項在開發及維護上會好一點(慘痛經驗QQ) !

KendoUI

KendoUI是以Telerik公司推出以JQuery為基礎加上Html5,CSS3的FreamWork,雖然說是HTML5/CSS3,但對於瀏覽器相容器支持度也沒少,且還有針對行動裝置有KendoUI Mobile,因為是以JQuery為基底,對於常使用JQuery開發的我而言,語法都有些親切感,筆者也用過JQuery UI一陣子,但相較之下,我更喜歡KendoUI的配色主題(個人喜好)。就以ASP.NET而言,KendoUI分為Open Source和付費版本,付費版本多了很多MVC的Helper,且享有技術支援,而Open Source授權部分,只要你不把你的網站包成產品販賣,不管是外網使用或公司內部使用都不會有問題,詳細授權的相關問題可看黑暗大的此篇-AJAX式資料清單的新選擇-Kendo UI Grid
image 

文章目的

本系列文章都會使用Open Sorce版本來實做,在Study這個FreamWork的過程,不免有一些學習曲線,希望將這些零散的筆記整理成文章,讓大家選擇這套UI時,能更快上手,當然,過程中使用ASP.NET MVC架構開發,能讓大家(也讓我),做個記錄順便分享開發心得。而最初的幾篇,我將以使用上最頻繁的Grid控制項先講起,未來會陸續增加文章,也會繼續分享其他控制項的開發心得。




系列文章

KendoUI & ASP.NET MVC系列文章 -  在Visual Studio安裝及更換主題
KendoUI & ASP.NET MVC系列文章 -  基本的Grid功能
KendoUI & ASP.NET MVC系列文章 -  處理CRUD-使用Ajax讀取後端Model資料
KendoUI & ASP.NET MVC系列文章 -  處理CRUD-繼續完成新增、修改、刪除
 


2013年12月27日 星期五

KendoUI & ASP.NET MVC系列文章 - 處理CRUD-繼續完成新增、修改、刪除

前言

前一篇我們已經完成利用Ajax來讀取後端資料顯示於Grid,而此篇就會將新增、修改、刪除功能接續完成

CRUD的 Create - 新增

Controller

利用原本樣板產生的程式做一些修改,原本程式如下

image

將上面程式修改為以下,透過MVC的Model Bindder可以接收前端傳來的Customers物件,並依情況回傳是否新增成功

image

View

將dataSrc新增一個Create function,指向後端的CreateCustomer,並在完成後alert處理結果

 image

Schema部分新增model定義,讓KendoUI知道你的模組結構,並且可設定一些欄位驗證

image

接著在屬性部分新增toolbar及editable,editable模式可分為inline(直接在Gird新增一個)或者是popup(彈跳視窗)方式,此例我們希望新增時是跳出一個燈箱視窗

image

結果圖

這樣就完成,在以往我們可能自己要實做View的頁面,現在KendoUI都幫你做好好的,且表單也排得很整理 lol

image


CRUD的Update-編輯

Controller

基本上跟新增大同小異,我們在Controller新增EditCustomer的JsonResult

image 

View

新增一個Update function

image

在columns多一個command成員,並設定edit按鈕(這邊也可以自訂義Button標籤)

image

這樣就完成編輯燈箱視窗了!!

image

CRUD的Delete-刪除

Contoller (這邊就不解釋了)

image

View

image

image

後記

以上是一種實做CRUD的方式,但其實做法有很多種,譬如你也可自訂新增、編輯的View去實做,或者你也可以自訂一些查詢欄位POST到後端去,關於版面,如果要修改中文的顯示其實也可以做到,之後也會分享一些實做心得PO上來。而下一篇,預計完將後端改成用WebAPI + OData的方式實做 =V=

完成程式碼

Contoller

public class GridAjaxController : Controller
{
private NorthwindEntities db = new NorthwindEntities();

// GET: /GridAjax/
public ActionResult Index()
{
return View();
}

public JsonResult GetCustomer(KendoGridRequest request)
{
try
{
var result = db.Customers.ToList();
return Json(new KendoGrid<Customers>(request, result), JsonRequestBehavior.AllowGet);
}
catch (Exception)
{
Dictionary<string, object> error = new Dictionary<string, object>();
error.Add("ErrorCode", -1);
error.Add("ErrorMessage", "讀取資料失敗!");
return Json(error);
}
}

// GET: /GridAjax/Details/5
public ActionResult Details(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Customers customers = db.Customers.Find(id);
if (customers == null)
{
return HttpNotFound();
}
return View(customers);
}

// GET: /GridAjax/Create
public ActionResult Create()
{
return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult CreateCustomer(Customers customers)
{
if (ModelState.IsValid)
{
if (TryUpdateModel(customers))
{
db.Customers.Add(customers);
db.SaveChanges();
return Json("新增成功!!");
}
}
return Json("新增失敗!!");
}

public JsonResult EditCustomer(Customers customers)
{
if (ModelState.IsValid)
{
db.Entry(customers).State = EntityState.Modified;
if (TryUpdateModel(customers))
{
db.SaveChanges();
return Json("更新成功!!");
}
}
return Json("更新失敗!!");
}

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult DeleteCustomer(string CustomerID)
{
Customers customers = db.Customers.Find(CustomerID);
db.Customers.Remove(customers);
if (TryUpdateModel(customers))
{
db.SaveChanges();
return Json("刪除成功!!");
}
return Json("刪除失敗!!");
}

protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}

View

@model IEnumerable<KendoUI.Model.Customers>

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/BaseLayoutPage.cshtml";
}

@section scripts
{
<script type="text/javascript">
$(function () {

//資料來源物件改用Ajax
var dataSrc = new kendo.data.DataSource({
transport: {
read: {
type: "POST",
url: "/GridAjax/GetCustomer",
dataType: "json",
complete: function (response, status) {
if (response.responseJSON.ErrorCode == -1) {
alert(response.responseJSON.ErrorMessage);
}
}

},
update: {
url: "/GridAjax/EditCustomer",
dataType: "json",
type: "POST",
complete: function (response, status) {
alert(response.responseJSON);
}
},
create: {
url: "/GridAjax/CreateCustomer",
dataType: "json",
type: "POST",
complete: function (response, status) {
alert(response.responseJSON);
}
},
destroy: {
url: "/GridAjax/DeleteCustomer",
dataType: "json",
type: "POST",
complete: function (response, status) {
alert(response.responseJSON);
}
},
},
schema: {
data: function (d) {
return d.data;
},
total: function (d) { return d.total; },
model: {
id: "CustomerID",
fields: {
product: { editable: false, nullable: false },
CompanyName: { validation: { required: true } },
ContactName: { validation: { required: true } },
City: { validation: { required: true } }
}
}
},
pageSize: 5,
serverPaging: true,
serverSorting: true
});

$("#gridData").kendoGrid({
dataSource: dataSrc,
columns: [
{ field: "CustomerID", title: "CustomerID" },
{ field: "CompanyName", title: "CompanyName" },
{ field: "ContactName", title: "ContactName" },
{ field: "City", title: "City" },
{ command: ["edit","destroy"], title: "&nbsp;", width: "160px" }
], //columns的field對應到customer資料表的欄位
sortable: true,
pageable: true,
filterable: true,
width: 800,
toolbar: ["create"],
editable: {
mode: "popup", //使用Popup的模式編輯資料
update: true, // 若設定為True,當按下Update才server資料
}
});
});
</script>
}
<div id="gridData"></div>


延伸閱讀




2013年11月12日 星期二

[JQuery Plugin]三步驟製作全景相片撥放器

基本介紹

功能敘述:全景相片在自定義的div裡面自動撥放,並可控制左右方向
套件名稱:Panoramas
JQuery版本:1.10.1

實做

Step 1 載入JQuery & Plugin
http://www.openstudio.fr/jquery.panorama/js/jquery.panorama.js
<script src="../../Scripts/jquery-1.10.1.min.js"></script>
<script src="jquery.panorama.js"></script>
Step 2 載入 CSS
http://www.openstudio.fr/jquery.panorama/css/jquery.panorama.css
<link href="jquery.panorama.css" rel="stylesheet" />
Step 3 Html加入img
<img src="pic.jpg" class="panorama" width="1084" height="375" />

 

運行結果

JSFIDDLE
1 
--
小編mur mur : 決定以後玩到好玩的JQuery套件都不囉嗦直接附上程式碼~