javascript網頁,將json轉成Excel檔案

client端javascript網頁,讀取c:\personnel.json,轉成物件陣列,再輸出成Excel格式檔案
(下載personnel.json到c:\) (須用chrome瀏覽器,才能顯示)



 




1.:注意事項

(1).輸出成json檔案,不可以有斷行,換行,否則讀取會出現錯誤

(2)特殊符號的顯示
* 輸出xml需要換行,在txt01文字欄位顯示換行的方法: \n
*輸出json需要顯示",在txt01文字欄位顯示"的方法:\"

(3).json檔案格式必須正確,尤其尾部多個, 都不行,例如[{"name":"張瑾雯","address":"北市北平東路24號","tel":"3224931"},]

(4).必須手動將畫面上txt01的json文字,全選+複製到記事本,貼上然後存檔,要特別注意:存檔編碼要改成UTF-8萬國碼,否則用內定編碼ANSI,中文字會變成亂碼。

(5).若要讀取access,excel,SQL Server資料庫檔案,必需在I.E.瀏覽器才能讀取(使用chrome, opera都不行,因為只有同是微軟的產品,才能讀取)

2.:以oledb格式在javascript中,無法讀取的資料庫寫法:

(A).無法讀取server端的資料庫
strConn= "Provider=Microsoft.ACE.Oledb.12.0;Data source=C:\Northwind.accdb;Persist Security Info=False";

(B).無法讀取client端同目錄資料庫(除非指定目錄路徑):
strConn= "Provider=Microsoft.ACE.Oledb.12.0;Data source=Northwind.accdb;Persist Security Info=False";

(C).無法讀取跨網域Access資料庫:
strConn= "Provider=Microsoft.ACE.Oledb.12.0;Data source=http://tung.tsu.edu.tw/lecture/jquery_phoneGap/access/Northwind.accdb;Persist Security Info=False";

3.指定access資料庫路徑,可以有以下幾種寫法:

(A).strConn= "Provider=Microsoft.ACE.Oledb.12.0;Data source=C:\Northwind.accdb;Persist Security Info=False";
*若javascript網頁在client端執行,會讀取client端的c:\資料庫
*若javascript網頁在server端執行,會讀取client端的c:\資料庫

(B).strConn= "Provider=Microsoft.ACE.Oledb.12.0;Data source=D:\Northwind.accdb;Persist Security Info=False";
*若javascript網頁在client端執行,會讀取client端的d:\資料庫
*若javascript網頁在server端執行,會讀取client端的d:\資料庫

(C).strConn= "Provider=Microsoft.ACE.Oledb.12.0;Data source=\\Northwind.accdb;Persist Security Info=False";
*若javascript網頁在client端d硬碟裡,執行會讀取client端的c:\資料庫
*若javascript網頁在server端執行,會讀取client端的c:\資料庫

(D).strConn= "Provider=Microsoft.ACE.Oledb.12.0;Data source=Northwind.accdb;Persist Security Info=False";
*若javascript網頁在client端執行,不能讀取同目錄裡的資料庫
*若javascript網頁在server端執行,不能讀取同目錄裡的資料庫

2.以OleDb物件讀取各種資料庫步驟(可讀取資料庫包括:Access 2003

mdb,Access 2007 accdb, Excel 2003 xls, Excel 2007 xlsx, SQL Server, txt/csv等資料庫):

//(A).設定連結資料庫字串strConn
//####### Access 2003 (*.mdb) ##############
strConn= "Provider=Microsoft.Jet.Oledb.4.0;Data source = D:\Northwind.mdb;Persist Security Info=False";
//'####### Access 2007 (*.accdb) ##############
//strConn= "Provider=Microsoft.ACE.Oledb.12.0;Data source= D:\資料庫名稱.accdb;Persist Security Info=False";
//'####### Excel 2003 (*.xls) ##############
//strConn= "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";Data Source== D:\資料庫名稱.xls;Persist Security Info=False";
//'####### Excel 2008 (*.xlsx) ##############
//strConn= "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";Data Source= D:\資料庫名稱.xlsx;Persist Security Info=False";
//####### 以 Windows 驗證登入帳戶 SQL Server 2005 ######################
//strConn= "Provider=sqloledb;Data Source=伺服器名稱;Initial Catalog=資料庫名稱;User Id=帳戶名稱;Password=密碼;Integrated Security=SSPI;"
//####### 以 SQL Server 驗證登入帳戶 SQL Server 2005 (2種方法) ##############
//strConn= "Provider=sqloledb;Data Source=伺服器名稱;Initial Catalog=資料庫名稱;User Id=帳戶名稱;Password=密碼;"
//strConn= "Provider=SQLNCLI.1;Data Source=伺服器名稱;Initial Catalog=資料庫名稱;User Id=帳戶名稱;Password=密碼;"
////####### txt/csv ################################
//注意:若第一列有欄位名稱,則HDR=YES (預設值為YES)(第一行當欄位名稱處理)
//注意:若第一列無欄位名稱,直接就是數據了,則HDR=NO (第一行當數據處理)
//strConn= "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Text;HDR=YES';Data Source=txt/csv目錄"

var conn = new ActiveXObject("ADODB.Connection");
conn.Open(strConn);
var rs = new ActiveXObject("ADODB.Recordset");

//(B).執行SQL指令,並將查詢資料表結果儲存於 Recordset (rs)

var SQL = "select * from 員工";
rs.Open(SQL, conn);

rs.MoveFirst();
str ="";

//(C).將查詢結果(取得欄位名稱及內容)以while(){..}迴圈將每一筆數據列出在畫面

while (!rs.EOF) {
str += rs(0).value + rs(1).value +rs(2).value +rs(3).value +rs(4).value +"<br/>";
rs.movenext();
};
document.getElementById("id01").innerHTML=str;

//(D).將查詢結果rs物件,conn連結物件都關閉
rs.Close();
conn.Close();

3.如何從查詢結果rs物件(RecordSets),取得各種參數

rs(i).name:第i個欄位的欄位名稱
rs("欄位名稱").value:讀取某個特定欄位名稱的資料
rs(i).value:第i個欄位的資料

rs.EOF:是否已指到最後一筆資料,是為True,反之為False
rs.Fields.Count:取得欄位數目
rs.MoveNext:將指標移到下一筆
rs.MovePrev:將指標移到上一筆
rs.MoveFirst:將指標移到第一筆
rs.MoveLast:將指標移到最後一筆
while (!rs.EOF) {
//................
//掃描全部查詢到的資料內容
rs.MoveNext();
}

4.如何從查詢結果rs物件(RecordSets), 轉換成物件陣列accessobj

accessobj = new Array();
while (!rs.EOF) {
//把access資料轉成obj物件陣列
accessobj[i] = new Object();
accessobj[i].id = rs("員工編號").value;
accessobj[i].name = rs("姓名").value;
accessobj[i].englishname = rs("名").value;
accessobj[i].address = rs("地址").value;
accessobj[i].tel =rs("電話號碼").value;
i++;
rs.movenext();
};

Recordset物件

屬性 資料型態 說明
AbsolutePage Long 指定Recordset目前記所在的分頁
AbsolutePosition Long 指定Recordset目前記錄絕對位置
ActiveCommand Variant 指向建立Recordet的Command物件之指標
ActiveConnection String或Connection物件 指定用來取回查詢結果的Connection物件
BOF Boolean 資料指標的位置是否在檔案的開頭
Bookmark Variant 允許回到Recordset內指定的資料位置
CacheSize Long 指定ADO放在伺服器記憶體的位置
CursorLocation Long 指定Cursor函式庫的位置
CursorType CursorTypeEnum 指定用來存取查詢結果的Cursor型態
DataMember String 控制資料來源中欲連結的Recordset
DataSource 物件 允許將Recordset連結到資料來源
EditMode EditModeEnum Recordset目前所在記錄的編輯狀態
EOF Boolean 資料指標是否在標案的結尾
Fields Field物件集合 查詢結果中欄位物件的集合
Filter Variant 回傳Recordset物件中特定的記錄
lndex String 控制Recordset物件目前作用中的索引
LockType LockTypeEnum 指定Recordsetsnm 物件進行更新與鎖定資料的方式
MarshalOption Long 控制包含於Recordset物件中的資料
MaxRecords Long 查詢結果的最大資料筆數
PageCount Long Recordset分頁的數目
PageSize Long Recordset中每一個分頁所包含的資料數
Properties Property物件集合 動態屬性的集合
RecordCount long Recordset物件中記錄的筆數
Sort String 重新排序Recordset物件內的資料
Source String或Command物件 包含用來建立Recordset物件的查詢指令字串
State Long Recordset物件目前的狀態
Status RecordStatvsEnum 目前記錄更新的狀態
StalnSync Boolean 控制Recordset時間資料保持同步

方法 重要參數 說明
AddNew NA 新增一筆資料到Recordset
Cancel NA 取消非同步查詢
CancelBatch NA 取消批次更新
CancelUpdate NA 取消目前編輯中的記錄變更
Clone NA 復製一個相同的Recordset物件
Close NA 關閉Recordset物件
CompareBookmarks Bookmark1 As ComparEnum
Bookmark2 As CompareEnum
比較同一個Recordset物件內的兩個bookmark
Delete NA 刪除目前的記錄
Find Criteria As String 搜尋特定條件的記錄
GetRows NA 從Recordset中傳回一個二維陣列的資料
GetString StringFormat As StingFormatEnum
NumRows As LongColumnDelimiter As StringRowDelimiter As String
從物件中傳回一個字串資料
Move NullExpr As String
Start As String
將資料指標移動到指定的位置
MoveFirst NA 將資料指標移動到第一筆
MoveLast NA 將資料指標移動到最後一筆
MoveNext NA 將資料指標移動到下一筆
MovePrevious NA 將資料指標移動到上一筆
NextRecordset NA 取回批次查詢下一個查詢結果
Open Source As String
ActiveConnection As Connection
CursorType As CursorTypeEnum
LockType As LockTypeEnum
開啟Recordset物件
Requery NA 重新執行查詢
Resync NA 由資料庫中取回Recordset所包含的資料
Save Destination As String
PersistFormat AsPErsistFormat
Enum
將Recordset內的資料儲存成檔案
Seek KeyValues As Array 以指定的字串搜尋資料
Surpports CursorOptiobns As CursrOption
Enum
Recordset物件是否支援特殊功能
Update Fields As Array
Values As Array
將等待更新的資料寫入Recordset中
Updatebatch NA 將批次更新的資料送到資料庫中

4.Northwind.mdb員工資料表內容

員工編號 姓名 英文名 職稱 稱呼 出生日期 雇用日期 地址 城市 行政區 區域號碼 國家地區 電話號碼
1 張瑾雯 Mary 業務 小姐 1968/12/8 1992/1/5 北市仁愛路二段56號 台北市 中山 98122 (02) 2555-9857
2 陳季暄 Bradley 業務經理 先生 1952/2/19 1992/8/14 北市敦化南路一段1號 台北市 大同 98401 (02) 2555-9482
3 趙飛燕 Kim 業務 小姐 1963/8/30 1992/4/1 北市忠孝東路四段4 號 台北市 松山 98033 (02) 2555-3412
4 林美麗 Chris 業務 小姐 1958/9/19 1993/5/3 北市南京東路三段3號 台北市 景美 98052 (02) 2555-8122
5 劉天王 Mike 業務經理 先生 1955/3/4 ######## 北市北平東路24號 台北市 松山 98552 (02) 2555-4848
6 黎國明 Bill 業務 先生 1963/7/2 ######## 北市中山北路六段88號 台北市 中山 15524 (02) 2555-7773
7 郭國臹 Steven 業務 先生 1960/5/29 1994/1/2 北市師大路67號 台北市 大同 55555 (02) 2555-5598
8 蘇涵蘊 Maggie 業務主管 小姐 1958/1/9 1994/3/5 北市紹興南路99號 台北市 信義 88888 (02) 2555-1189
9 孟庭亭 Linda 業務 小姐 1969/7/2 ######## 北市信義路二段120號 台北市 大同 33333 (02) 2555-4444
12 賴俊良 Eddie 資深工程師 先生 1972/12/6 1995/12/6 北市北平東路24 號3 樓之一 台北市 信義 11112 3224932
13 何大樓 David 助手 先生 1961/12/6 1993/12/6 北市北平東路24 號3 樓之一 台北市 景美 53432 3224932
14 王大德 John 工程師 先生 ######## ######## 北市北平東路24 號3 樓之一 台北市 內湖 53432 3224931