久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

SheetJS中文文档-js导出Excel脚本库[通俗易懂]

發布時間:2023/12/15 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 SheetJS中文文档-js导出Excel脚本库[通俗易懂] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自 GITHUB用戶rockboom 的翻譯文檔
SheetJs下載: GITHUB地址 | CSDN下載地址

基礎案例

<html lang="zh-cn"><head>
<meta charset="UTF-8">
<title>JS讀取和導出excel示例</title>
<meta name="description" content="使用sheetjs讀取和導出excel示例">
<style type="text/css"> table { 
 border-collapse: collapse; } th, td { 
 border: solid 1px #6D6D6D; padding: 5px 10px; } .mt-sm { 
margin-top: 8px;} body { 
 background: #f4f4f4; padding: 0; margin: 0; } .container { 
 width: 1024px; margin: 0 auto; background: #fff; padding: 20px; min-height: 100vh; } </style>
</head>
<body>
<div class="container">
<h1>JavaScript讀取和導出excel示例(基于js-xlsx)</h1>
<div>
<a  _target="_blank">如何使用JavaScript實現純前端讀取和導出excel文件</a><br>
<a >官網演示</a><br>
<a >Github</a>
</div>
<h2>讀取excel(僅讀取第一個sheet)</h2>
<div class="mt-sm">
<input type="file" id="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel">
<a href="javascript:selectFile()">加載本地excel文件</a>
<a href="javascript:loadRemoteFile('./sample/sample.xlsx')">加載遠程excel文件</a>
</div>
<p>結果輸出:(下面表格可直接編輯導出)</p>
<div id="result" contenteditable=""><table><tbody><tr><th></th><th>A</th><th>B</th><th>C</th><th>D</th></tr><tr><td>1</td><td>姓名</td><td>性別</td><td>年齡</td><td>籍貫</td></tr><tr><td>2</td><td>張三</td><td>男</td><td>18</td><td>廣東惠州</td></tr><tr><td>3</td><td>李四</td><td>女</td><td>22</td><td>河北石家莊</td></tr></tbody></table></div>
<h2>導出excel</h2>
<div class="mt-sm">
<input type="button" onclick="exportExcel()" value="保存"> 上面讀取的表格您可以直接編輯,編輯后點擊保存即可導出excel文件。
</div>
<h2>導出帶單元格合并的excel</h2>
<input type="button" value="導出" onclick="exportSpecialExcel()">
</div>
<script type="text/javascript" src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript" src="https://static.newmorehot.com/Public/Home/assets/js/jsxlsx/xlsx.core.min.js"></script>
<script type="text/javascript"> function selectFile() { 
 document.getElementById('file').click(); } // 讀取本地excel文件 function readWorkbookFromLocalFile(file, callback) { 
 var reader = new FileReader(); reader.onload = function(e) { 
 var data = e.target.result; var workbook = XLSX.read(data, { 
type: 'binary'}); if(callback) callback(workbook); }; reader.readAsBinaryString(file); } // 從網絡上讀取某個excel文件,url必須同域,否則報錯 function readWorkbookFromRemoteFile(url, callback) { 
 var xhr = new XMLHttpRequest(); xhr.open('get', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function(e) { 
 if(xhr.status == 200) { 
 var data = new Uint8Array(xhr.response) var workbook = XLSX.read(data, { 
type: 'array'}); if(callback) callback(workbook); } }; xhr.send(); } // 讀取 excel文件 function outputWorkbook(workbook) { 
 var sheetNames = workbook.SheetNames; // 工作表名稱集合 sheetNames.forEach(name => { 
 var worksheet = workbook.Sheets[name]; // 只能通過工作表名稱來獲取指定工作表 for(var key in worksheet) { 
 // v是讀取單元格的原始值 console.log(key, key[0] === '!' ? worksheet[key] : worksheet[key].v); } }); } function readWorkbook(workbook) { 
 var sheetNames = workbook.SheetNames; // 工作表名稱集合 var worksheet = workbook.Sheets[sheetNames[0]]; // 這里我們只讀取第一張sheet var csv = XLSX.utils.sheet_to_csv(worksheet); document.getElementById('result').innerHTML = csv2table(csv); } // 將csv轉換成表格 function csv2table(csv) { 
 var html = '<table>'; var rows = csv.split('\n'); rows.pop(); // 最后一行沒用的 rows.forEach(function(row, idx) { 
 var columns = row.split(','); columns.unshift(idx+1); // 添加行索引 if(idx == 0) { 
 // 添加列索引 html += '<tr>'; for(var i=0; i<columns.length; i++) { 
 html += '<th>' + (i==0?'':String.fromCharCode(65+i-1)) + '</th>'; } html += '</tr>'; } html += '<tr>'; columns.forEach(function(column) { 
 html += '<td>'+column+'</td>'; }); html += '</tr>'; }); html += '</table>'; return html; } function table2csv(table) { 
 var csv = []; $(table).find('tr').each(function() { 
 var temp = []; $(this).find('td').each(function() { 
 temp.push($(this).html()); }) temp.shift(); // 移除第一個 csv.push(temp.join(',')); }); csv.shift(); return csv.join('\n'); } // csv轉sheet對象 function csv2sheet(csv) { 
 var sheet = { 
}; // 將要生成的sheet csv = csv.split('\n'); csv.forEach(function(row, i) { 
 row = row.split(','); if(i == 0) sheet['!ref'] = 'A1:'+String.fromCharCode(65+row.length-1)+(csv.length-1); row.forEach(function(col, j) { 
 sheet[String.fromCharCode(65+j)+(i+1)] = { 
v: col}; }); }); return sheet; } // 將一個sheet轉成最終的excel文件的blob對象,然后利用URL.createObjectURL下載 function sheet2blob(sheet, sheetName) { 
 sheetName = sheetName || 'sheet1'; var workbook = { 
 SheetNames: [sheetName], Sheets: { 
} }; workbook.Sheets[sheetName] = sheet; // 生成excel的配置項 var wopts = { 
 bookType: 'xlsx', // 要生成的文件類型 bookSST: false, // 是否生成Shared String Table,官方解釋是,如果開啟生成速度會下降,但在低版本IOS設備上有更好的兼容性 type: 'binary' }; var wbout = XLSX.write(workbook, wopts); var blob = new Blob([s2ab(wbout)], { 
type:"application/octet-stream"}); // 字符串轉ArrayBuffer function s2ab(s) { 
 var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } return blob; } /** * 通用的打開下載對話框方法,沒有測試過具體兼容性 * @param url 下載地址,也可以是一個blob對象,必選 * @param saveName 保存文件名,可選 */ function openDownloadDialog(url, saveName) { 
 if(typeof url == 'object' && url instanceof Blob) { 
 url = URL.createObjectURL(url); // 創建blob地址 } var aLink = document.createElement('a'); aLink.href = url; aLink.download = saveName || ''; // HTML5新增的屬性,指定保存文件名,可以不要后綴,注意,file:///模式下不會生效 var event; if(window.MouseEvent) event = new MouseEvent('click'); else { 
 event = document.createEvent('MouseEvents'); event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); } aLink.dispatchEvent(event); } $(function() { 
 document.getElementById('file').addEventListener('change', function(e) { 
 var files = e.target.files; if(files.length == 0) return; var f = files[0]; if(!/\.xlsx?$/g.test(f.name)) { 
 alert('僅支持讀取xlsx格式!'); return; } readWorkbookFromLocalFile(f, function(workbook) { 
 readWorkbook(workbook); }); }); loadRemoteFile('./sample/test.xlsx'); }); function loadRemoteFile(url) { 
 readWorkbookFromRemoteFile(url, function(workbook) { 
 readWorkbook(workbook); }); } function exportExcel() { 
 var csv = table2csv($('#result table')[0]); var sheet = csv2sheet(csv); var blob = sheet2blob(sheet); openDownloadDialog(blob, '導出.xlsx'); } function exportSpecialExcel() { 
 var aoa = [ ['主要信息', null, null, '其它信息'], // 特別注意合并的地方后面預留2個null ['姓名', '性別', '年齡', '注冊時間'], ['張三', '男', 18, new Date()], ['李四', '女', 22, new Date()] ]; var sheet = XLSX.utils.aoa_to_sheet(aoa); sheet['!merges'] = [ // 設置A1-C1的單元格合并 { 
s: { 
r: 0, c: 0}, e: { 
r: 0, c: 2}} ]; openDownloadDialog(sheet2blob(sheet), '單元格合并示例.xlsx'); } </script>
</body></html>

SheetJS js-xlsx

SheetJS是用于多種電子表格格式的解析器和編寫器。通過官方規范、相關文檔以及測試文件實現簡潔的JS方法。SheetJS強調解析和編寫的穩健,其跨格式的特點和統一的JS規范兼容,并且ES3/ES5瀏覽器向后兼容IE6。

目前這個是社區版,我們也提供了性能增強的專業版,專業版提供樣式和專業支持的附加功能。

專業版

商業支持

介紹文檔

瀏覽器示例

源碼

問題和錯誤報告

常見的支持問題

支持的電子數據表的文件格式:

支持格式的圖表 (點擊查看)


瀏覽器測試

目錄表

點擊展示目錄表

  • 安裝
    • JS 生態示例
    • 可選模塊
    • ECMAScript 5 兼容性
  • 原理
  • 解析工作簿
    • 解析示例
    • 流式讀取
  • 操作工作簿
    • 解析和編寫示例
  • 編寫工作簿
    • 編寫示例
    • 流式寫入
  • 接口
    • 解析函數
    • 編寫函數
    • 工具函數
  • 常用電子表格的格式
    • 一般結構
    • 單元格對象
      • 數據類型
      • 日期類型
    • 數據表對象
      • 工作表對象
      • 圖表對象
      • 宏對象
      • 對話表對象
    • 工作簿對象
      • 工作簿的文件屬性
    • 工作簿級別的屬性
      • 定義名稱
      • 查看工作表
      • 其他的工作簿屬性
    • 文檔特點
      • 公式
      • 列屬性
      • 行屬性
      • 數字格式化
      • 超鏈接
      • 單元格注釋
      • 表的可見性
      • VBA和宏命令
  • 解析選項
    • 輸入類型
    • 猜測文件類型
  • 編寫選項
    • 支持的輸出格式
    • 輸出類型
  • 工具函數
    • 數組輸入
    • 對象輸入
    • HTML Table 輸入
    • 公式輸出
    • 分隔符輸出
      • UTF-16 Unicode 文本
    • HTML 輸出
    • JSON
  • 文件格式
    • Excel 2007+ XML (XLSX/XLSM)
    • Excel 2.0-95 (BIFF2/BIFF3/BIFF4/BIFF5)
    • Excel 97-2004 Binary (BIFF8)
    • Excel 2003-2004 (SpreadsheetML)
    • Excel 2007+ Binary (XLSB, BIFF12)
    • Delimiter-Separated Values (CSV/TXT)
    • 其它的工作簿格式
      • Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)
      • Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)
      • OpenDocument Spreadsheet (ODS/FODS)
      • Uniform Office Spreadsheet (UOS1/2)
    • 其它的單表格式
      • dBASE and Visual FoxPro (DBF)
      • Symbolic Link (SYLK)
      • Lotus Formatted Text (PRN)
      • Data Interchange Format (DIF)
      • HTML
      • Rich Text Format (RTF)
      • Ethercalc Record Format (ETH)
  • 測試
    • Node
    • 瀏覽器
    • 測試環境
    • 測試文件
  • 合作
    • OSX/Linux
    • Windows
    • 測試
  • 證書
  • 引用

安裝

在瀏覽器里使用,增加一個script標簽:

<script lang="javascript" src="dist/xlsx.full.min.js"></script>

使用CDN (點擊顯示詳情)

CDN URL
unpkg https://unpkg.com/xlsx/
jsDelivr https://jsdelivr.com/package/npm/xlsx
CDNjs http://cdnjs.com/libraries/xlsx
packd https://bundle.run/xlsx@latest?name=XLSX

unpkg提供最新的版本:

<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>

使用 npm:

$ npm install xlsx

使用 bower:

$ bower install js-xlsx

JS生態示例

示例 目錄 包括了一些簡單的項目:

框架和APIS

  • angularjs
  • angular 2 / 4 / 5 / 6 and ionic
  • knockout
  • meteor
  • react and react-native
  • vue 2.x and weex
  • XMLHttpRequest and fetch
  • nodejs server
  • databases and key/value stores
  • typed arrays and math

打包工具

  • browserify
  • fusebox
  • parcel
  • requirejs
  • rollup
  • systemjs
  • typescript
  • webpack 2.x

集成平臺

  • electron application
  • nw.js application
  • Chrome / Chromium extensions
  • Adobe ExtendScript
  • Headless Browsers
  • canvas-datagrid
  • Swift JSC and other engines
  • "serverless" functions
  • internet explorer

可選模塊

可選特點 (點擊顯示詳情) node版本自動要求模塊提供其他的特性。某些模塊的文件相當大而且僅在一些特殊的場景下才會用到,因此不應該把他們當做核心部分一起加載。在瀏覽器中用到這些模塊時,可以用下面的方式進行加載:

<!-- international support from js-codepage -->
<script src="dist/cpexcel.js"></script>

每一個依賴合適的版本可以放在 dist/directory 目錄下。
完整的單文件版本在 dist/xlsx.full.min.js 文件里面。
默認情況下,Webpack和Browserify構建包含可選的模塊。可以通過配置Webpack移除對 resolve.alias 的支持:

  /* uncomment the lines below to remove support */
resolve: { 

alias: { 
 "./dist/cpexcel.js": "" } // <-- omit international support
}

ECMAScript 5 的兼容性

自從庫使用了像 Array#forEach 這樣的函數,老版本的瀏覽器需要shim 提供缺少的函數。

要在加載 xlsx.js 的script標簽之前添加shim,才能使用它。

<!-- add the shim first -->
<script type="text/javascript" src="shim.min.js"></script>
<!-- after the shim is referenced, add the library -->
<script type="text/javascript" src="xlsx.full.min.js"></script>

shim.min.js也包括了在IE6-9中用于加載和保存文件的 IE_LoadFileIE_SaveFile。對于適用于Photoshop和其它的Adobe產品的格式,xlsx.extendscript.js腳本會綁定shim。

原理

原理 (點擊顯示詳情) 在SheetJS之前,處理電子表格文件的接口只能用于特定的格式。許多第三方庫要么支持一種格式,要么為每一種支持的文件類型提供一個不同的類集。雖然在Excel 2007里面引入了XLSB,但只有Sheet和Excel支持這種格式。

為了提高不可知格式的顯示,js-xlsx使用了被稱作[“Common Spreadsheet Format”]的純JS的顯示方法(#common-spreadsheet-format)。強調一種統一的顯示方式,能夠有一些特點,比如格式轉換和嵌套class tap。通過提取出各種格式的復雜性,工具沒有必要擔心特定的文件類型。

一個簡單的的對象顯示和細心的代碼練習相結合,能讓示例運行在較老的瀏覽器以及像ExtendScriptWeb Workers這樣可選擇的環境里執行。雖然很想使用最新的和最好的特性,不過這些特性需要最新的瀏覽器,用以限制兼容性。

工具函數捕獲通用的使用例子,比如生成JS對象或HTML。大多數簡單例子的操作只要幾行代碼。大多數復雜的普遍的復雜操作應該直截了當的生成。

在Excel 2007種,Excel添加XSLX格式作為默認的起始端。然而,有一些其他格式會更多的出現上述的屬性。例如,XLSB格式XLSX格式相似,不過文件會使用一半的空間,而且也會更開的打開文件。雖然XLSX編寫器可以使用,但是其他格式的編寫器也可以使用,因此使用者能夠充分利用每一種格式獨特的特點。社區版本的主要關注點在正確的數據轉換,即從任意一個兼容的數據表示中提取數據,導出適用于任意第三方接口的各種數據格式。

解析工作簿

對于解析,第一步是讀取文件。這一步包括獲取數據并且導入數據庫。這里有一些常用的例子。

nodejs讀取文件 (點擊顯示詳情) `readFile` 只能在服務器環境中使用。瀏覽器沒有用于讀取任意指定路徑文件的API,因此必須使用另外的策略。 “`js if(typeof require !== ‘undefined’) XLSX = require(‘xlsx’); var workbook = XLSX.readFile(‘test.xlsx’); /* DO SOMETHING WITH workbook HERE */ “`
Photoshop ExtendScript讀取文件 (點擊顯示詳情)

readFile 用Photoshop和其他的ExtendScript目標把邏輯File包起來。需要指定文件的絕對路徑

#include "xlsx.extendscript.js"
/* Read test.xlsx from the Documents folder */
var workbook = XLSX.readFile(Folder.myDocuments + '/' + 'test.xlsx');
/* DO SOMETHING WITH workbook HERE */

extendscript 包含了一個更復雜的例子。

瀏覽器從頁面讀取TABLE元素 (點擊顯示詳情) `table_to_book` 和 `table_to_sheet`工具函數獲取DOM的TABLE元素,并且通過子節點進行迭代。

var workbook = XLSX.utils.table_to_book(document.getElementById('tableau'));
/* DO SOMETHING WITH workbook HERE */

一個網頁里面的多張表可以被轉換成單個的工作表。

/* create new workbook */
var workbook = XLSX.utils.book_new();
/* convert table 'table1' to worksheet named "Sheet1" */
var ws1 = XLSX.utils.table_to_sheet(document.getElementById('table1'));
XLSX.utils.book_append_sheet(workbook, ws1, "Sheet1");
/* convert table 'table2' to worksheet named "Sheet2" */
var ws2 = XLSX.utils.table_to_sheet(document.getElementById('table2'));
XLSX.utils.book_append_sheet(workbook, ws2, "Sheet2");
/* workbook now has 2 worksheets */

另一種選擇,HTML代碼也可以被提取和解析。

var htmlstr = document.getElementById('tableau').outerHTML;
var workbook = XLSX.read(htmlstr, { 
type:'string'});

瀏覽器下載文件(ajax) (點擊顯示詳情) 注意:對于運行在老版瀏覽器里更完整的例子,請查看示例

var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";
/* set up async GET request */
var req = new XMLHttpRequest();
req.open("GET", url, true);
req.responseType = "arraybuffer";
req.onload = function(e) { 

var data = new Uint8Array(req.response);
var workbook = XLSX.read(data, { 
type:"array"});
/* DO SOMETHING WITH workbook HERE */
}
req.send();

瀏覽器拖拽 (點擊顯示詳情) 拖拽使用了HTML5 的 `FileReader` API,加載數據時使用`readAsBinaryString` 或 `readAsArrayBuffer`。但并不是所有的瀏覽器都支持全部的 `FileReader` API,因此非常推薦動態的特性檢測。

var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer
function handleDrop(e) { 

e.stopPropagation(); e.preventDefault();
var files = e.dataTransfer.files, f = files[0];
var reader = new FileReader();
reader.onload = function(e) { 

var data = e.target.result;
if(!rABS) data = new Uint8Array(data);
var workbook = XLSX.read(data, { 
type: rABS ? 'binary' : 'array'});
/* DO SOMETHING WITH workbook HERE */
};
if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f);
}
drop_dom_element.addEventListener('drop', handleDrop, false);

瀏覽器通過form元素上傳文件 (點擊顯示詳情)

來自file input元素的數據能夠被和拖拽例子中相同的FileReaderAPI處理。

var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer
function handleFile(e) { 

var files = e.target.files, f = files[0];
var reader = new FileReader();
reader.onload = function(e) { 

var data = e.target.result;
if(!rABS) data = new Uint8Array(data);
var workbook = XLSX.read(data, { 
type: rABS ? 'binary' : 'array'});
/* DO SOMETHING WITH workbook HERE */
};
if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f);
}
input_dom_element.addEventListener('change', handleFile, false);

oldie示例展示了一個IE兼容性的回退方案。

包括移動App文件處理等更多的使用例子可以在included demos中查看。

流式讀取文件

為什么沒有流式讀取API? (點擊顯示詳情)

最常用的和最令人感興趣的格式(XLS, XLSX/M, XLSB, ODS)最終都是ZIP或CFB文件容器。兩種格式都不會放目錄結構在文件開頭:ZIP文件把主要的目錄記錄放在邏輯文件的結尾,然而CFB文件可以把存儲信息放在文件的任何地方。所以,為了正確地處理這些格式,流式函數必須在開始之前緩存整個文件。這樣證明了流式的期待的錯誤,因此我們不提供任何流式閱讀API。

當處理可讀流時,最簡單的方式是緩存流,并且最后再去處理整個文件。這可以通過臨時文件或者是顯式連接流來實現。

顯式連接流 (點擊顯示詳情)

var fs = require('fs');
var XLSX = require('xlsx');
function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{ 

var buffers = [];
stream.on('data', function(data) { 
 buffers.push(data); });
stream.on('end', function() { 

var buffer = Buffer.concat(buffers);
var workbook = XLSX.read(buffer, { 
type:"buffer"});
/* DO SOMETHING WITH workbook IN THE CALLBACK */
cb(workbook);
});
}

使用像concat-stream這樣的模塊會有更多有效的解決辦法可以使用。

首先寫入文件系統 (點擊顯示詳情)

這個例子使用tempfile生成文件名。

var fs = require('fs'), tempfile = require('tempfile');
var XLSX = require('xlsx');
function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{ 

var fname = tempfile('.sheetjs');
console.log(fname);
var ostream = fs.createWriteStream(fname);
stream.pipe(ostream);
ostream.on('finish', function() { 

var workbook = XLSX.readFile(fname);
fs.unlinkSync(fname);
/* DO SOMETHING WITH workbook IN THE CALLBACK */
cb(workbook);
});
}

使用工作簿

完整的對象格式會在本文件的后面部分進行介紹。

讀取指定的單元格 (點擊顯示詳情)

這個例子提取first工作表中A1單元格的存儲值:

var first_sheet_name = workbook.SheetNames[0];
var address_of_cell = 'A1';
/* Get worksheet */
var worksheet = workbook.Sheets[first_sheet_name];
/* Find desired cell */
var desired_cell = worksheet[address_of_cell];
/* Get the value */
var desired_value = (desired_cell ? desired_cell.v : undefined);

在工作簿中增加新的工作表 (點擊顯示詳情)

例子中使用XLSX.utils.aoa_to_sheet生成工作表,使用XLSX.utils.book_append_sheet把表添加到工作簿中。

var new_ws_name = "SheetJS";
/* make worksheet */
var ws_data = [
[ "S", "h", "e", "e", "t", "J", "S" ],
[  1 ,  2 ,  3 ,  4 ,  5 ]
];
var ws = XLSX.utils.aoa_to_sheet(ws_data);
/* Add the worksheet to the workbook */
XLSX.utils.book_append_sheet(wb, ws, ws_name);

從頭開始創建工作簿 (點擊顯示詳情)

工作簿對象包含一個SheetNames名稱數組和一個Sheets對象,用來將表名映射到表對象。XLSX.utils.book_new工具函數創建一個新的工作簿對象:

/* create a new blank workbook */
var wb = XLSX.utils.book_new();

新的工作簿是空白的而且不包含工作表。如果工作簿,那么寫入函數將會出錯。

解析和編寫示例

  • http://sheetjs.com/demos/modify.html read + modify + write files

  • https://github.com/SheetJS/js-xlsx/blob/master/bin/xlsx.njs node

node安裝一個能夠讀取電子數據表和輸出各種格式的命令行工具 xlsx。源碼可以在 bin 目錄下的xlsx.njs里面找到。

XLSX.utils中的一些輔助函數會生成不同的工作表視圖。

  • XLSX.utils.sheet_to_csv 生成CSV文件
  • XLSX.utils.sheet_to_txt 生成UTF16的格式化文本
  • XLSX.utils.sheet_to_html 生成HTML
  • XLSX.utils.sheet_to_json 生成一個對象數組
  • XLSX.utils.sheet_to_formulae 生成一張公示列表

編寫工作簿

對編寫而言,第一步是生成導出數據。輔助函數writewriteFile將會生成各種適合分發的數據格式。第二步是和端點實際的共享數據。假設workbook是一個工作簿對象。

nodejs寫入文件 (點擊顯示詳情)

XLSX.writeFile uses fs.writeFileSync in server environments:

if(typeof require !== 'undefined') XLSX = require('xlsx');
/* output format determined by filename */
XLSX.writeFile(workbook, 'out.xlsb');
/* at this point, out.xlsb is a file that you can distribute */

Photoshop ExtendScript 寫入文件 (點擊顯示詳情)

writeFileFile包裹在 Photoshop 和 other ExtendScript 目標里面。指定的路徑應該是絕對路徑。

#include "xlsx.extendscript.js"
/* output format determined by filename */
XLSX.writeFile(workbook, 'out.xlsx');
/* at this point, out.xlsx is a file that you can distribute */

extendscript 示例包含有更復雜的例子。

瀏覽器將TABLE元素添加到頁面 (點擊顯示詳情)

sheet_to_html工具函數生成能被添加到任意DOM元素的HTML代碼。

var worksheet = workbook.Sheets[workbook.SheetNames[0]];
var container = document.getElementById('tableau');
container.innerHTML = XLSX.utils.sheet_to_html(worksheet);

瀏覽器上傳文件(ajax) (點擊顯示詳情)

XHR 的完整的復雜示例可以在 XHR示例 中查看,獲取和包裝器庫的例子也可以包含在里面。例子中假設服務器能處理Base64編碼的文件(查看基本的莫得服務器示例)。

/* in this example, send a base64 string to the server */
var wopts = { 
 bookType:'xlsx', bookSST:false, type:'base64' };
var wbout = XLSX.write(workbook,wopts);
var req = new XMLHttpRequest();
req.open("POST", "/upload", true);
var formdata = new FormData();
formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name
formdata.append('data', wbout); // <-- `data` holds the base64-encoded data
req.send(formdata);

瀏覽器保存文件 (點擊顯示詳情)

XLSX.writeFile 包含了一些用于觸發文件保存的方法。

  • URL瀏覽器API為文件創建一個URL對象,通過創建a標簽并給他添加click事件就可以使用URL對象。現代瀏覽器都支持這個方法。
  • msSaveBlob是IE10及IE10以上用來觸發文件保存的API。
  • 對于Windows XP 和 Windows 7里面的IE6和IE6以上的以上瀏覽器,IE_FileSave 使用 VBScript 和 ActiveX 來寫入文件。s補充程序(shim)必須包含在包含的HTML頁面中。

并沒有標準的方法判斷是否真實的文件已經被下載了。

/* output format determined by filename */
XLSX.writeFile(workbook, 'out.xlsb');
/* at this point, out.xlsb will have been downloaded */

瀏覽器保存文件(兼容性) (點擊顯示詳情)

XLSX.writeFile方法在大多數的現代瀏覽器以及老版本的瀏覽器中都能使用。對于更老的瀏覽器,wrapper庫里面有變通的方法可以應用。

FileSaver.js 執行 saveAs方法。

注意:如果saveAs方法可以使用,XLSX.writeFile會自動調用。

/* bookType can be any supported output type */
var wopts = { 
 bookType:'xlsx', bookSST:false, type:'array' };
var wbout = XLSX.write(workbook,wopts);
/* the saveAs call downloads a file on the local machine */
saveAs(new Blob([wbout],{ 
type:"application/octet-stream"}), "test.xlsx");

Downloadify使用Flash SWF按鈕生成本地文件,即使是ActiveX不能使用的環境也適用。

Downloadify.create(id,{ 

/* other options are required! read the downloadify docs for more info */
filename: "test.xlsx",
data: function() { 
 return XLSX.write(wb, { 
bookType:"xlsx", type:'base64'}); },
append: false,
dataType: 'base64'
});

oldie示例展示了IE向后兼容的場景。

included demos包含了移動app和其他專門的部署。

寫入示例

  • http://sheetjs.com/demos/table.html 導出一個 HTML table
  • http://sheetjs.com/demos/writexlsx.html 生成一個簡單文件

流式寫入

XLSX.stream對象中可以使用流式寫入函數。流式函數像普通的函數一樣傳入相同的參數,不過返回一個可讀流。但是他們只暴露在Nodejs中。

  • XLSX.stream.to_csvXLSX.utils.sheet_to_csv的流式版本。
  • XLSX.stream.to_htmlXLSX.utils.sheet_to_html的流式版本。
  • XLSX.stream.to_jsonXLSX.utils.sheet_to_json的流式版本。

nodejs轉換成CSV并寫入文件 (點擊顯示詳情)

var output_file_name = "out.csv";
var stream = XLSX.stream.to_csv(worksheet);
stream.pipe(fs.createWriteStream(output_file_name));

nodejs將JSON流輸出到屏幕 (點擊顯示詳情)

/* to_json returns an object-mode stream */
var stream = XLSX.stream.to_json(worksheet, { 
raw:true});
/* the following stream converts JS objects to text via JSON.stringify */
var conv = new Transform({ 
writableObjectMode:true});
conv._transform = function(obj, e, cb){ 
 cb(null, JSON.stringify(obj) + "\n"); };
stream.pipe(conv); conv.pipe(process.stdout);

https://github.com/sheetjs/sheetaki pips將可寫流寫入nodejs響應。

接口

XLSX是瀏覽器暴露出來可以使用的方法,導出到node中能夠使用的XLSX.versionXLSX庫的版本(通過構建腳本添加)。XLSX.SSF是格式化庫的嵌入版本。

解析函數

XLSX.read(data, read_opts) 用來解析數據 data
XLSX.readFile(filename, read_opts) 用來讀取文件名 filename 并且解析。解析選項會在解析選項部分闡述。

寫入函數

XLSX.write(wb, write_opts) 用來寫入工作簿 wb
XLSX.writeFile(wb, filename, write_opts)wb 寫入到特定的文件 filename 中。如果是基于瀏覽器的環境,此函數會強制瀏覽器端下載。
XLSX.writeFileAsync(filename, wb, o, cb)wb 寫入到特定的文件 filename 中。如果 o 被省略,寫入函數會使用第三個參數作為回調函數。

XLSX.stream 包含一組流式寫入函數的集合。

寫入選項會在寫入選項部分部分進行闡述。

工具

XLSX.utils對象中的工具函數都可以使用,工具函數在工具函數部分進行闡述。

導入:

  • aoa_to_sheet 把轉換JS數據數組的數組為工作表。
  • json_to_sheet 把JS對象數組轉換為工作表。
  • table_to_sheet 把DOM TABLE元素轉換為工作表。
  • sheet_add_aoa 把JS數據數組的數組添加到已存在的工作表中。
  • sheet_add_json 把JS對象數組添加到已存在的工作表中。

導出:

  • sheet_to_json 把工作表轉換為JS對象數組。
  • sheet_to_csv 生成分隔符隔開值的輸出。
  • sheet_to_txt 生成UTF16格式化的文本。
  • sheet_to_html 生成HTML輸出。
  • sheet_to_formulae 生成公式列表(帶有值回退)。

單元格和單元格地址的操作:

  • format_cell 生成文本類型的單元格值(使用數字格式)。
  • encode_row / decode_row 在0索引行和1索引行之間轉換。
  • encode_col / decode_col 在0索引列和列名之間轉換。
  • encode_cell / decode_cell 轉換單元格地址。
  • encode_range / decode_range 轉換單元格的范圍。

常用的數據表格式(Common Spreadsheet Format)

js-xlsx符合常用的數據表格式(CSF)。

一般結構

單元格地址對象的存儲格式為{c:C, r:R},其中CR分別代表的是0索引列和行號。例如單元格地址B5用對象{c:1, r:4}表示。

單元格范圍對象存儲格式為{s:S, e:E},其中S是第一個單元格,E是最后一個單元格。范圍是包含關系。例如范圍 A3:B7用對象{s:{c:0, r:2}, e:{c:1, r:6}}表示。當遍歷數據表范圍時,工具函數執行行優先命令。

for(var R = range.s.r; R <= range.e.r; ++R) { 

for(var C = range.s.c; C <= range.e.c; ++C) { 

var cell_address = { 
c:C, r:R};
/* if an A1-style address is needed, encode the address */
var cell_ref = XLSX.utils.encode_cell(cell_address);
}
}

單元格對象

單元格對象是純粹的JS對象,它的keys和values遵循下列的約定:

Key Description
v 原始值(查看數據類型部分獲取更多的信息)
w 格式化文本(如果可以使用)
t 內行: b Boolean, e Error, n Number, d Date, s Text, z Stub
f 單元格公式編碼為A1樣式的字符串(如果可以使用)
F 如果公式是數組公式,則包圍數組的范圍(如果可以使用)
r 富文本編碼 (如果可以使用)
h 富文本渲染成HTML (如果可以使用)
c 與單元格關聯的注釋
z 與單元格關聯的數字格式字符串(如果有必要)
l 單元格的超鏈接對象 (.Target 長聯接, .Tooltip 是提示消息)
s 單元格的樣式/主題 (如果可以使用)

如果w文本可以使用,內置的導出工具(比如CSV導出方法)就會使用它。要想改變單元格的值,在打算導出之前確保刪除cell.w(或者設置 cell.wundefined)。工具函數會根據數字格式(cell.z)和原始值(如果可用)重新生成w文本。

真實的數組公式存儲在數組范圍中第一個單元個的f字段內。此范圍內的其他單元格會省略f字段。

數據類型

原始值被存儲在v值屬性中,用來解釋基于t類型的屬性。這樣的區別允許用于數字和數字類型文本的展示。下面有6種有效的單元格類型。

Type Description
b Boolean: 值可以理解為JS boolean
e Error: 值是數字類型的編碼,而且w屬性存儲共同的名稱 **
n Number: 值是JS number **
d Date: 值是 JS Date 對象或者是被解析為Date的字符串 **
s Text: 值可以理解為 JS string 并且被寫成文本 **
z Stub: 被數據處理工具函數忽略的空白子單元格 **

Error 值以及含義 (點擊顯示詳情)

Value Error 含義
0x00 #NULL!
0x07 #DIV/0!
0x0F #VALUE!
0x17 #REF!
0x1D #NAME?
0x24 #NUM!
0x2A #N/A
0x2B #GETTING_DATA

n表示Number類型。n包括了所有被Excel存儲為數字的數據表,比如dates/times和Boolean字段。Excel專門使用能夠被IEEE754浮點數表示的數據,比如JS Number,所以字段 v 保存原始數字。w字段保持格式化文本。Dates 默認存儲為數字,使用XLSX.SSF.parse_date_code進行轉換。

類型 d表示日期類型,只有當選項為cellDates才會生成日期類型。因為JSON沒有普通的日期類型,所以希望解析器存儲的日期字符串像從date.toISOString()中獲取的一樣。另一方面,寫入函數和導出函數也可以處理日期字符串和JS日期對象。需要注意Excel會忽略時區修飾符,并且處理所有本地時區的日期。代碼庫沒有改正這個錯誤。

類型z表示空白的存根單元格。生成存根單元格是為了以防萬一單元格沒有被賦予指定值,但是保留了注釋或者是其他的元數據。存根單元格會被核心庫的數據處理工具函數忽略。默認情況下不會生成存根單元格,只有當解析器sheetStubs的選項被設為true時才會生成。

日期

Excel 日期編碼的細節 (點擊顯示詳情)

默認情況下,Excel把日期存儲為數字,并用指定的日期處理格式編碼進行處理。例如,日期19-Feb-17被存儲為數字42785,數字格式為d-mmm-yySSF模塊了解數字格式并進行適當的轉換。

XSLX也支持特定的日期類型d,它的數據是ISO 8601日期字符串。格式化工具把日期還原為數字。

所有解析器的默認行為是生成數字單元格。設置cellDates為true會強制生成器存儲日期。

時區和日期 (點擊顯示詳情)

Excel沒有原生的通用時間的概念。所有的時間都會在本地時區指定。Excel限制指定真正的絕對日期。

對于下面的Excel,代碼庫將所有的日期視為相對于當地時區的日期。

時期:1900年和1904年 (點擊顯示詳情)

Excel支持兩種時期(January 1 1900和January 1 1904),查看“1900 vs. 1904 Date System” article。工作簿的時期可以通過測試工作簿的wb.Workbook.WBProps.date1904屬性來決定:

!!(((wb.Workbook||{ 
}).WBProps||{ 
}).date1904)

數據表對象

每一個不以!開始的key都會映射到一個單元格(用A-1符合)。sheet[address] 返回指定地址的單元格對象。

指定的數據表屬性(通過 sheet[key]訪問, 每一個都以 !開始):

  • sheet['!ref']:A-1的范圍是基于表示數據表的范圍。操作數據表的函數應該使用這個參數來決定操作范圍。此范圍之外指定的單元格不會被處理。尤其是手動編寫數據表時,范圍之外的單元格不會被包含在其中。

處理數據表的函數應該對!ref的存在進行檢測。如果!ref被忽略或者不是有效的范圍,函數就可以吧數據表看做是空表或者嘗試猜范圍。詞庫附帶的工具函數會將工作表視為空(例如CSV的輸出是空字符串)。

當用sheetRows屬性集讀取工作表時,ref參數會使用限制的范圍。最初的范圍通過ws['!fullref']設置。

  • sheet['!margins']sheet['!margins']對象表示頁面的邊距。默認值遵循Excel的常規設置。Excel也有”wide”和”narrow”的設置,不過他們都被存儲為原生的尺寸。主要的屬性已在下表列出:

頁面邊距詳情 (點擊顯示詳情)

key description “normal” “wide” “narrow”
left left margin (inches) 0.7 1.0 0.25
right right margin (inches) 0.7 1.0 0.25
top top margin (inches) 0.75 1.0 0.75
bottom bottom margin (inches) 0.75 1.0 0.75
header header margin (inches) 0.3 0.5 0.3
footer footer margin (inches) 0.3 0.5 0.3
/* Set worksheet sheet to "normal" */
ws["!margins"]={ 
left:0.7, right:0.7, top:0.75,bottom:0.75,header:0.3,footer:0.3}
/* Set worksheet sheet to "wide" */
ws["!margins"]={ 
left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5,footer:0.5}
/* Set worksheet sheet to "narrow" */
ws["!margins"]={ 
left:0.25,right:0.25,top:0.75,bottom:0.75,header:0.3,footer:0.3}

工作表對象

除了基本的數據表關鍵字之外,工作表還增加了下面的內容:

  • ws['!cols']:返回列屬性對象的數組。實際上的列寬使用統一的方式存儲在文件里,寬度的測量依據最大數字寬度(在像素中,最大的渲染寬度是數字0-9)。渲染時,列對象用wpx字段存儲像素寬度,用wch存儲字符寬度,用MDW字段存儲最大數字寬度。

  • ws['!rows']: 返回行屬性對象的數組,后面的文檔會進行闡述。每一個行對象編碼屬性包括行高和能見度。

  • ws['!merges']: 返回與工作表中合并單元格相對應的范圍對象的數組。純文本格式不支持合并單元格。如果合并的單元格存在,CSV導出將會把所有的單元格寫入合并范圍,因此確保在合并的范圍內只有第一個單元格(左上角的單元格)被設置。

  • ws['!protect']: 寫入數據表保護屬性的對象。password鍵為支持密碼保護的數據表(XLSX/XLSB/XLS)指定密碼。寫入函數會使用XOR模糊方式。下面key控制數據表保護–數據表被鎖定時設置key為false可以使用feature,或者設為true禁用feature。

工作表保護詳情 (點擊顯示詳情)

key feature (true=disabled / false=enabled) default
selectLockedCells Select locked cells enabled
selectUnlockedCells Select unlocked cells enabled
formatCells Format cells disabled
formatColumns Format columns disabled
formatRows Format rows disabled
insertColumns Insert columns disabled
insertRows Insert rows disabled
insertHyperlinks Insert hyperlinks disabled
deleteColumns Delete columns disabled
deleteRows Delete rows disabled
sort Sort disabled
autoFilter Filter disabled
pivotTables Use PivotTable reports disabled
objects Edit objects enabled
scenarios Edit scenarios enabled
  • ws['!autofilter']: 自動篩選下面的模式:
type AutoFilter = { 

ref:string; // A-1 based range representing the AutoFilter table range
}

圖表對象

圖表會被顯示為標準的數據表。要注意和!type被設置為"chart"的屬性進行區分。

底層數據和!ref指的是圖表中的緩存數據。 圖表的第一行是底層標題。

宏對象

宏對象會被顯示為標準的數據表。注意與!type設置為"macro"的屬性進行區分。

對話框對象

對話框對象會被顯示為標準的數據表。注意與!type設置為"dialog"的屬性進行區分。

工作簿對象

workbook.SheetNames 是工作簿內工作表的有序列表。

wb.Sheets[sheetname] 返回一個表示工作表的對象。

wb.Props 是一個存儲標準屬性的對象。wb.Custprops 存儲自定義的屬性。因為XLS標準屬性偏離了XLSX標準,所以XLS解析把核心的屬性存儲在兩個屬性中。

wb.Workbook 存儲工作簿級別的特性.

工作簿文件屬性

各種各樣的文件格式為不同的文件屬性使用不同的內置名稱。工作簿的Props對象用來規范這些名稱。

文件屬性 (點擊顯示詳情)

JS Name Excel Description
Title Summary tab “Title”
Subject Summary tab “Subject”
Author Summary tab “Author”
Manager Summary tab “Manager”
Company Summary tab “Company”
Category Summary tab “Category”
Keywords Summary tab “Keywords”
Comments Summary tab “Comments”
LastAuthor Statistics tab “Last saved by”
CreatedDate Statistics tab “Created”

例如設置工作簿的title屬性:

if(!wb.Props) wb.Props = { 
};
wb.Props.Title = "Insert Title Here";

自定義的屬性會被添加到工作簿的Custom對象中:

if(!wb.Custprops) wb.Custprops = { 
};
wb.Custprops["Custom Property"] = "Custom Value";

寫入函數將會處理選項對象的Props鍵:

/* force the Author to be "SheetJS" */
XLSX.write(wb, { 
Props:{ 
Author:"SheetJS"}});

工作簿級別的特性

wb.Workbook 存儲工作簿級別的特性。

定義名稱

wb.Workbook.Names 是一個定義名稱對象的數組,這些名稱對象都有鍵:

定義名稱屬性 (點擊顯示)

Key Description
Sheet 名稱的范圍。 數據表的索引 (0 = 第一章張數據表) 或null (工作簿)
Name 區分大小寫的名稱。 標準的規則應用**
Ref A1單元格樣式的引用 ("Sheet1!$A$1:$D$20")
Comment 注釋 (只適用于XLS/XLSX/XLSB)

Excel 允許兩個表格范圍定義的名稱共享相同的名稱。但是一個表格范圍的名稱不能和一個工作簿范圍的名稱相沖突。工作簿寫入函數不強制這樣的約束。

工作簿視圖

wb.Workbook.Views 是一個工作簿視圖對象數組,這些視圖對象有keys。

Key Description
RTL 如果值為true,從左到右的顯示

混合的工作簿屬性

Key Description
CodeName VBA Project Workbook Code Name
date1904 時間: 0/false 表示1900系統時間, 1/true 表示1904系統時間
filterPrivacy 警告或去除存儲的個人驗證信息

文檔特點

即使是想存儲數據這樣的基本特點,官方的Excel格式也會用不同的方式存儲相同的內容。期望解析器從底層文件格式轉換為通用的電子表格格式。期望編寫器將CSF格式轉換回基本的文件格式。

公式

A1單元格樣式字符串被存儲在f字段中。雖然不同的文件格式用不同的方式存儲文件格式,不過這些格式都需要被翻譯。雖然一些格式存儲的公式有一個前導等號,但是CSF公式不以=開始。

A1=1, A2=2, A3=A1+A2的顯示 (點擊展示詳情)

{ 

"!ref": "A1:A3",
A1: { 
 t:'n', v:1 },
A2: { 
 t:'n', v:2 },
A3: { 
 t:'n', v:3, f:'A1+A2' }
}

共享的公式會被解壓縮,并且每一個單元格都有相應的公式。編寫器通常不會嘗試去生成共享公式。

有公式記錄但是沒有值的單元格會被序列化,序列化的方式能夠被Excel和其他電子表格工具將會識別。這個代碼庫將不會自動計算公式結果!例如去計算工作表中的BESSELJ

沒有已知值的公式 (點擊顯示詳情)

{ 

"!ref": "A1:A3",
A1: { 
 t:'n', v:3.14159 },
A2: { 
 t:'n', v:2 },
A3: { 
 t:'n', f:'BESSELJ(A1,A2)' }
}

數組公式

數組公式被存儲在數組塊左上角的單元格內。一個數組公式的所有單元格都會有于該范圍對應的F字段。一個單一的單元格公式要注意于F字段所存儲的純公式進行區分。

數組公式示例 (點擊顯示詳情)

例如設置單元格C1為數組公式{=SUM(A1:A3*B1:B3)}

worksheet['C1'] = { 
 t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" };

對于多個單元格的數組公式,每一個單元格都有相同的數組范圍,不過只有第一個單元格指定公式。考慮D1:D3=A1:A3*B1:B3

worksheet['D1'] = { 
 t:'n', F:"D1:D3", f:"A1:A3*B1:B3" };
worksheet['D2'] = { 
 t:'n', F:"D1:D3" };
worksheet['D3'] = { 
 t:'n', F:"D1:D3" };

工具函數和編寫器被用來檢查F字段的存在,并且忽略單元格內任何可能的公式元素f,這些單元格并不包含起始單元格。這些操作函數并不會被要求執行公式的校驗。

公式輸出工具函數 (點擊顯示詳情)

sheet_to_formulae方法生成為每個公式或者是數組公式生成一行。數組公式被渲染在range=formula的表格內,而純單元格被渲染在cell=formula or value的表格內。注意字符串的迭代會有前綴符號',與Excel公式欄顯示的一致。

公式文件格式細節 (點擊顯示詳情)

Storage Representation Formats Read Write
A1-style strings XLSX ⭕️ ⭕️
RC-style strings XLML and plain text ⭕️ ⭕️
BIFF Parsed formulae XLSB and all XLS formats ⭕️
OpenFormula formulae ODS/FODS/UOS ⭕️ ⭕️

因為Excel禁止單元格的命名與A1的名稱或者是RC樣式單元格引用相沖突,可能會進行不是那么簡單的正則變化。DIFF解析的公式必須被明確的解開。OpenFormula可以轉換正則表達式。

列屬性

每張表都會有!cols數組,如果展開的話就是ColInfo的一個集合,有下列的屬性:

type ColInfo = { 

/* visibility */
hidden?: boolean; // if true, the column is hidden
/* column width is specified in one of the following ways: */
wpx?:    number;  // width in screen pixels
width?:  number;  // width in Excel's "Max Digit Width", width*256 is integral
wch?:    number;  // width in characters
/* other fields for preserving features from files */
MDW?:    number;  // Excel's "Max Digit Width" unit, always integral
};

為什么有三種寬度類型? (點擊顯示詳情) 有三種不同的寬度類型對應于電子數據表存儲列寬的三種不同方式。

SYLK和其他的純文本格式使用原生的字符計算。像Visicalc和Multiplan這樣的同時期的工具是基于字符的。因為字符有相同的寬度,足以存儲一個計數。這樣的傳統也延續到了BIFF格式。

SpreadsheetML (2003) 嘗試通過標準化整個文件中的屏幕像素計數來與HTML對齊。列寬、行高以及其他的測量使用像素。當像素和字符數量不一致時,Excel四舍五入結果。

XLSX內部用一個模糊的”最大數位寬度”表存儲列寬。最大數字寬度是渲染時最大數字的寬度,通常字符”0″是最寬的。內部的寬度必須是寬度除以256的整數倍。ECMA-376介紹了一個公式用于像素和內部寬度之間的轉換。這代表一種混合的方式。

讀取函數嘗試去填充全部的三種屬性。寫函數努力嘗試將指定值循環到所需類型。為了阻止潛在的沖突。首先操作應該要刪除其他的屬性。列入,當改變像素寬度時,刪除wchwidth屬性。

執行細節 (點擊顯示詳情)

給出的這些約束可能決定了MDW沒有檢查字體!解析器通過從寬度轉換為像素并返回來猜測像素寬度,重復所有可能的MDW并選擇最小化村務的MDW。XLML實際上存儲額像素寬度,所以猜想會在相反的方向運行。

即使所有的信息都是可用的,也會期望寫入函數遵循下面的優先級順序:

  1. 如果 width 字段可用,優先使用width
  2. 如果 wpx 字段可用,請使用wpx
  3. 如果 wch 字段可用,請使用wch

行屬性

如果!rows 數組在每張電子表中都存在,那就是一個RowInfo對象的集合,集合包含一下的屬性:

type RowInfo = { 

/* visibility */
hidden?: boolean; // if true, the row is hidden
/* row height is specified in one of the following ways: */
hpx?:    number;  // height in screen pixels
hpt?:    number;  // height in points
level?:  number;  // 0-indexed outline / group level
};

注意:Excel UI顯示基本大綱級別為1,最大級別為8level字段存儲基本大綱級別為0,最大級別為7

實現細節 (點擊展示詳情)

Excel內部以點為單位存儲行高。默認的分辨率是72DPI或者是96DPI,所以像素和點的大小應該相同。不同的分辨率他們可能不同,因此庫分開了這些概念:

即使所有的信息都可用,寫入函數也應該遵循下面的優先級順序:
1)如果hpx可用,就使用 hpx像素高度。
2) 如果hpx可用,就使用 hpx像素高度。

數字格式

對于每一個單元格而言,cell.w的文本來自于cell.vcell.z格式。如果格式沒有指定,ExcelGeneral格式就會被使用。格式要么是指定的的字符串要么是格式表內的一個索引。解析器應該用數字格式表來填充workbook.SSF。寫入函數用來序列化這個表。

自定義的工具應該確保本地表的表內有各自的格式字符串。Excel約定規定自定義的格式以索引164開頭。下面的例子從頭創建了一個自定義的格式:

自定義格式的新工作簿 (點擊顯示詳情)

var wb = { 

SheetNames: ["Sheet1"],
Sheets: { 

Sheet1: { 

"!ref":"A1:C1",
A1: { 
 t:"n", v:10000 },                    // <-- General format
B1: { 
 t:"n", v:10000, z: "0%" },           // <-- Builtin format
C1: { 
 t:"n", v:10000, z: "\"T\"\ #0.00" }  // <-- Custom format
}
}
}

這些規則和Excel如何顯示自定義的數字格式稍微有些區別。特別是文字字符必須必包含在雙引號里面或者在反斜杠之前。更多信息,查看Excel文檔Create or delete a custom number format 或者是ECMA-376 18.8.31(數字格式)。

默認的數字格式 (點擊展示詳情)

ECMA-376 18.8.30里列出的默認格式:

ID Format
0 General
1 0
2 0.00
3 #,##0
4 #,##0.00
9 0%
10 0.00%
11 0.00E+00
12 # ?/?
13 # ??/??
14 m/d/yy (see below)
15 d-mmm-yy
16 d-mmm
17 mmm-yy
18 h:mm AM/PM
19 h:mm:ss AM/PM
20 h:mm
21 h:mm:ss
22 m/d/yy h:mm
37 #,##0 ;(#,##0)
38 #,##0 ;[Red](#,##0)
39 #,##0.00;(#,##0.00)
40 #,##0.00;[Red](#,##0.00)
45 mm:ss
46 [h]:mm:ss
47 mmss.0
48 ##0.0E+0
49 @

格式14(m/d/yy)被Excel本地化:即使文件指明了數字格式,也會根據系統設置用不同的方式繪制。當文件的的生產者和使用者都在相同的區域時這會很有用,不過對于網絡上的例子就會不同。為了避免歧義,解析函數接受dateNF選項覆蓋指定格式字符串的解釋。

超鏈接

超鏈接存儲在單元格對象的l關鍵字內。超鏈接對象的Target字段是連接目標,包括了URI片段。工具提示被存儲在Tooltip字段內,當移動鼠標到文字上方就會顯示。

例如下方的片段在單元格A3內創建了一個指向http://sheetjs.com的鏈接,提示信息是"Find us @ SheetJS.com!"

ws['A3'].l = { 
 Target:"http://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };

注意Excel并不會自動為超鏈接添加樣式–他們通常會向普通文本一樣顯示。

如果鏈接的目標是一個單元格或者是范圍又或者是在相同的工作簿內定義名字(“Internal Links”),那么鏈接的開頭會有一個哈希字符標識:

ws['A2'].l = { 
 Target:"#E2" }; /* link to cell E2 */

單元格注釋

單元格注釋是對象,被存儲在單元格對象的c數組內。實際上注釋的內容根據注釋的作者被分成了小塊。每一個注釋對象的a字段存儲注釋的作者,t字段是注釋的純文字展示。

例如下面的片段在單元格A1內添加了單元格注釋:

if(!ws.A1.c) ws.A1.c = [];
ws.A1.c.push({ 
a:"SheetJS", t:"I'm a little comment, short and stout!"});

注意:XLSB對作者的名字施加54個字符的限制。名字的長度超過54個字符可能造成其他的格式問題。

把注釋標記為普通的隱藏,只需設置hidden屬性:

if(!ws.A1.c) ws.A1.c = [];
ws.A1.c.push({ 
a:"SheetJS", t:"This comment is visible"});
if(!ws.A2.c) ws.A2.c = [];
ws.A2.c.hidden = true;
ws.A2.c.push({ 
a:"SheetJS", t:"This comment will be hidden"});

數據表能見度

Excel支持將表格隱藏在更低的標簽欄。表格數據存儲文件內,但是UI不容易讓它可以使用。標準的隱藏表格會被顯示在”Unhide”菜單內。Excel也有”very hidden”表格,這些表格不能被顯示在菜單內。只可以通過Vb編輯器訪問。

能見度的設置被存儲在表格屬性數組的Hidden屬性當中。

更多細節 (點擊顯示詳情)

Value Definition
0 Visible
1 Hidden
2 Very Hidden

更多詳情請查看https://rawgit.com/SheetJS/test_files/master/sheet_visibility.xlsx:

> wb.Workbook.Sheets.map(function(x) { 
 return [x.name, x.Hidden] })
[ [ 'Visible', 0 ], [ 'Hidden', 1 ], [ 'VeryHidden', 2 ] ]

非Excel格式不支持”Very Hidden”狀態。測試一個數據比哦啊是否可見的最好方式是檢查是否Hidden屬性為邏輯truth:

> wb.Workbook.Sheets.map(function(x) { 
 return [x.name, !x.Hidden] })
[ [ 'Visible', true ], [ 'Hidden', false ], [ 'VeryHidden', false ] ]

VBA和宏命令

VBA宏命令存儲在特殊的數據blob中,當bookVBA選項為true時,blob會暴露在工作簿對象的vbaraw屬性中。VBA宏命令支持 XLSM, XLSB, 和 BIFF8 XLS 格式。如果blob存在于工作簿中,并且和工作簿的名字有關聯,支持的格式寫入函數會自動插入數據blob。

自定義編碼名稱 (點擊顯示)

工作簿編碼名稱存儲在wb.Workbook.WBProps.CodeName中。默認情況下Excel將會設置成ThisWorkbook或者是一個翻譯的短語比如DieseArbeitsmappe。工作表和圖表的編碼名稱在工作表屬性對象的wb.Workbook.Sheets[i].CodeName中。宏數據表和對話數據表會被忽略。

讀取函數和寫入函數會保護編碼名稱,但是當在一個不同的工作簿內增加一個VBA blob時,編碼名稱必須被手動設置。

宏數據表 (點擊顯示)

老版本的Excel也支持非VBA的宏數據表表格類型,宏數據表存儲了一些自動命令。他們暴露在!type設置成"macro"的對象中。

檢測工作簿內宏指令 (點擊顯示) 如果宏指令存在,那么`vbaraw`字段就可以被設置,所以測試簡單:

function wb_has_macro(wb/*:workbook*/)/*:boolean*/ { 

if(!!wb.vbaraw) return true;
const sheets = wb.SheetNames.map((n) => wb.Sheets[n]);
return sheets.some((ws) => !!ws && ws['!type']=='macro');
}

解析選項

導出的readreadFile函數接受選項參數:

Option Name Default Description
type 輸入數據編碼 (查看下方的輸入類型)
raw false 如果為true,純文本解析不會解析值 **
codepage 如果指定, 合適的時候使用編碼頁面**
cellFormula true 保存公式到f字段
cellHTML true 解析富文本并把HTML保存到.h 字段
cellNF false 把數字格式的字符串保存到 .z 字段
cellStyles false 把樣式/主題保存到 .s 字段
cellText true 生成格式化文本.w 字段
cellDates false 把日期存儲為類型 d (默認是 n)
dateNF 如果指定,使用代碼日期14的字符串 **
sheetStubs false 為子單元格創建z類型的單元格對象
sheetRows 0 如果sheetRows的值 >0, 讀取第一個sheetRows 行 **
bookDeps false 值為true,解析計算鏈
bookFiles false 如果值為true, 添加原始文件到工作簿對象 **
bookProps false 如果值為true, 只有足夠的解析才能得到工作簿的元數據**
bookSheets false 如果值為true,只有足夠的解析才能得到表格名稱
bookVBA false 如果值為true,復制 VBA blob 到 vbaraw 字段 **
password “” 如果定義了密碼并且文件已經加密,就會使用密碼 **
WTF false 如果值為true, 對意外的文件特性拋出錯誤 **
  • 雖然cellNF為false,但是格式化的文本也會被生成并且保存到.w字段。
  • 在一些情況下,即使bookSheets為false,數據表也可能被解析。
  • Excel積極嘗試從CSV和其他純文本中解釋值。這會導致意外的行為!raw選項抑制值解析。
  • bookSheetsbookProps 結合起來提供兩套信息集合。
  • Deps將會是一個空對象,如果bookDeps為false。
  • bookFiles的行為依賴于文件類型:
    • keys 數組(ZIP里面的路徑)用于基于ZIP基礎的格式
    • files哈希(將路徑映射到表示文件的的對象)用于ZIP
    • cfb對象用于使用CFB容器的格式
  • sheetRows-1將會在查看JSON對象輸出時生成(因為解析數據時,數據頭行會被計算成一行)
  • bookVBA僅僅在xl/vbaProject.bin展示原始的VBA CFB對象。不解析數據。XLSM 和 XLSB把VBA CFB對象存儲在xl/vbaProject.bin。BIFF8 XLS將VBA條目與核心工作簿條目混合在一起,因此庫從XLS CFB容器生成了一個新的XLSB兼容blob。
  • codepage用于沒有CodePage記錄的BIFF2 – BIFF5文件以及在type:"binary"內沒有BOM的CSV文件。
  • 目前僅支持XOR加密。當文件使用其他的加密方法時會拋出不支持的錯誤。
  • WTF主要用于發展。默認情況下,單一的工作表內,解析器將會抑制讀取錯誤,允許你從解析正確的工作表內讀取。設置WTF:1強制這些錯誤被拋出。

輸入類型

字符串能用很多種方式解釋。readtype參數告訴庫如何解析數據參數:

type expected input
"base64" 字符串: 文件的Base64編碼
"binary" 字符串: 二進制字符串 (字節 ndata.charCodeAt(n))
"string" 字符串: JS字符串 (字符被解釋為UTF8)
"buffer" nodejs Buffer
"array" 數組: 8位的無符號型整數數組 (字節 ndata[n])
"file" 字符串: 將要被讀取的文件的路徑 (只在nodejs中可用)

猜測文件類型

實現細節 (點擊顯示詳情)

Excel和其他的電子數據表格工具讀取前幾個字節并且應用試探法確定穩定類型。這個支持文件類型的雙關:用.xls擴展的重命名文件會告訴你的電腦使用Excel打開文件而且Excel知道如何去處理它。這個庫應用了相似的邏輯:

Byte 0 Raw File Type Spreadsheet Types
0xD0 CFB Container BIFF 5/8 or password-protected XLSX/XLSB or WQ3/QPW
0x09 BIFF Stream BIFF 2/3/4/5
0x3C XML/HTML SpreadsheetML / Flat ODS / UOS1 / HTML / plain text
0x50 ZIP Archive XLSB or XLSX/M or ODS or UOS2 or plain text
0x49 Plain Text SYLK or plain text
0x54 Plain Text DIF or plain text
0xEF UTF8 Encoded SpreadsheetML / Flat ODS / UOS1 / HTML / plain text
0xFF UTF16 Encoded SpreadsheetML / Flat ODS / UOS1 / HTML / plain text
0x00 Record Stream Lotus WK* or Quattro Pro or plain text
0x7B Plain text RTF or plain text
0x0A Plain text SpreadsheetML / Flat ODS / UOS1 / HTML / plain text
0x0D Plain text SpreadsheetML / Flat ODS / UOS1 / HTML / plain text
0x20 Plain text SpreadsheetML / Flat ODS / UOS1 / HTML / plain text

DBF文件會基于前幾個字節以及第三個和第四個字節進行檢測(對應于文件日期的月和天)。

純文本格式的猜測遵循下面的優先級順序:

Format Test
XML <?xml 出現在前1024個字符
HTML <開頭并且HTML標簽出現在前1024個字符 *
XML <開頭
RTF {\rt開頭
DSV /sep=.$/開頭,分隔符是指定的字符串
DSV 前1024個字符中未引用的";" 字符比 "\t" 或者 ","
TSV 前1024個字符中未引用的"\t"字符比 ","
CSV 前1024個字符中的一個是逗號","
ETH socialcalc:version:開頭
PRN (默認)
  • HTML 標簽包括:html, table, head, meta, script, style, div

為什么隨機的文本文件合法? (點擊顯示詳情) Excel在讀取文件方面非常積極。添加一個XLS 擴展到任意的顯示文件,讓Excel認為該文件可能是一個CSV或者是TSV文件,即使它僅僅是一列!這個庫嘗試去復制那樣的行為。

最好的方法是去校驗想要得到的工作表并且確保它有期待的行數或列數。提取范圍非常簡單:

var range = XLSX.utils.decode_range(worksheet['!ref']);
var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;

寫入選項

導出的writewriteFile函數接受一個選型參數:

Option Name Default Description
type 輸出數據編碼(查看下面的輸出類型)
cellDates false 把字節存儲為類型d (默認是 n)
bookSST false 生成共享的字符串表格 **
bookType "xlsx" 工作簿的類型 (查看下方支持的格式)
sheet "" 單頁格式的工作表名稱 **
compression false 基于ZIP的格式使用ZIP壓縮 **
Props 寫入時覆蓋工作簿的屬性 **
themeXLSX 寫入XLSX/XLSB/XLSM時,覆蓋主題XML **
ignoreEC true 禁止”數字作為文本”錯誤 **
  • bookSST 較慢并且有更多的內存密集型,不過與iOS數字老版本有更好的兼容性。
  • 原始數據時唯一保證存儲的東西。在README文件中沒有描述的功能可能無法序列化。
  • cellDates 僅用于XLSX輸出并且不能保證與第三方讀取器一起工作。Excel自身不經常用類型d編寫單元格,因此非Excel工具會忽視數據或者是有日期錯誤。
  • Props是一個備份工作簿Props字段的對象。從工作簿文件屬性 部分查看表格。
  • 如果指定,來自themeXLSX的字符串會被存儲為XLSX/XLSB/XLSM文件的基本主題(ZIP中的xl / theme / theme1.xml)。
  • 由于在程序中有一個bug,一些功能比如”分列”會在忽略錯誤條件的工作表上使Excel崩潰。默認情況下寫入函數將會標記文件忽略錯誤。設置ignoreECfalse來禁止。

支持的輸出格式

與第三方工具的廣泛兼容性,這個庫支持很多種輸出格式。明確的文件類型被bookType選項控制:

bookType file ext container sheets Description
xlsx .xlsx ZIP multi Excel 2007+ XML Format(XML 格式)
xlsm .xlsm ZIP multi Excel 2007+ Macro XML Format(宏 XML 格式)
xlsb .xlsb ZIP multi Excel 2007+ Binary Format(二進制格式)
biff8 .xls CFB multi Excel 97-2004 Worksheet Format(工作簿格式)
biff5 .xls CFB multi Excel 5.0/95 Worksheet Format(工作簿格式)
biff2 .xls none single Excel 2.0 Worksheet Format(工作簿格式)
xlml .xls none multi Excel 2003-2004 (SpreadsheetML)
ods .ods ZIP multi OpenDocument Spreadsheet(開放文檔格式的電子表格)
fods .fods none multi Flat OpenDocument Spreadsheet(平滑的開放文檔格式的電子表格)
csv .csv none single Comma Separated Values(逗號分隔值)
txt .txt none single UTF-16 Unicode Text (TXT)
sylk .sylk none single Symbolic Link (SYLK)
html .html none single HTML Document
dif .dif none single Data Interchange Format (DIF) (數據交換格式)
dbf .dbf none single dBASE II + VFP Extensions (DBF)(dBASE II + VFP擴展)
rtf .rtf none single Rich Text Format (RTF)
prn .prn none single Lotus Formatted Text(Lotus格式化文本。)
eth .eth none single Ethercalc Record Format (ETH)(Ethercalc記錄格式)
  • compression僅用于帶ZIP容器的格式。
  • 格式只支持需要sheet選型指明工作表的單表。如果字符串為空,就會使用第一張工作表。
  • 如果bookType未指定值,那么writeFile會自動根據文件擴展名來猜測輸出文件格式。他就會在上表中選擇匹配擴展名的第一個格式。

輸出類型

write函數的type參數備份read函數的type參數:

type output
"base64" 字符串: 文件的Base64編碼
"binary" 字符串: 二進制字符串 (字節 ndata.charCodeAt(n))
"string" 字符串: JS 字符串 (字符被解釋成UTF8)
"buffer" nodejs Buffer
"array" ArrayBuffer, 8位無符號整數的回退數組
"file" 字符串: 將要創建的文件的地址(僅用于nodejs)

工具函數

sheet_to_*函數接受一張工作表以及一個可選的選項對象。
*_to_sheet函數接受一個數據對象以及一個可選的選項對象。
示例都是基于下面的工作表:

XXX| A | B | C | D | E | F | G |
---+---+---+---+---+---+---+---+
1 | S | h | e | e | t | J | S |
2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
3 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

數組的數組輸入

XLSX.utils.aoa_to_sheet獲取JS值數組的數組,并且返回一個工作表尋找輸入數據。Numbers,Booleans和Strings都被存儲為相應的樣式。Date被存儲為date或者是numbers。跳過數組孔和顯式“未定義”值。null值可能被剔除。所有其它值存儲為字符串。函數獲取選項參數:

Option Name Default Description
dateNF FMT 14 字符串輸出使用特定的日期格式
cellDates false 存儲日期為類型 d (默認是 n)
sheetStubs false null值創建類型為z的單元格對象

例子 (點擊顯示) 生成實例表:

var ws = XLSX.utils.aoa_to_sheet([
"SheetJS".split(""),
[1,2,3,4,5,6,7],
[2,3,4,5,6,7,8]
]);

XLSX.utils.sheet_add_aoa獲取JS值的數組的數組,并且更新一個已存在的工作表對象。它遵循和aoa_to_sheet一樣的過程,并且接受一個選項參數:

Option Name Default Description
dateNF FMT 14 字符串輸出使用指定的日期格式
cellDates false 存儲日期為類型 d (默認是 n)
sheetStubs false null值創建類型為z的單元格對象
origin 只用指定的單元格作為指定的起點 (查看下表)

origin應該是以下之一:

origin Description
(cell object) 使用指定的單元格 (單元格對象)
(string) 使用指定的單元格 (A1樣式的單元格)
(number >= 0) 從指定行的第一列開始 (0索引)
-1 從第一列開始添加到工作表底部
(default) 從單元格A1開始

示例 (點擊顯示)

考慮工作表:

XXX| A | B | C | D | E | F | G |
---+---+---+---+---+---+---+---+
1 | S | h | e | e | t | J | S |
2 | 1 | 2 |   |   | 5 | 6 | 7 |
3 | 2 | 3 |   |   | 6 | 7 | 8 |
4 | 3 | 4 |   |   | 7 | 8 | 9 |
5 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |

此工作表可按照順序A1:G1, A2:B4, E2:G4, A5:G5構建:

/* Initial row */
var ws = XLSX.utils.aoa_to_sheet([ "SheetJS".split("") ]);
/* Write data starting at A2 */
XLSX.utils.sheet_add_aoa(ws, [[1,2], [2,3], [3,4]], { 
origin: "A2"});
/* Write data starting at E2 */
XLSX.utils.sheet_add_aoa(ws, [[5,6,7], [6,7,8], [7,8,9]], { 
origin:{ 
r:1, c:4}});
/* Append row */
XLSX.utils.sheet_add_aoa(ws, [[4,5,6,7,8,9,0]], { 
origin: -1});

對象數組輸入

XLSX.utils.json_to_sheet獲取對象數組并且返回一張基于對象自動生成”headers”的工作表。默認的列順序由第一次出現的字段決定,這些字段通過使用Object.keys得到,不過可以使用選項參數覆蓋。

Option Name Default Description
header 使用指定的列順序 (默認 Object.keys)
dateNF FMT 14 字符串輸出使用指定的日期格式
cellDates false 存儲日期為類型 d (默認是 n)
skipHeader false 如果值為true, 輸出不包含header行

示例 (點擊顯示)

原始的表單不能以明顯的方法復制,因為JS對象的keys必須是獨一無二的。之后用e_1S_1替換第二個eS

var ws = XLSX.utils.json_to_sheet([
{ 
 S:1, h:2, e:3, e_1:4, t:5, J:6, S_1:7 },
{ 
 S:2, h:3, e:4, e_1:5, t:6, J:7, S_1:8 }
], { 
header:["S","h","e","e_1","t","J","S_1"]});

或者可以跳過header行:

var ws = XLSX.utils.json_to_sheet([
{ 
 A:"S", B:"h", C:"e", D:"e", E:"t", F:"J", G:"S" },
{ 
 A: 1,  B: 2,  C: 3,  D: 4,  E: 5,  F: 6,  G: 7  },
{ 
 A: 2,  B: 3,  C: 4,  D: 5,  E: 6,  F: 7,  G: 8  }
], { 
header:["A","B","C","D","E","F","G"], skipHeader:true});

XLSX.utils.sheet_add_json獲取一個對象數組,并且更新一個已存在的工作表對象。與json_to_sheet一樣有相同的過程,并且接受一個選項參數:

Option Name Default Description
header 使用指定的列排序 (默認 Object.keys)
dateNF FMT 14 字符串輸出使用指定的日期格式
cellDates false 把存儲日期為類型 d (默認是 n)
skipHeader false 如果值為true, 輸出不包含header行
origin 使用指定的單元格作為起點 (查看下方表格)

origin應該是以下之一:

origin Description
(cell object) 使用指定的單元格(單元格對象)
(string) 使用指定的單元格 (A1樣式的單元格)
(number >= 0) 從指定行的第一列開始(0索引)
-1 從第一列開始添加到工作表底部
(default) 從單元格A1開始

例子 (點擊展示) 考慮工作表:

XXX| A | B | C | D | E | F | G |
---+---+---+---+---+---+---+---+
1 | S | h | e | e | t | J | S |
2 | 1 | 2 |   |   | 5 | 6 | 7 |
3 | 2 | 3 |   |   | 6 | 7 | 8 |
4 | 3 | 4 |   |   | 7 | 8 | 9 |
5 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |

工作表能夠以A1:G1, A2:B4, E2:G4, A5:G5順序構建:

/* Initial row */
var ws = XLSX.utils.json_to_sheet([
{ 
 A: "S", B: "h", C: "e", D: "e", E: "t", F: "J", G: "S" }
], { 
header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true});
/* Write data starting at A2 */
XLSX.utils.sheet_add_json(ws, [
{ 
 A: 1, B: 2 }, { 
 A: 2, B: 3 }, { 
 A: 3, B: 4 }
], { 
skipHeader: true, origin: "A2"});
/* Write data starting at E2 */
XLSX.utils.sheet_add_json(ws, [
{ 
 A: 5, B: 6, C: 7 }, { 
 A: 6, B: 7, C: 8 }, { 
 A: 7, B: 8, C: 9 }
], { 
skipHeader: true, origin: { 
 r: 1, c: 4 }, header: [ "A", "B", "C" ]});
/* Append row */
XLSX.utils.sheet_add_json(ws, [
{ 
 A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 }
], { 
header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true, origin: -1});

HTML Table 輸入

XLSX.utils.table_to_sheet獲取一個table DOM元素,并且返回一個工作表尋找輸入的table。Numbers會被解析。所有的數據將會被存儲為字符串。

XLSX.utils.table_to_book基于工作表會產生一個最小的工作簿。

兩個函數接受選項參數:

Option Name Default Description
raw 如果值為true, 每一個單元格將會保存原始的字符串
dateNF FMT 14 字符串輸出使用指定的日期格式
cellDates false 把日期存儲為類型 d (默認是 n)
sheetRows 0 如果值 >0, 讀取表格的第一個sheetRows
display false 如果值為true, 隱藏的行和單元格將不會被解析

例子 (點擊顯示)

生成示例表單,以HTML table開始:

<table id="sheetjs">
<tr><td>S</td><td>h</td><td>e</td><td>e</td><td>t</td><td>J</td><td>S</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr>
</table>

處理表格:

var tbl = document.getElementById('sheetjs');
var wb = XLSX.utils.table_to_book(tbl);

注意:XLSX.read能夠處理表示為字符串的HTML。

公式輸出

XLSX.utils.sheet_to_formulae生成一個命令數組,命令顯示了一個人會怎樣進入一個應用。每一個入口都是表格A1-cell-address=formula-or-value。字符串文字以”`”為前綴,符合Excel。

例子 (點擊顯示)

示例表:

> var o = XLSX.utils.sheet_to_formulae(ws);
> [o[0], o[5], o[10], o[15], o[20]];
[ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ]

定界分隔符輸出

作為一個writeFile CSV 類型的替代,XLSX.utils.sheet_to_csv也會產生CSV輸出。這個函數獲取一個選項參數:

Option Name Default Description
FS "," “字段分隔符”表示字段之間的分隔符
RS "\n" “記錄分隔符”表示行之間的分隔符
dateNF FMT 14 字符串輸出使用指定的日期格式
strip false 刪除每條記錄中的尾隨字段分隔符**
blankrows true 包含CSV輸出的空白行
skipHidden false 跳過CSV輸出的隱藏行/列
  • strip將刪除默認FS / RS下每行的尾隨逗號
    blankrows必須設置為false才能跳過空白行。

例子 (點擊顯示)

示例表:

> console.log(XLSX.utils.sheet_to_csv(ws));
S,h,e,e,t,J,S
1,2,3,4,5,6,7
2,3,4,5,6,7,8
> console.log(XLSX.utils.sheet_to_csv(ws, { 
FS:"\t"}));
S	h	e	e	t	J	S
1	2	3	4	5	6	7
2	3	4	5	6	7	8
> console.log(XLSX.utils.sheet_to_csv(ws,{ 
FS:":",RS:"|"}));
S:h:e:e:t:J:S|1:2:3:4:5:6:7|2:3:4:5:6:7:8|

#### UTF-16 Unicode 文本

txt輸出類型使用tab字符作為字段分隔符。如果codepage可用(包含全部的分發但不是核心),輸出將會被編碼為CP1200并且BOM會被預置。

XLSX.utils.sheet_to_txt獲取和sheet_to_csv一樣的參數。

HTML 輸出

作為’ writeFile ’ HTML類型的替代,XLSX.utils.sheet_to_html也會生成HTML輸出。這個函數接受一個選項參數:

Option Name Default Description
id TABLE元素指定 id 特性
editable false 如果值為true, 為每一個TD設置 contenteditable="true"
header 覆蓋 header (默認 html body)
footer 覆蓋 footer (默認 /body /html)

例子 (點擊顯示)

示例表格:

> console.log(XLSX.utils.sheet_to_html(ws));
// ...

JSON

XLSX.utils.sheet_to_json生成不同類型的JS對象。這個函數接受一個選項參數:

Option Name Default Description
raw true 使用原生值 (true) 或者格式化字符串 (false)
range from WS 覆蓋 Range (查看下面的table)
header 控制輸出格式 (查看下面的table)
dateNF FMT 14 字符串輸出使用指定的日期格式
defval 使用指定的值替代null或者undefined
blankrows ** 包含輸出的空白行 **
  • raw只影響有格式編碼(.z)字段或者格式化文本(.w)字段的單元格。
  • 如果header被指定,第一行就會被當做數據行;如果header未指定,第一行是header并且不作為數據。
  • 當header未指定時,轉換將通過添加”_”和一個從”1″開始的計數自動消除標題條目的歧義。例如有三列的標題都是foo,那么輸出字段是foo1foo_1foo_2
  • raw值為true時返回nullraw值為false會被跳過。
  • 如果defval沒有指定,通常nullundefined會被跳過。如果defval有指定值,所有的nullundefined嗲都將會用defval填充。
  • header1時,默認生成空白行。blankrows必須設置為false來跳過空白行。
  • header不為1時,默認跳過空白行。blankrows必須設置為true來生成空白行。

range是以下之一:

range Description
(number) 使用工作表范圍,但將起始行設置為值
(string) 使用指定的范圍 (A1類型的有界范圍的字符串)
(default) 使用工作表范圍 (ws['!ref'])

header是以下之一:

header Description
1 生成數組類型的數組 (“二維數組”)
"A" 行對象的鍵是文字的列標題
array of strings 在行對象內使用指定的字符串作為鍵
(default) 讀取并消除第一行的歧義作為鍵

如果header不為1,行對象將會包含不可枚舉的屬性“rowNum`,這個屬性代表與條目相對應的工作表的行。

示例 (點擊顯示) 示例表:

> XLSX.utils.sheet_to_json(ws);
[ { 
 S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 },
{ 
 S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 } ]
> XLSX.utils.sheet_to_json(ws, { 
header:"A"});
[ { 
 A: 'S', B: 'h', C: 'e', D: 'e', E: 't', F: 'J', G: 'S' },
{ 
 A: '1', B: '2', C: '3', D: '4', E: '5', F: '6', G: '7' },
{ 
 A: '2', B: '3', C: '4', D: '5', E: '6', F: '7', G: '8' } ]
> XLSX.utils.sheet_to_json(ws, { 
header:["A","E","I","O","U","6","9"]});
[ { 
 '6': 'J', '9': 'S', A: 'S', E: 'h', I: 'e', O: 'e', U: 't' },
{ 
 '6': '6', '9': '7', A: '1', E: '2', I: '3', O: '4', U: '5' },
{ 
 '6': '7', '9': '8', A: '2', E: '3', I: '4', O: '5', U: '6' } ]
> XLSX.utils.sheet_to_json(ws, { 
header:1});
[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
[ '1', '2', '3', '4', '5', '6', '7' ],
[ '2', '3', '4', '5', '6', '7', '8' ] ]

展示row效果的例子:

> ws['A2'].w = "3";                          // set A2 formatted string value
> XLSX.utils.sheet_to_json(ws, { 
header:1, raw:false});
[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
[ '3', '2', '3', '4', '5', '6', '7' ],     // <-- A2 uses the formatted string
[ '2', '3', '4', '5', '6', '7', '8' ] ]
> XLSX.utils.sheet_to_json(ws, { 
header:1});
[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
[ 1, 2, 3, 4, 5, 6, 7 ],                   // <-- A2 uses the raw value
[ 2, 3, 4, 5, 6, 7, 8 ] ]

文件格式

雖然庫的名稱是xlsx,不過它支持多種電子表格文件格式:

Format Read Write
Excel Worksheet/Workbook Formats :—–: :—–:
Excel 2007+ XML Formats (XLSX/XLSM) ⭕️ ⭕️
Excel 2007+ Binary Format (XLSB BIFF12) ⭕️ ⭕️
Excel 2003-2004 XML Format (XML “SpreadsheetML”) ⭕️ ⭕️
Excel 97-2004 (XLS BIFF8) ⭕️ ⭕️
Excel 5.0/95 (XLS BIFF5) ⭕️ ⭕️
Excel 4.0 (XLS/XLW BIFF4) ⭕️
Excel 3.0 (XLS BIFF3) ⭕️
Excel 2.0/2.1 (XLS BIFF2) ⭕️ ⭕️
Excel支持的文本格式 :—–: :—–:
Delimiter-Separated Values(定界分隔符的值 ) (CSV/TXT) ⭕️ ⭕️
Data Interchange Format(數據交換格式 (DIF) ⭕️ ⭕️
Symbolic Link(符號鏈接) (SYLK/SLK) ⭕️ ⭕️
Lotus Formatted Text(lotus格式的文本) (PRN) ⭕️ ⭕️
UTF-16 Unicode Text (TXT) ⭕️ ⭕️
其他工作簿/工作表格式 :—–: :—–:
OpenDocument Spreadsheet(開放文檔格式的電子表格) (ODS) ⭕️ ⭕️
Flat XML ODF Spreadsheet (FODS) ⭕️ ⭕️
Uniform Office Format Spreadsheet (標文通 UOS1/UOS2) ⭕️
dBASE II/III/IV / Visual FoxPro (DBF) ⭕️ ⭕️
Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123) ⭕️
Quattro Pro Spreadsheet (WQ1/WQ2/WB1/WB2/WB3/QPW) ⭕️
其他常用的電子表格輸出格式 :—–: :—–:
HTML Tables ⭕️ ⭕️
Rich Text Format tables(富文本格式表) (RTF) ⭕️
Ethercalc Record Format(Ethercalc記錄格式) (ETH) ⭕️ ⭕️

不會寫入給定文件格式不支持的功能。具有范圍限制的格式將會被靜默截斷:

Format Last Cell Max Cols Max Rows
Excel 2007+ XML Formats (XLSX/XLSM) XFD1048576 16384 1048576
Excel 2007+ Binary Format (XLSB BIFF12) XFD1048576 16384 1048576
Excel 97-2004 (XLS BIFF8) IV65536 256 65536
Excel 5.0/95 (XLS BIFF5) IV16384 256 16384
Excel 2.0/2.1 (XLS BIFF2) IV16384 256 16384

Excel 2003 電子表格的范圍限制被Excel的版本控制,并且不會寫入函數強制執行。

Excel 2007+ XML (XLSX/XLSM)

(點擊顯示)

XlSX和XLSM文件是ZIP容器包含的與開源打包約定(Open Packaging Conventions, OPC)一致的一系列文件。大多數XLSM格式與XLSX相同,被用作文件包含宏命令。

這個格式在ECMA-376以及隨后的ISO/IEC 29500都進行了標準化。Excel沒有加遵循這個規范,并且還有其他文件討論Excel如何偏離規范。

Excel 2.0-95 (BIFF2/BIFF3/BIFF4/BIFF5)

(點擊顯示)

BIFF 2/3 XLS是二進制記錄的單表流。Excel 4介紹了工作簿的原理,除了有單表的XLS格式。結構與Lotus 1-2-3文件格式非常相似。BIFF5/8/12用了多種方式擴展格式,不過很大程度上保持了相同的記錄格式。

對于這些格式沒有官方的規范。Excel 95在這些格式里面可以寫入文件,因此記錄的長度以及字段都是由所有支持的格式以及比較文件決定。Excel 2016可以生成BIFF5文件,從XLSX或BIFF2開始啟用全套文件測試。

Excel 97-2004 Binary (BIFF8)

(點擊顯示)

BIFF8僅僅使用混合的文件二進制容器格式,將一些內容放在文件的流內。在它的核心,它將會使用來自BIFF的老版本的二進制記錄格式的擴展版本。

MS-XLS規范覆蓋了文件格式的基礎,并且其他的規范擴展了屬性(如特性)的規范化。

Excel 2003-2004 (SpreadsheetML)

(點擊顯示)

在XLSX之前,SpreadsheetML文件是簡單的XML文件。沒有官方的并且全面的的規范,雖然MS對于這種格式有發布的文檔。因此Excel 2016 生成了電子表格文件,映射功能非常簡單。

Excel 2007+ Binary (XLSB, BIFF12)

(點擊顯示)

XLSB格式與XLSX并行引入,將BIFF架構與內容分離和XLSX的ZIP容器相結合。XLSX子文件的大部分節點能用一個相應的子文件映射到XLSB記錄中去。

MS-XLSB規范包含了文件格式的基礎,并且其他的規范擴展了屬性(如特性)的序列化。

定界分隔符的值 (CSV/TXT)

(點擊顯示)

Excel CSV在許多重要的方法上背離了RFC4180。生成的CSV文件通常應該運行在Excel內,但是他們不能運行RFC4180兼容的讀取器中。解析器通常理解Excel CSV。如果值不可用,寫入器會為公式主動生成單元格。

Excel TXT 使用tab作為分隔符,編碼頁1200。

注意:

  • 像在Excel中,以0x49 0x44 ("ID")開始的文件會被當做是符號鏈接(Symbolic Link)文件。不像Excel,如果文件沒有一個有效的SYLK標題,他將會被主動解釋為SYLK文件。為了廣泛的兼容性,所有值為ID的單元格會自動用雙引號包裹。

其他工作簿格式

(點擊顯示) 對其他格式的支持通常遠遠超出XLS / XLSB / XLSX支持,這在很大程度上是由于缺乏公開可用的文檔。文件通常是在各自的應用內產生,并且會與他們的導出文件相比較以確定結構。主要的關注點是數據提出。

Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)

(點擊顯示)

Lotus格式由與BIFF結構相似的二進制記錄組成。Lotus幾十年前發布了一份包含原始WK1格式的規范。通過生成文件和與Excel支持進行比較來推斷其他功能。

Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)

(點擊顯示)

Quattro Pro格式使用與BIFF和Lotus一樣的二進制記錄。一些較新的格式(命名為WB3 和 QPW)使用像BIFF8 XLS一樣的CFB附件。

OpenDocument Spreadsheet(開放文檔格式的電子表格) (ODS/FODS)

(點擊顯示)

ODS是一種類似于XLSX的XML-in-ZIP格式,而FODS是一種類似于SpreadsheetML的XML格式。兩種格式都在OASIS標準中進行了詳細的說明,不過像LO/OO工具被添加到了未公開的擴展中。解析器和編寫器并沒有實現全部的標準,反而重點實現了提取和存儲行數據中重要的部分。

Uniform Office Spreadsheet(統一辦公電子表格) (UOS1/2)

(點擊顯示)

UOS是一種非常相似的格式,并且它有2個變種,分別對應ODS和FODS。大多數情況下,格式之間的區別是標簽和屬性的名稱。

Other Single-Worksheet Formats(其他單一工作表格式)

大多數較老的瀏覽器僅支持一種工作表:

dBASE and Visual FoxPro (DBF)

(點擊顯示)

DBF實際上是一種類型化的表格格式:每一列只能保存一種數據類型,并且每條記錄忽略類型信息。解析器生成標題行并且在工作表的第二行開始插入記錄。編寫器讓文件和Visual FoxPro兼容。

多文件的擴展,比如內部示例和表格,目前不支持,會被在web瀏覽器中讀取任意文件的普通能力所限制。讀取器理解DBF level 7的擴展,比如DATETIME。

Symbolic Link(符號鏈接) (SYLK)

(點擊顯示) 沒有真正的文檔。通過各種版本的Excel中保存文件來收集所有知識,以推斷出字段的含義。注意:

  • 簡單的公式被存儲在RC表單中。
  • 列寬會被四舍五入成完整的字符。

Lotus Formatted Text (PRN)

(點擊顯示) 沒有真正的文檔。事實上Excel把PRN視為一種只能輸出的文件格式。然而我們能夠猜測列寬并且反向還原原始布局。Excel 240個字符寬度的限制不會被強制執行。

Data Interchange Format(數據交換格式) (DIF)

(點擊顯示)

沒有統一標準的定義。 Visicalc DIF與Lotus DIF不同,并且兩者都與Excel DIF不一樣。在不明確的情況下,解析器/編寫器遵循Excel中的預期行為。特別地,Excel以不兼容的方式擴展DIF:

  • 由于Excel自動將數字字符串轉換為數字,數字的字符串常量被轉換成公式:"0.3" -> "=""0.3""
  • DIF技術上期待數字的單元格保存原始的數字數據,不過Excel允許格式化數字(包括日期)。
  • DIF技術上不支持公式,但是Excel將會轉換簡單公式。數組公式沒有保存。

HTML

(點擊顯示) Excel HTML工作表包含以樣式編碼的特殊元數據。例如`mso-number-format`是一個包含數字格式的本地化字符串。盡管元數據的輸出是有效的HTML,但是他不接受空的`&`符號。

編寫器通過t標簽添加類型元數據到TD元素中去。解析器檢查這些標簽,并且覆蓋默認的解釋。例如文本<td>12345</td>將會被解析成數字,不過<td t="s">12345</td>將會被解析成文本。

Rich Text Format(富文本格式) (RTF)

(點擊顯示)

當復制工作表內的單元格或者范圍時,Excel RTF工作表會被存儲在剪貼板內。支持的編碼是單詞RTF支持的一個子集。

Ethercalc Record Format (ETH)

(點擊顯示)

Ethercalc是一種開源的web電子表格,由記錄格式驅動,讓人聯想到包含在MIME多部分消息中的SYLK。

測試

Node

(點擊顯示) `make test`將會運行node基礎的測試。默認情況下,它以各種支持的格式對文件運行測試。要測試一種指定的文件類型,設置`FMTS`為你想要測試的類型。使用`make test_misc`可以獲得指定功能的測試。

$ make test_misc   # run core tests
$ make test        # run full tests
$ make test_xls    # only use the XLS test files
$ make test_xlsx   # only use the XLSX test files
$ make test_xlsb   # only use the XLSB test files
$ make test_xml    # only use the XML test files
$ make test_ods    # only use the ODS test files

要想啟用所有的錯誤,請設置環境變量WTF=1

$ make test        # run full tests
$ WTF=1 make test  # enable all error messages

flow and eslint checks are available:

$ make lint        # eslint checks
$ make flow        # make lint + Flow checking
$ make tslint      # check TS definitions

瀏覽器

(點擊顯示) 核心瀏覽器內測試可在此repo中的`tests/index.html`中找到。啟動一個本地服務器并且導航到那個目錄去運行測試。`make ctestserv`將會在8080端口啟動一個服務。

make ctest將生成瀏覽器裝置。要添加更多的文件,編輯tests/fixtures.lst并且添加路徑。

要運行完整的瀏覽器內測試,從oss.sheetjs.com克隆這個repo,并且替換xlsx.js文件(然后打開一個瀏覽器窗口跳轉到stress.html)。

$ cp xlsx.js ../SheetJS.github.io
$ cd ../SheetJS.github.io
$ simplehttpserver # or "python -mSimpleHTTPServer" or "serve"
$ open -a Chromium.app http://localhost:8000/stress.html

測試環境

(點擊顯示)

  • NodeJS 0.8, 0.10, 0.12, 4.x, 5.x, 6.x, 7.x, 8.x
  • IE 6/7/8/9/10/11 (IE 6-9 require shims)
  • Chrome 24+ (including Android 4.0+)
  • Safari 6+ (iOS and Desktop)
  • Edge 13+, FF 18+, and Opera 12+

測試使用mocha測試框架。Travis-CI 和 Sauce Labs 鏈接:

  • https://travis-ci.org/SheetJS/js-xlsx 用于nodejs內的XLSX模塊
  • https://semaphoreci.com/sheetjs/js-xlsx 用于nodejs內的XLSX模塊
  • https://travis-ci.org/SheetJS/SheetJS.github.io 用于 XLS* 模塊
  • https://saucelabs.com/u/sheetjs 用于使用Sauce Labs的 XLS* 模塊

Travis-CI測試組合也包括用于多種時區的測試。改變本地的時區,設置TZ環境可用:

$ env TZ="Asia/Kolkata" WTF=1 make test_misc

測試文件

測試文件被封裝在另一個倉庫。

運行make init將會刷新test_files子模塊并獲取子模塊的文件。注意這個可能需要svn, git, hg以及其它可能不可用的命令。如果make init失敗,請從倉庫下載測試文件快照的最新版本。

最新快照 (點擊顯示) 最新的測試文件快照:

(下載并解壓到test_files子目錄)

貢獻

由于開放規范承諾的不穩定性,確保代碼是潔凈室非常重要。貢獻記錄

文件組織 (點擊顯示) 在最高級別,最終腳本是`bits`文件夾中各個文件的串聯。運行`make`應該在所有平臺上重現最終輸出。同樣,README被分成了`docbits`文件夾中的位。

文件夾:

folder contents
bits 組成最終腳本的原生源文件
docbits 組成README.md的原生markdown文件
bin 服務器端bin腳本 (xlsx.njs)
dist 用于Web瀏覽器和非標準JS環境的dist文件
demos 針對ExtendScript和Webpack等平臺的演示項目
tests 瀏覽器測試 (運行 make ctest 進行構建)
types typescript定義和測試
misc 各種各樣的支持腳本
test_files 測試文件 (從測試文件倉庫拉取)

克隆倉庫之后,運行make help將會顯示一個命令列表。

OSX/Linux

(點擊顯示)

xlsx.js文件由來自于bits子目錄的文件構建。構建腳本(運行make)將會連接各個位來產生腳本。提交一個貢獻之前,確保運行將會準確地產生xlsx.js文件。測試的最簡單方式就是添加下面的腳本:

$ git add xlsx.js
$ make clean
$ make
$ git diff xlsx.js

運行make dist產生dist文件。每一個版本中的dist文件都會被更新,并且不應該在版本之間提交

Windows

(點擊顯示)

包含make.cmd的腳本將會從bits目錄中構建xlsx.js。構建很簡單:

> make

準備開發環境:

> make init

windows中可用命令的完整列表顯示在make help中:

make init -- 安裝依賴和全局模塊
make lint -- 運行 eslint linter
make test -- 運行mocha測試組合
make misc -- 運行更小的測試組合
make book -- 重新構建README 和 summary
make help -- 顯示命令信息

與測試文件中解釋的一樣,在windows中發布ZIP文件必須要下載和提取。如果Bash在windows內可用,可能會運行 OSX/Linux工作流。下面額步驟準備環境:

# Install support programs for the build and test commands
sudo apt-get install make git subversion mercurial
# Install nodejs and NPM within the WSL
wget -qO- https://deb.nodesource.com/setup_8.x | sudo bash
sudo apt-get install nodejs
# Install dev dependencies
sudo npm install -g mocha voc blanket xlsjs

測試

(點擊顯示) `test_misc`(Linux/OSX用`make test_misc`/windows用`make misc`)目標運行定向的功能測試。執行功能測試需要5-10秒而無需對整個測試電池進行測試。新功能應附帶相關文件格式和功能的測試。

對于涉及讀取端的測試,一個合適的功能測試會包括讀取一個存在的文件并且檢查工作簿對象的結果。如果涉及參數,文件應該讀取不同的值以確保功能如預期所料工作。

對于涉及已經可以解析的新寫入功能的測試,恰當的功能測試包括用這個功能寫入工作簿,在之后打開并確認功能已經被保存。

對于涉及沒有現有讀取能力的新寫入功能的測試,請添加功能測試到kitchen sinktests/write.js

證書

更多細節請查閱相關的證書。原始作者保留未由Apache 2.0許可證明確授予的所有權利。

引用

OSP覆蓋的規格(OSP-covered Specifications) (點擊顯示)

  • MS-CFB: 復合文件二進制文件格式(Compound File Binary File Format)
  • MS-CTXLS: Excel自定義工具欄二進制文件格式(Excel Custom Toolbar Binary File Format)
  • MS-EXSPXML3: Excel計算版本2 Web服務XML架構(Excel Calculation Version 2 Web Service XML Schema)
  • MS-ODATA: 開源的數據協議(Open Data Protocol) (OData)
  • MS-ODRAW: office繪圖二進制文件格式(Office Drawing Binary File Format)
  • MS-ODRAWXML: Office開源XML結構的Office繪圖擴展(Office Drawing Extensions to Office Open XML Structure)
  • MS-OE376: Office對ECMA-376標準支持的執行信息(Office Implementation Information for ECMA-376 Standards Support)
  • MS-OFFCRYPTO: Office文檔密碼學結構(Office Document Cryptography Structure)
  • MS-OI29500: Office對ISO/IEC 29500標準支持的執行信息(Office Implementation Information for ISO/IEC 29500 Standards Support)
  • MS-OLEDS: 對象鏈接和嵌入數據結構(Object Linking and Embedding (OLE) Data Structures)
  • MS-OLEPS: 對象鏈接和嵌入屬性設置數據結構(Object Linking and Embedding (OLE) Property Set Data Structures)
  • MS-OODF3: Office對ODF 1.2標準支持的執行信息(Office Implementation Information for ODF 1.2 Standards Support)
  • MS-OSHARED: Office常用數據類型和對象結構(Office Common Data Types and Objects Structures)
  • MS-OVBA: Office VBA文件結構(Office VBA File Format Structure)
  • MS-XLDM: 電子表格數據模型文件格式(Spreadsheet Data Model File Format)
  • MS-XLS: Excel二進制文件格式(.xls)結構規范(Excel Binary File Format (.xls) Structure Specification)
  • MS-XLSB: Excel (.xlsb)二進制文件格式(Excel (.xlsb) Binary File Format)
  • MS-XLSX: Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File Format
  • XLS: Microsoft Office Excel 97-2007 Binary File Format Specification
  • RTF: 富文本(Rich Text Format)
  • ISO/IEC 29500:2012(E) “信息技術 – 文檔描述和處理語言 – Office開源XML文件格式”
  • Office應用版本 1.2(2011/9/29)開源文檔格式
  • 工作表文件格式(來自于Lotus) 1984年12月

總結

以上是生活随笔為你收集整理的SheetJS中文文档-js导出Excel脚本库[通俗易懂]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

丰满人妻一区二区三区免费视频 | 欧美老妇交乱视频在线观看 | 精品久久久久久亚洲精品 | 无码国产色欲xxxxx视频 | 亚洲精品www久久久 | 内射后入在线观看一区 | 88国产精品欧美一区二区三区 | 亚洲男女内射在线播放 | 玩弄中年熟妇正在播放 | 成人精品视频一区二区三区尤物 | 18禁止看的免费污网站 | 色婷婷综合中文久久一本 | 国产亚洲精品久久久久久国模美 | 色婷婷av一区二区三区之红樱桃 | 国产9 9在线 | 中文 | 中文字幕人妻无码一区二区三区 | 午夜精品一区二区三区的区别 | 久精品国产欧美亚洲色aⅴ大片 | 无码播放一区二区三区 | 日本乱人伦片中文三区 | 国产精品沙发午睡系列 | 波多野结衣一区二区三区av免费 | 色综合久久久久综合一本到桃花网 | 麻豆果冻传媒2021精品传媒一区下载 | 久久久亚洲欧洲日产国码αv | 少女韩国电视剧在线观看完整 | 又湿又紧又大又爽a视频国产 | 国产精品-区区久久久狼 | 无码人妻丰满熟妇区毛片18 | 国产av剧情md精品麻豆 | 午夜精品久久久久久久 | 97夜夜澡人人双人人人喊 | 国产精华av午夜在线观看 | 131美女爱做视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久精品国产大片免费观看 | 久久精品国产一区二区三区 | 纯爱无遮挡h肉动漫在线播放 | 久久久亚洲欧洲日产国码αv | 中文字幕精品av一区二区五区 | 国产精品久久久久无码av色戒 | 97夜夜澡人人爽人人喊中国片 | 中文字幕无码人妻少妇免费 | 国产精品久久久久无码av色戒 | 日本va欧美va欧美va精品 | 国产av无码专区亚洲a∨毛片 | 99久久无码一区人妻 | 亚洲爆乳无码专区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 伊人久久婷婷五月综合97色 | 日本欧美一区二区三区乱码 | 免费无码肉片在线观看 | 一本一道久久综合久久 | 国产精品久久精品三级 | 欧洲精品码一区二区三区免费看 | 亚洲一区二区三区偷拍女厕 | 国产精品久久久午夜夜伦鲁鲁 | 日本精品人妻无码免费大全 | 日韩人妻无码中文字幕视频 | 国产精品久免费的黄网站 | 正在播放老肥熟妇露脸 | 欧美人与禽zoz0性伦交 | 久久综合给合久久狠狠狠97色 | 精品成在人线av无码免费看 | 国产精品国产三级国产专播 | 成人免费视频视频在线观看 免费 | 亚洲狠狠色丁香婷婷综合 | 黑人玩弄人妻中文在线 | 久久久久亚洲精品男人的天堂 | 黑人巨大精品欧美黑寡妇 | 精品国偷自产在线视频 | 伊人色综合久久天天小片 | 国内老熟妇对白xxxxhd | 欧美人与禽zoz0性伦交 | 亚洲狠狠婷婷综合久久 | 荫蒂被男人添的好舒服爽免费视频 | 九月婷婷人人澡人人添人人爽 | 性欧美疯狂xxxxbbbb | 在线观看欧美一区二区三区 | 久久久久久a亚洲欧洲av冫 | 任你躁国产自任一区二区三区 | 18精品久久久无码午夜福利 | 成人性做爰aaa片免费看 | 九月婷婷人人澡人人添人人爽 | 精品亚洲韩国一区二区三区 | 国产97人人超碰caoprom | 久久人人97超碰a片精品 | 97无码免费人妻超级碰碰夜夜 | 国产精品国产自线拍免费软件 | 无码人妻久久一区二区三区不卡 | 樱花草在线播放免费中文 | 亚洲成a人片在线观看无码3d | 在线播放亚洲第一字幕 | 人妻少妇精品无码专区动漫 | 99久久亚洲精品无码毛片 | 人妻少妇被猛烈进入中文字幕 | 亚洲精品国偷拍自产在线麻豆 | 国产激情无码一区二区 | 国产免费久久久久久无码 | 中文字幕无码视频专区 | 国产激情艳情在线看视频 | 国产成人av免费观看 | 免费播放一区二区三区 | 麻豆精产国品 | 午夜免费福利小电影 | 国产精品无套呻吟在线 | 成人精品视频一区二区三区尤物 | 国产超级va在线观看视频 | 久久精品国产精品国产精品污 | 久久午夜无码鲁丝片午夜精品 | 成人免费视频在线观看 | 亚洲欧洲日本综合aⅴ在线 | 成人精品一区二区三区中文字幕 | 国产精品美女久久久久av爽李琼 | 99er热精品视频 | 久久无码人妻影院 | 国产亚洲精品久久久久久大师 | 少妇一晚三次一区二区三区 | 久久精品人人做人人综合试看 | 国产黄在线观看免费观看不卡 | 久久精品一区二区三区四区 | 欧美xxxxx精品 | 国产精品美女久久久 | 九九在线中文字幕无码 | 日韩欧美群交p片內射中文 | 内射巨臀欧美在线视频 | 国产两女互慰高潮视频在线观看 | 中文字幕色婷婷在线视频 | 欧美一区二区三区 | 久久国产自偷自偷免费一区调 | 久久精品国产99久久6动漫 | 亚洲成在人网站无码天堂 | 欧美日韩一区二区免费视频 | 人妻插b视频一区二区三区 | 亚洲日韩av片在线观看 | 我要看www免费看插插视频 | 国产九九九九九九九a片 | 在线亚洲高清揄拍自拍一品区 | 性生交大片免费看l | 一区二区传媒有限公司 | 亚洲一区二区三区无码久久 | 无码国产色欲xxxxx视频 | 日日躁夜夜躁狠狠躁 | 美女黄网站人色视频免费国产 | 无码人妻出轨黑人中文字幕 | 久久久久久久女国产乱让韩 | 丰满少妇高潮惨叫视频 | 欧美人与禽zoz0性伦交 | 天堂在线观看www | 国产成人一区二区三区在线观看 | 成人性做爰aaa片免费看不忠 | 色一情一乱一伦一视频免费看 | 国产超碰人人爽人人做人人添 | 亚洲呦女专区 | 高清不卡一区二区三区 | 97资源共享在线视频 | 无码成人精品区在线观看 | 欧美日本精品一区二区三区 | 国产激情一区二区三区 | 亚洲日韩av片在线观看 | 欧美 亚洲 国产 另类 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产精品亚洲一区二区三区喷水 | 88国产精品欧美一区二区三区 | 日韩精品a片一区二区三区妖精 | 国产亚洲人成a在线v网站 | 超碰97人人射妻 | 亚洲小说春色综合另类 | 国产人妻人伦精品1国产丝袜 | 国产精品爱久久久久久久 | 成人三级无码视频在线观看 | 丁香花在线影院观看在线播放 | 国产精品内射视频免费 | 亚洲精品午夜国产va久久成人 | 亚洲啪av永久无码精品放毛片 | 久久久久se色偷偷亚洲精品av | 日日橹狠狠爱欧美视频 | 久久久久久久女国产乱让韩 | 亚洲aⅴ无码成人网站国产app | 久久 国产 尿 小便 嘘嘘 | 亚洲精品国偷拍自产在线观看蜜桃 | 国内精品久久久久久中文字幕 | 99久久婷婷国产综合精品青草免费 | 久热国产vs视频在线观看 | аⅴ资源天堂资源库在线 | 国内揄拍国内精品少妇国语 | 一本久道久久综合狠狠爱 | 亚洲 a v无 码免 费 成 人 a v | 亚洲日本在线电影 | 亚洲理论电影在线观看 | 久久久久国色av免费观看性色 | 成人试看120秒体验区 | 丰满人妻一区二区三区免费视频 | 亚洲成av人片天堂网无码】 | 精品欧美一区二区三区久久久 | 乱码午夜-极国产极内射 | 国产凸凹视频一区二区 | 日本精品人妻无码77777 天堂一区人妻无码 | 暴力强奷在线播放无码 | 欧美日韩精品 | 国产两女互慰高潮视频在线观看 | 欧美精品在线观看 | 内射巨臀欧美在线视频 | 国产网红无码精品视频 | 四虎4hu永久免费 | 国产精品无套呻吟在线 | 日本护士xxxxhd少妇 | 高潮毛片无遮挡高清免费 | www一区二区www免费 | 久青草影院在线观看国产 | 国产成人午夜福利在线播放 | 中文字幕乱码人妻无码久久 | 人妻无码αv中文字幕久久琪琪布 | 久久国产精品精品国产色婷婷 | 色诱久久久久综合网ywww | 99久久亚洲精品无码毛片 | 久久国产精品二国产精品 | 久久亚洲a片com人成 | 麻豆国产97在线 | 欧洲 | 精品乱子伦一区二区三区 | 少妇性l交大片欧洲热妇乱xxx | 亚洲国产精品一区二区第一页 | 午夜福利试看120秒体验区 | 日本乱偷人妻中文字幕 | 中文字幕无码视频专区 | 亚洲国产精品无码一区二区三区 | 国产成人人人97超碰超爽8 | 中文字幕日韩精品一区二区三区 | 国产sm调教视频在线观看 | 99精品无人区乱码1区2区3区 | 欧美一区二区三区视频在线观看 | 亚洲日韩av一区二区三区四区 | 国产一区二区不卡老阿姨 | 日韩av无码一区二区三区 | 夫妻免费无码v看片 | 精品一区二区三区波多野结衣 | 成人免费视频一区二区 | 国产精品沙发午睡系列 | 亚洲小说春色综合另类 | 国产精品久久久 | 国产热a欧美热a在线视频 | 亚洲一区二区三区四区 | 99国产精品白浆在线观看免费 | 欧美成人免费全部网站 | 国产乱人伦偷精品视频 | 中文字幕乱码亚洲无线三区 | 久久久久99精品国产片 | 国内精品一区二区三区不卡 | 亚洲国产精品无码久久久久高潮 | 99精品无人区乱码1区2区3区 | 精品国产av色一区二区深夜久久 | 国产精品办公室沙发 | 亚洲а∨天堂久久精品2021 | 啦啦啦www在线观看免费视频 | 熟女体下毛毛黑森林 | 欧美精品国产综合久久 | 精品无码国产自产拍在线观看蜜 | 国产真实伦对白全集 | 成人性做爰aaa片免费看 | 色综合视频一区二区三区 | 国产精品久免费的黄网站 | 人人妻人人澡人人爽欧美一区九九 | 欧美激情内射喷水高潮 | 亚洲精品成a人在线观看 | 成人无码精品1区2区3区免费看 | 亚洲人成影院在线无码按摩店 | 国产麻豆精品一区二区三区v视界 | 动漫av一区二区在线观看 | a片免费视频在线观看 | 樱花草在线社区www | 野狼第一精品社区 | 青春草在线视频免费观看 | 荫蒂被男人添的好舒服爽免费视频 | 久久99精品国产.久久久久 | 亚洲熟悉妇女xxx妇女av | 亚洲国产午夜精品理论片 | 精品久久综合1区2区3区激情 | 欧美亚洲日韩国产人成在线播放 | 夫妻免费无码v看片 | 国产精品久久久午夜夜伦鲁鲁 | 天天拍夜夜添久久精品 | 亚洲精品久久久久久久久久久 | 久久午夜无码鲁丝片午夜精品 | 欧美激情内射喷水高潮 | 性色欲情网站iwww九文堂 | 国产精品美女久久久 | 日韩无套无码精品 | 欧美成人高清在线播放 | 久久久久久九九精品久 | 狠狠亚洲超碰狼人久久 | 人妻无码久久精品人妻 | 影音先锋中文字幕无码 | 日本www一道久久久免费榴莲 | 福利一区二区三区视频在线观看 | 色欲人妻aaaaaaa无码 | 午夜肉伦伦影院 | 免费男性肉肉影院 | 乱中年女人伦av三区 | 国产免费久久久久久无码 | 蜜臀av在线播放 久久综合激激的五月天 | 无码人妻丰满熟妇区毛片18 | 国产性生交xxxxx无码 | 色婷婷欧美在线播放内射 | 伊人久久大香线焦av综合影院 | 国产麻豆精品精东影业av网站 | 十八禁视频网站在线观看 | 奇米影视888欧美在线观看 | 性色av无码免费一区二区三区 | 亚洲一区二区三区偷拍女厕 | 久久久婷婷五月亚洲97号色 | 日本大香伊一区二区三区 | 波多野结衣高清一区二区三区 | 国产无遮挡又黄又爽免费视频 | 国产国语老龄妇女a片 | 欧美日本日韩 | v一区无码内射国产 | 丰满少妇弄高潮了www | 亚洲精品中文字幕乱码 | 色婷婷香蕉在线一区二区 | 九月婷婷人人澡人人添人人爽 | 久久精品中文闷骚内射 | 欧美日本精品一区二区三区 | 性生交片免费无码看人 | 国产97色在线 | 免 | 黑人粗大猛烈进出高潮视频 | 精品 日韩 国产 欧美 视频 | 好屌草这里只有精品 | 国产欧美亚洲精品a | 国产精品沙发午睡系列 | 亚洲色成人中文字幕网站 | 精品国产av色一区二区深夜久久 | 波多野结衣高清一区二区三区 | 亚洲国产av精品一区二区蜜芽 | 国产无遮挡又黄又爽免费视频 | 玩弄中年熟妇正在播放 | 国产精品久久久av久久久 | 色 综合 欧美 亚洲 国产 | 性欧美牲交在线视频 | 亚洲精品一区二区三区在线 | 亚洲国产精品久久久久久 | 强开小婷嫩苞又嫩又紧视频 | 成人免费视频视频在线观看 免费 | 狠狠噜狠狠狠狠丁香五月 | 天堂亚洲2017在线观看 | 色婷婷欧美在线播放内射 | 国产精品人妻一区二区三区四 | 爆乳一区二区三区无码 | 精品无码国产一区二区三区av | 东京热无码av男人的天堂 | 国产激情无码一区二区app | 国产乡下妇女做爰 | 熟妇女人妻丰满少妇中文字幕 | 国产精品自产拍在线观看 | 理论片87福利理论电影 | 国产精品人人妻人人爽 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 水蜜桃av无码 | 牲交欧美兽交欧美 | 色欲人妻aaaaaaa无码 | 曰韩无码二三区中文字幕 | 国产精品va在线观看无码 | 国产婷婷色一区二区三区在线 | 午夜免费福利小电影 | 国产av无码专区亚洲a∨毛片 | 麻豆国产丝袜白领秘书在线观看 | 强奷人妻日本中文字幕 | 宝宝好涨水快流出来免费视频 | 国产黄在线观看免费观看不卡 | 中文字幕无码av波多野吉衣 | 撕开奶罩揉吮奶头视频 | 色综合久久久无码网中文 | 国产97人人超碰caoprom | 国产精品香蕉在线观看 | 国产熟女一区二区三区四区五区 | 亚欧洲精品在线视频免费观看 | 精品乱码久久久久久久 | 亚洲中文字幕无码中文字在线 | 任你躁国产自任一区二区三区 | 亚洲中文字幕乱码av波多ji | 国产高潮视频在线观看 | 日韩无码专区 | 亚洲 激情 小说 另类 欧美 | ass日本丰满熟妇pics | 美女极度色诱视频国产 | 国产免费久久久久久无码 | 欧美人与动性行为视频 | 久久精品国产一区二区三区 | 精品亚洲韩国一区二区三区 | 大肉大捧一进一出好爽视频 | 激情国产av做激情国产爱 | 麻豆人妻少妇精品无码专区 | 亚洲大尺度无码无码专区 | 亚洲一区二区三区国产精华液 | 亚洲一区二区三区国产精华液 | 日韩精品无码一区二区中文字幕 | 日本免费一区二区三区最新 | 人妻天天爽夜夜爽一区二区 | 精品少妇爆乳无码av无码专区 | 中文字幕 亚洲精品 第1页 | 久久综合九色综合97网 | 乱人伦人妻中文字幕无码久久网 | 欧美成人免费全部网站 | 风流少妇按摩来高潮 | 国产午夜亚洲精品不卡下载 | 久久精品视频在线看15 | 欧洲精品码一区二区三区免费看 | 欧美丰满老熟妇xxxxx性 | 天天综合网天天综合色 | 无码吃奶揉捏奶头高潮视频 | 国产明星裸体无码xxxx视频 | 亚洲国产精品美女久久久久 | 少妇无套内谢久久久久 | 国内精品久久毛片一区二区 | 国产免费久久精品国产传媒 | 亚洲成av人在线观看网址 | 欧美大屁股xxxxhd黑色 | 久久成人a毛片免费观看网站 | 鲁大师影院在线观看 | 国内精品人妻无码久久久影院 | 欧美 亚洲 国产 另类 | 欧美精品一区二区精品久久 | 动漫av一区二区在线观看 | 人妻夜夜爽天天爽三区 | 欧美日韩久久久精品a片 | 精品夜夜澡人妻无码av蜜桃 | 久久99精品久久久久久动态图 | 日本熟妇人妻xxxxx人hd | 波多野42部无码喷潮在线 | 国产精品人人妻人人爽 | 亚洲精品国产a久久久久久 | 成人免费无码大片a毛片 | 亚洲日本va中文字幕 | 欧美人与物videos另类 | 精品日本一区二区三区在线观看 | 中文字幕+乱码+中文字幕一区 | 欧美zoozzooz性欧美 | 天海翼激烈高潮到腰振不止 | 国产suv精品一区二区五 | 日本一区二区更新不卡 | 又湿又紧又大又爽a视频国产 | 波多野结衣av在线观看 | 亚洲综合精品香蕉久久网 | 日本护士xxxxhd少妇 | www国产亚洲精品久久网站 | 全球成人中文在线 | 无码国产色欲xxxxx视频 | 久精品国产欧美亚洲色aⅴ大片 | 午夜福利一区二区三区在线观看 | 亚洲人亚洲人成电影网站色 | 久久天天躁狠狠躁夜夜免费观看 | 天堂一区人妻无码 | 中文亚洲成a人片在线观看 | 亚洲欧美色中文字幕在线 | 无套内谢的新婚少妇国语播放 | 亚洲欧美国产精品专区久久 | 中文字幕乱妇无码av在线 | 无码人妻丰满熟妇区五十路百度 | 宝宝好涨水快流出来免费视频 | 亚洲日韩一区二区 | 精品偷自拍另类在线观看 | 国产午夜亚洲精品不卡下载 | 欧美乱妇无乱码大黄a片 | 亚洲欧美日韩成人高清在线一区 | 国产成人精品久久亚洲高清不卡 | 精品夜夜澡人妻无码av蜜桃 | 国产一区二区三区日韩精品 | 中文字幕久久久久人妻 | 丝袜人妻一区二区三区 | 十八禁视频网站在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 牲欲强的熟妇农村老妇女视频 | 国产农村乱对白刺激视频 | 欧美国产日产一区二区 | 男女性色大片免费网站 | 亚洲欧美日韩成人高清在线一区 | 精品国产福利一区二区 | 乌克兰少妇性做爰 | 国产激情精品一区二区三区 | 亚洲国产精品一区二区美利坚 | 久久伊人色av天堂九九小黄鸭 | 狠狠噜狠狠狠狠丁香五月 | 东京热男人av天堂 | 国产三级精品三级男人的天堂 | 激情内射日本一区二区三区 | 精品国精品国产自在久国产87 | 99国产欧美久久久精品 | 国产精品久久国产精品99 | 无码人妻丰满熟妇区毛片18 | 丰满少妇人妻久久久久久 | 色综合天天综合狠狠爱 | 无遮挡国产高潮视频免费观看 | 成人一在线视频日韩国产 | 国内精品久久毛片一区二区 | 日韩成人一区二区三区在线观看 | 131美女爱做视频 | 亚洲天堂2017无码中文 | 国产偷抇久久精品a片69 | 国产av一区二区精品久久凹凸 | 午夜肉伦伦影院 | 国产两女互慰高潮视频在线观看 | 未满成年国产在线观看 | 国产热a欧美热a在线视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 熟妇女人妻丰满少妇中文字幕 | 亚洲国产精品一区二区第一页 | 我要看www免费看插插视频 | 日韩精品成人一区二区三区 | 国产电影无码午夜在线播放 | 秋霞成人午夜鲁丝一区二区三区 | 蜜桃视频插满18在线观看 | 一个人看的视频www在线 | 亚洲七七久久桃花影院 | 精品日本一区二区三区在线观看 | 色欲久久久天天天综合网精品 | 漂亮人妻洗澡被公强 日日躁 | 国产亚洲精品久久久ai换 | 永久黄网站色视频免费直播 | 国产乱人偷精品人妻a片 | 亚洲色大成网站www国产 | 日日鲁鲁鲁夜夜爽爽狠狠 | 福利一区二区三区视频在线观看 | 中文精品久久久久人妻不卡 | 老子影院午夜精品无码 | 亚洲成av人片在线观看无码不卡 | 天堂а√在线中文在线 | 国产无遮挡吃胸膜奶免费看 | 精品人妻中文字幕有码在线 | 九九久久精品国产免费看小说 | 亚洲精品国偷拍自产在线观看蜜桃 | 成人毛片一区二区 | 东京热无码av男人的天堂 | 欧美人妻一区二区三区 | 成人aaa片一区国产精品 | 色婷婷av一区二区三区之红樱桃 | 成人欧美一区二区三区黑人 | 国产精品无套呻吟在线 | 强开小婷嫩苞又嫩又紧视频 | 免费无码肉片在线观看 | 久久精品成人欧美大片 | 特大黑人娇小亚洲女 | 国产亲子乱弄免费视频 | 亚洲成a人片在线观看无码 | 国产精品香蕉在线观看 | 亚洲人成网站免费播放 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲成av人片在线观看无码不卡 | 国内精品一区二区三区不卡 | 久久久久久国产精品无码下载 | 国产成人综合在线女婷五月99播放 | 亚洲一区二区三区无码久久 | 亚洲成a人片在线观看无码 | 国产精华av午夜在线观看 | 亚洲成a人片在线观看无码 | 男人的天堂av网站 | 欧美乱妇无乱码大黄a片 | 午夜无码人妻av大片色欲 | 欧美成人家庭影院 | 日本护士毛茸茸高潮 | 久久aⅴ免费观看 | 俺去俺来也在线www色官网 | 成人欧美一区二区三区黑人免费 | 精品一区二区不卡无码av | 98国产精品综合一区二区三区 | 爽爽影院免费观看 | 无码一区二区三区在线观看 | 国产舌乚八伦偷品w中 | 亚拍精品一区二区三区探花 | 色欲人妻aaaaaaa无码 | 人人爽人人澡人人高潮 | 免费看少妇作爱视频 | 精品一区二区三区无码免费视频 | 综合人妻久久一区二区精品 | 国产在线无码精品电影网 | 成 人影片 免费观看 | 台湾无码一区二区 | 亚洲熟妇自偷自拍另类 | 激情综合激情五月俺也去 | 人人澡人人妻人人爽人人蜜桃 | 亚洲 高清 成人 动漫 | 久久久久久九九精品久 | 国产香蕉尹人综合在线观看 | 人人妻人人澡人人爽人人精品 | 亚洲欧美综合区丁香五月小说 | 国产香蕉尹人视频在线 | 99国产精品白浆在线观看免费 | 精品熟女少妇av免费观看 | 国产真人无遮挡作爱免费视频 | 在教室伦流澡到高潮hnp视频 | 天天av天天av天天透 | 国产成人av免费观看 | 亚洲色欲色欲欲www在线 | 76少妇精品导航 | 自拍偷自拍亚洲精品10p | 熟妇人妻激情偷爽文 | 免费观看的无遮挡av | 欧美日本精品一区二区三区 | 久久久久久九九精品久 | 99久久婷婷国产综合精品青草免费 | 久久精品国产大片免费观看 | 亚洲一区二区三区无码久久 | 亚洲国产综合无码一区 | 东京热男人av天堂 | 久久久久人妻一区精品色欧美 | 日本www一道久久久免费榴莲 | 麻豆国产97在线 | 欧洲 | 国产精品内射视频免费 | 四虎国产精品免费久久 | 99精品无人区乱码1区2区3区 | 国内少妇偷人精品视频 | 日韩精品无码一区二区中文字幕 | 日韩 欧美 动漫 国产 制服 | 欧美丰满少妇xxxx性 | 高清国产亚洲精品自在久久 | 风流少妇按摩来高潮 | 国产精品成人av在线观看 | 全球成人中文在线 | 欧美猛少妇色xxxxx | 久久国产36精品色熟妇 | 丝袜足控一区二区三区 | 国产国语老龄妇女a片 | 亚洲精品久久久久中文第一幕 | 国产成人无码av片在线观看不卡 | 久久无码中文字幕免费影院蜜桃 | 日韩亚洲欧美精品综合 | 久久亚洲a片com人成 | 日本免费一区二区三区最新 | 中文字幕乱妇无码av在线 | 精品一区二区不卡无码av | 亚洲精品中文字幕乱码 | 少妇久久久久久人妻无码 | 国产疯狂伦交大片 | 中文字幕人妻丝袜二区 | 亚洲熟熟妇xxxx | 亚洲成av人片在线观看无码不卡 | 国产手机在线αⅴ片无码观看 | 中文字幕无码免费久久9一区9 | 国产欧美熟妇另类久久久 | 精品国产国产综合精品 | 久久久精品国产sm最大网站 | 亚洲欧美日韩综合久久久 | а天堂中文在线官网 | 亚洲s码欧洲m码国产av | 国产精品无码一区二区桃花视频 | 国产精品18久久久久久麻辣 | 久久久久久久人妻无码中文字幕爆 | 久久国产精品二国产精品 | 成人欧美一区二区三区黑人免费 | 又紧又大又爽精品一区二区 | 亚洲色欲久久久综合网东京热 | 欧美丰满熟妇xxxx | 国产欧美精品一区二区三区 | 中文字幕 人妻熟女 | 无码帝国www无码专区色综合 | 亚洲精品一区二区三区在线观看 | 亚洲精品国产第一综合99久久 | 欧美人与动性行为视频 | 双乳奶水饱满少妇呻吟 | 国产亚洲日韩欧美另类第八页 | 欧美性色19p | 亚洲精品成人福利网站 | 成人免费视频一区二区 | 亚洲爆乳精品无码一区二区三区 | 亚洲人成网站在线播放942 | 国产真实乱对白精彩久久 | 偷窥村妇洗澡毛毛多 | 最近免费中文字幕中文高清百度 | 成人无码影片精品久久久 | аⅴ资源天堂资源库在线 | 国产精品99爱免费视频 | 久久久久久九九精品久 | 午夜理论片yy44880影院 | 亚洲国产精品无码久久久久高潮 | 国产在线aaa片一区二区99 | 亚洲精品国产精品乱码视色 | 国产午夜无码视频在线观看 | 无码人妻精品一区二区三区下载 | av无码电影一区二区三区 | 男女猛烈xx00免费视频试看 | 久久综合狠狠综合久久综合88 | 丰满人妻一区二区三区免费视频 | 国产猛烈高潮尖叫视频免费 | 国产香蕉97碰碰久久人人 | 999久久久国产精品消防器材 | 国内精品人妻无码久久久影院 | 露脸叫床粗话东北少妇 | v一区无码内射国产 | 日本一区二区三区免费播放 | 久久综合色之久久综合 | 少妇高潮喷潮久久久影院 | 性做久久久久久久久 | 久久99精品久久久久久动态图 | 亚洲欧美国产精品专区久久 | 亚洲成av人在线观看网址 | 99久久人妻精品免费一区 | 无码av最新清无码专区吞精 | 国产乱人偷精品人妻a片 | 人妻少妇精品视频专区 | 亚洲一区二区三区在线观看网站 | 欧美日韩一区二区综合 | v一区无码内射国产 | 成 人 网 站国产免费观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲熟妇色xxxxx欧美老妇y | 又大又黄又粗又爽的免费视频 | 免费国产黄网站在线观看 | 水蜜桃色314在线观看 | 欧美日韩一区二区免费视频 | 日本一卡二卡不卡视频查询 | 无码人妻久久一区二区三区不卡 | 国产香蕉尹人综合在线观看 | 久激情内射婷内射蜜桃人妖 | 中文字幕无码视频专区 | 久久99精品国产.久久久久 | 免费无码av一区二区 | 人妻体内射精一区二区三四 | 风流少妇按摩来高潮 | 亚洲码国产精品高潮在线 | 久久亚洲国产成人精品性色 | 久久国产自偷自偷免费一区调 | 无码人妻少妇伦在线电影 | 久久久久免费精品国产 | 少妇人妻av毛片在线看 | 久久久精品456亚洲影院 | 人人爽人人澡人人人妻 | 日日碰狠狠丁香久燥 | 天天摸天天透天天添 | 人人妻人人藻人人爽欧美一区 | 日本大乳高潮视频在线观看 | 精品国产一区二区三区av 性色 | 精品国产aⅴ无码一区二区 | 蜜臀aⅴ国产精品久久久国产老师 | 成人无码视频免费播放 | а天堂中文在线官网 | 男女超爽视频免费播放 | 亚无码乱人伦一区二区 | 人人妻人人澡人人爽精品欧美 | 亚洲一区av无码专区在线观看 | 综合人妻久久一区二区精品 | 国产舌乚八伦偷品w中 | 日韩少妇白浆无码系列 | 无码免费一区二区三区 | 欧美日韩久久久精品a片 | www国产亚洲精品久久久日本 | 国产xxx69麻豆国语对白 | 国产农村乱对白刺激视频 | 免费人成网站视频在线观看 | 国产性生大片免费观看性 | 亚洲一区二区三区偷拍女厕 | 大肉大捧一进一出视频出来呀 | 天干天干啦夜天干天2017 | 日日橹狠狠爱欧美视频 | 久久久成人毛片无码 | 一本色道久久综合狠狠躁 | 久久国内精品自在自线 | 欧美激情内射喷水高潮 | 鲁一鲁av2019在线 | 日韩人妻无码一区二区三区久久99 | 欧美日韩视频无码一区二区三 | 久久久久亚洲精品中文字幕 | 亚洲s色大片在线观看 | 熟妇女人妻丰满少妇中文字幕 | 97色伦图片97综合影院 | 亚洲熟妇自偷自拍另类 | 亚洲日韩av一区二区三区四区 | 久久亚洲精品中文字幕无男同 | 中文久久乱码一区二区 | 51国偷自产一区二区三区 | 色一情一乱一伦一区二区三欧美 | 在线播放免费人成毛片乱码 | 亚洲一区av无码专区在线观看 | 亚洲啪av永久无码精品放毛片 | 成熟女人特级毛片www免费 | 亚洲色大成网站www | 欧美日韩一区二区综合 | 荫蒂被男人添的好舒服爽免费视频 | 精品国产乱码久久久久乱码 | 亚洲无人区午夜福利码高清完整版 | 成人无码精品一区二区三区 | 国产无套内射久久久国产 | 在线看片无码永久免费视频 | 欧美色就是色 | 日日碰狠狠丁香久燥 | 99久久99久久免费精品蜜桃 | 精品乱子伦一区二区三区 | 久久亚洲日韩精品一区二区三区 | 免费观看黄网站 | 国产精品无码成人午夜电影 | 亚洲欧美国产精品久久 | 欧美成人午夜精品久久久 | 精品国产一区二区三区四区在线看 | 日本欧美一区二区三区乱码 | 亚洲色欲久久久综合网东京热 | 国产精品福利视频导航 | 99er热精品视频 | 色综合久久久久综合一本到桃花网 | 国产美女极度色诱视频www | 狠狠躁日日躁夜夜躁2020 | 国产精品人人妻人人爽 | 久久午夜无码鲁丝片午夜精品 | 日日鲁鲁鲁夜夜爽爽狠狠 | 婷婷五月综合缴情在线视频 | 中文字幕色婷婷在线视频 | 成熟女人特级毛片www免费 | 成人av无码一区二区三区 | 午夜丰满少妇性开放视频 | 又大又黄又粗又爽的免费视频 | 国产色视频一区二区三区 | 又湿又紧又大又爽a视频国产 | 青青草原综合久久大伊人精品 | 欧美阿v高清资源不卡在线播放 | 久久精品视频在线看15 | 欧美丰满熟妇xxxx性ppx人交 | 色欲人妻aaaaaaa无码 | 少妇性荡欲午夜性开放视频剧场 | 欧美熟妇另类久久久久久不卡 | 国产xxx69麻豆国语对白 | 老头边吃奶边弄进去呻吟 | 亚洲国产午夜精品理论片 | 美女毛片一区二区三区四区 | 日韩精品一区二区av在线 | 国产精品无码永久免费888 | 丰满少妇熟乱xxxxx视频 | 在线 国产 欧美 亚洲 天堂 | 丰腴饱满的极品熟妇 | 粗大的内捧猛烈进出视频 | 99在线 | 亚洲 | 日韩少妇白浆无码系列 | 高潮毛片无遮挡高清免费视频 | 日产精品高潮呻吟av久久 | 女人和拘做爰正片视频 | 天堂在线观看www | 九九在线中文字幕无码 | 99久久人妻精品免费一区 | 国产舌乚八伦偷品w中 | 香港三级日本三级妇三级 | 草草网站影院白丝内射 | 欧美一区二区三区视频在线观看 | 中文精品久久久久人妻不卡 | 午夜精品一区二区三区的区别 | 国产精品无套呻吟在线 | 国产精品无套呻吟在线 | 久久久久免费看成人影片 | 欧美自拍另类欧美综合图片区 | 国产精品毛片一区二区 | 300部国产真实乱 | 亚洲综合无码久久精品综合 | 中文字幕人成乱码熟女app | 麻花豆传媒剧国产免费mv在线 | 国产激情无码一区二区 | 亚洲欧美日韩国产精品一区二区 | 免费网站看v片在线18禁无码 | 乱人伦人妻中文字幕无码久久网 | 国产精品丝袜黑色高跟鞋 | 亚洲一区二区三区播放 | 少妇人妻av毛片在线看 | 中文字幕无码日韩专区 | 伊人久久大香线焦av综合影院 | 窝窝午夜理论片影院 | 激情内射亚州一区二区三区爱妻 | 在线播放免费人成毛片乱码 | 成人影院yy111111在线观看 | 99久久精品午夜一区二区 | 色诱久久久久综合网ywww | 久久久久久国产精品无码下载 | 天堂无码人妻精品一区二区三区 | 久久国产自偷自偷免费一区调 | 精品久久久无码人妻字幂 | 精品国产一区二区三区四区 | 亚洲色在线无码国产精品不卡 | 狂野欧美性猛交免费视频 | 丰腴饱满的极品熟妇 | 亚洲国产精品美女久久久久 | 波多野结衣一区二区三区av免费 | 亚洲成a人片在线观看无码 | 欧美亚洲国产一区二区三区 | 中文字幕日产无线码一区 | 波多野结衣av在线观看 | 中文字幕无码av激情不卡 | 欧美日韩人成综合在线播放 | 日韩av无码一区二区三区 | av小次郎收藏 | 欧美国产日产一区二区 | 97se亚洲精品一区 | 一本加勒比波多野结衣 | 亚洲中文字幕在线观看 | 麻花豆传媒剧国产免费mv在线 | 强伦人妻一区二区三区视频18 | 国产成人精品久久亚洲高清不卡 | 亚洲熟悉妇女xxx妇女av | 色 综合 欧美 亚洲 国产 | 亚洲欧美日韩国产精品一区二区 | 国内综合精品午夜久久资源 | 免费国产成人高清在线观看网站 | 亚洲日本va中文字幕 | 美女毛片一区二区三区四区 | 亚洲一区二区三区四区 | 毛片内射-百度 | 福利一区二区三区视频在线观看 | 久久精品女人天堂av免费观看 | 日本精品高清一区二区 | 亚洲精品国偷拍自产在线麻豆 | 国产在热线精品视频 | 国产在线一区二区三区四区五区 | 国产激情精品一区二区三区 | 无码人妻av免费一区二区三区 | 四虎影视成人永久免费观看视频 | 国产精品va在线播放 | 美女扒开屁股让男人桶 | 国产网红无码精品视频 | 欧美人妻一区二区三区 | 亚洲熟熟妇xxxx | 欧美35页视频在线观看 | 日韩精品无码免费一区二区三区 | 小sao货水好多真紧h无码视频 | 亚洲 另类 在线 欧美 制服 | 国内精品久久久久久中文字幕 | 亚洲s色大片在线观看 | 成在人线av无码免观看麻豆 | 无码任你躁久久久久久久 | 国产精品无套呻吟在线 | 97色伦图片97综合影院 | 5858s亚洲色大成网站www | 狠狠综合久久久久综合网 | 欧美精品无码一区二区三区 | 久久久久久久女国产乱让韩 | 欧美激情综合亚洲一二区 | 高清国产亚洲精品自在久久 | 日本熟妇大屁股人妻 | 永久免费精品精品永久-夜色 | 特大黑人娇小亚洲女 | 夜夜夜高潮夜夜爽夜夜爰爰 | 老熟女重囗味hdxx69 | 人妻与老人中文字幕 | 欧美猛少妇色xxxxx | 国产97人人超碰caoprom | 图片区 小说区 区 亚洲五月 | 国产精品嫩草久久久久 | 成人动漫在线观看 | 久久综合色之久久综合 | 久久国产精品精品国产色婷婷 | 国产情侣作爱视频免费观看 | 大肉大捧一进一出视频出来呀 | 国产网红无码精品视频 | 老熟妇仑乱视频一区二区 | 国产亚洲精品久久久久久久久动漫 | 国产三级精品三级男人的天堂 | 欧美乱妇无乱码大黄a片 | 人人爽人人爽人人片av亚洲 | 国产两女互慰高潮视频在线观看 | 老熟女乱子伦 | 奇米影视7777久久精品 | aa片在线观看视频在线播放 | 999久久久国产精品消防器材 | 精品国产一区二区三区四区 | 中文字幕无码免费久久99 | 亚洲精品国产精品乱码视色 | 思思久久99热只有频精品66 | 久久久成人毛片无码 | 久久成人a毛片免费观看网站 | 曰韩无码二三区中文字幕 | 国产精品a成v人在线播放 | 2020最新国产自产精品 | 国产免费久久精品国产传媒 | 日日摸夜夜摸狠狠摸婷婷 | 理论片87福利理论电影 | 国产人妻久久精品二区三区老狼 | 成人性做爰aaa片免费看 | 四十如虎的丰满熟妇啪啪 | 噜噜噜亚洲色成人网站 | 国产高清av在线播放 | 5858s亚洲色大成网站www | 免费无码av一区二区 | 少妇性荡欲午夜性开放视频剧场 | 欧美刺激性大交 | 中文字幕无码日韩欧毛 | 国产高清av在线播放 | 国产日产欧产精品精品app | 日韩av激情在线观看 | 大肉大捧一进一出视频出来呀 | 国产激情无码一区二区app | 亚洲中文字幕在线无码一区二区 | 国产精品多人p群无码 | 久久国产自偷自偷免费一区调 | 婷婷五月综合缴情在线视频 | 午夜熟女插插xx免费视频 | 欧洲精品码一区二区三区免费看 | 狠狠综合久久久久综合网 | 欧美 日韩 亚洲 在线 | 奇米影视888欧美在线观看 | 人人妻人人澡人人爽欧美一区九九 | 蜜臀av在线播放 久久综合激激的五月天 | 男女性色大片免费网站 | 色欲av亚洲一区无码少妇 | 激情国产av做激情国产爱 | 曰本女人与公拘交酡免费视频 | 人妻有码中文字幕在线 | 无码国模国产在线观看 | a国产一区二区免费入口 | 精品无码国产自产拍在线观看蜜 | 波多野42部无码喷潮在线 | 国产九九九九九九九a片 | 粗大的内捧猛烈进出视频 | 在线视频网站www色 | 国产综合在线观看 | 日日鲁鲁鲁夜夜爽爽狠狠 | 欧洲精品码一区二区三区免费看 | 人妻无码αv中文字幕久久琪琪布 | 午夜丰满少妇性开放视频 | 午夜精品久久久久久久 | 色综合天天综合狠狠爱 | 亚洲精品成a人在线观看 | 国产欧美亚洲精品a | 国产精品久久久久久亚洲毛片 | 国产一区二区三区影院 | 亚洲一区二区观看播放 | 婷婷色婷婷开心五月四房播播 | 国产成人精品三级麻豆 | 国产精品无码成人午夜电影 | 日韩精品无码免费一区二区三区 | 亚洲の无码国产の无码影院 | 亚洲の无码国产の无码影院 | 偷窥日本少妇撒尿chinese | 无码人妻丰满熟妇区五十路百度 | 亚洲精品国产精品乱码不卡 | 女人被爽到呻吟gif动态图视看 | 国产乡下妇女做爰 | 久久综合激激的五月天 | 性色欲情网站iwww九文堂 | 国产成人无码午夜视频在线观看 | 欧美日韩一区二区免费视频 | 无码av免费一区二区三区试看 | 一个人免费观看的www视频 | 国产免费无码一区二区视频 | 欧美喷潮久久久xxxxx | 99久久精品日本一区二区免费 | 伊人久久婷婷五月综合97色 | 精品国精品国产自在久国产87 | 久久精品国产一区二区三区肥胖 | 成人三级无码视频在线观看 | 国产无av码在线观看 | 无码成人精品区在线观看 | 午夜精品久久久内射近拍高清 | 小泽玛莉亚一区二区视频在线 | 亚洲va欧美va天堂v国产综合 | 国产精品欧美成人 | 动漫av网站免费观看 | 中文字幕无码热在线视频 | 免费无码一区二区三区蜜桃大 | 亚洲精品综合五月久久小说 | 婷婷丁香六月激情综合啪 | 欧美日韩亚洲国产精品 | 国产人成高清在线视频99最全资源 | 黄网在线观看免费网站 | 熟女少妇人妻中文字幕 | 大肉大捧一进一出视频出来呀 | 久久国产精品萌白酱免费 | 久精品国产欧美亚洲色aⅴ大片 | 久久99国产综合精品 | 亚洲中文字幕乱码av波多ji | 亚洲精品国产a久久久久久 | 色噜噜亚洲男人的天堂 | 在线观看欧美一区二区三区 | 人人爽人人爽人人片av亚洲 | 亚洲欧美日韩国产精品一区二区 | 双乳奶水饱满少妇呻吟 | 日日橹狠狠爱欧美视频 | 国产熟妇另类久久久久 | 国产又爽又黄又刺激的视频 | 牛和人交xxxx欧美 | 风流少妇按摩来高潮 | 国产极品美女高潮无套在线观看 | 国产日产欧产精品精品app | 精品亚洲韩国一区二区三区 | 在线精品亚洲一区二区 | 精品欧美一区二区三区久久久 | 中文精品无码中文字幕无码专区 | 亚洲综合伊人久久大杳蕉 | 国产人妻久久精品二区三区老狼 | 成人精品一区二区三区中文字幕 | 亚洲国产精华液网站w | 免费人成在线观看网站 | 强辱丰满人妻hd中文字幕 | 国产精品久久久一区二区三区 | 青青青爽视频在线观看 | 午夜熟女插插xx免费视频 | 日本大乳高潮视频在线观看 | 久热国产vs视频在线观看 | 亚洲综合无码久久精品综合 | 人妻插b视频一区二区三区 | 图片小说视频一区二区 | 丰满少妇女裸体bbw | 欧美熟妇另类久久久久久不卡 | 国产亚洲精品久久久闺蜜 | 亚洲成在人网站无码天堂 | 欧美成人高清在线播放 | 少妇太爽了在线观看 | 无码国产乱人伦偷精品视频 | 久久精品一区二区三区四区 | 中文字幕乱码中文乱码51精品 | 国产成人一区二区三区别 | 欧美成人午夜精品久久久 | 曰韩无码二三区中文字幕 | 永久黄网站色视频免费直播 | 精品无码国产自产拍在线观看蜜 | 国产精华av午夜在线观看 | 最新版天堂资源中文官网 | 国产精品办公室沙发 | 亲嘴扒胸摸屁股激烈网站 | 久久久成人毛片无码 | 久久久www成人免费毛片 | 久久精品中文闷骚内射 | 伊人久久婷婷五月综合97色 | 桃花色综合影院 | 久久久久久久久蜜桃 | 成年女人永久免费看片 | 国语精品一区二区三区 | 无码午夜成人1000部免费视频 | 欧美性黑人极品hd | 人人爽人人澡人人高潮 | 激情爆乳一区二区三区 | 一本无码人妻在中文字幕免费 | 300部国产真实乱 | 国产精品久久福利网站 | 夜精品a片一区二区三区无码白浆 | 偷窥村妇洗澡毛毛多 | 久久精品国产大片免费观看 | 青草视频在线播放 | 亚洲人成网站在线播放942 | 免费人成在线视频无码 | 国产特级毛片aaaaaa高潮流水 | av在线亚洲欧洲日产一区二区 | 亚洲人成影院在线无码按摩店 | 无码福利日韩神码福利片 | 国产av一区二区精品久久凹凸 | 欧美放荡的少妇 | 日韩精品久久久肉伦网站 | 桃花色综合影院 | 国产色视频一区二区三区 | 亚洲综合久久一区二区 | 成人欧美一区二区三区黑人 | 亚洲中文字幕成人无码 | 亚洲精品久久久久avwww潮水 | 国产性生大片免费观看性 | 亚洲大尺度无码无码专区 | 女人被男人躁得好爽免费视频 | 久久精品国产一区二区三区 | 国内揄拍国内精品人妻 | 未满成年国产在线观看 | 久久成人a毛片免费观看网站 | 日本va欧美va欧美va精品 | 内射老妇bbwx0c0ck | 十八禁视频网站在线观看 | 久久久久se色偷偷亚洲精品av | 国内揄拍国内精品人妻 | 国产av一区二区精品久久凹凸 | 亚洲一区二区三区在线观看网站 | 亚洲天堂2017无码 | 性生交片免费无码看人 | 日本精品人妻无码免费大全 | 亚洲国精产品一二二线 | 国产日产欧产精品精品app | 日韩亚洲欧美中文高清在线 | 少妇性荡欲午夜性开放视频剧场 | 日韩人妻无码中文字幕视频 | 国产三级久久久精品麻豆三级 | 狂野欧美性猛xxxx乱大交 | 国产9 9在线 | 中文 | 国模大胆一区二区三区 | 久久99国产综合精品 | 亚洲 a v无 码免 费 成 人 a v | 亚洲自偷自拍另类第1页 | 丰满护士巨好爽好大乳 | 一本精品99久久精品77 | 日日鲁鲁鲁夜夜爽爽狠狠 | 天天综合网天天综合色 | 欧美人与禽猛交狂配 | 男女爱爱好爽视频免费看 | 六月丁香婷婷色狠狠久久 | 男人扒开女人内裤强吻桶进去 | 亚洲国产av精品一区二区蜜芽 | 欧美性猛交xxxx富婆 | 精品国精品国产自在久国产87 | 国产又爽又猛又粗的视频a片 | 人人妻人人澡人人爽人人精品浪潮 | 九月婷婷人人澡人人添人人爽 | 国产莉萝无码av在线播放 | 亚洲人成网站在线播放942 | 国产区女主播在线观看 | 成人一在线视频日韩国产 | 俺去俺来也在线www色官网 | 色 综合 欧美 亚洲 国产 | 亚洲中文字幕无码中字 | 久久99热只有频精品8 | 国产无套内射久久久国产 | 亚洲国产午夜精品理论片 | 麻豆人妻少妇精品无码专区 | 婷婷综合久久中文字幕蜜桃三电影 | 大地资源网第二页免费观看 | 精品偷拍一区二区三区在线看 | 国产97色在线 | 免 | a片免费视频在线观看 | 精品无码一区二区三区爱欲 | 97夜夜澡人人双人人人喊 | 亚洲精品一区二区三区婷婷月 | 亚洲熟悉妇女xxx妇女av | 日韩欧美群交p片內射中文 | 性生交大片免费看女人按摩摩 | 男人的天堂av网站 | 99精品视频在线观看免费 | 人妻天天爽夜夜爽一区二区 | 亚洲中文字幕在线无码一区二区 | 18禁黄网站男男禁片免费观看 | 一本无码人妻在中文字幕免费 | 色欲综合久久中文字幕网 | 国产午夜手机精彩视频 | 久久久久久久女国产乱让韩 | 欧美性黑人极品hd | 国产69精品久久久久app下载 | 亚洲毛片av日韩av无码 | 国产两女互慰高潮视频在线观看 | 免费无码av一区二区 | 亚洲 欧美 激情 小说 另类 | 老熟妇仑乱视频一区二区 | 在线亚洲高清揄拍自拍一品区 | 97无码免费人妻超级碰碰夜夜 | 国产人妻精品一区二区三区 | 国产色在线 | 国产 | 麻豆国产人妻欲求不满 | 欧美丰满熟妇xxxx性ppx人交 | 国产精品爱久久久久久久 | 亚洲小说春色综合另类 | 国内综合精品午夜久久资源 | 丁香花在线影院观看在线播放 | 51国偷自产一区二区三区 | 亚洲精品久久久久久久久久久 | 大色综合色综合网站 | 亚洲小说春色综合另类 | 久久无码专区国产精品s | 亚洲中文字幕无码中文字在线 | 国产成人无码av片在线观看不卡 | 成人亚洲精品久久久久 | 欧美精品在线观看 | 久久久久99精品成人片 | 任你躁在线精品免费 | 色一情一乱一伦一视频免费看 | 欧美性生交xxxxx久久久 | 久久久久久a亚洲欧洲av冫 | 国内精品久久毛片一区二区 | 无码av中文字幕免费放 | 国产精品嫩草久久久久 | 国产精品办公室沙发 | 国产综合色产在线精品 | 55夜色66夜色国产精品视频 | 成人无码视频免费播放 | 熟妇女人妻丰满少妇中文字幕 | 99久久精品午夜一区二区 | 狠狠综合久久久久综合网 | 99久久99久久免费精品蜜桃 | 青青草原综合久久大伊人精品 | 亚洲日本va中文字幕 | 老熟妇仑乱视频一区二区 | 久久久国产一区二区三区 | 国产精品福利视频导航 | 国产精品国产三级国产专播 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 色综合天天综合狠狠爱 | 一本色道久久综合狠狠躁 | 欧美成人家庭影院 | 国产日产欧产精品精品app | 大地资源中文第3页 | 熟妇女人妻丰满少妇中文字幕 | 少妇性l交大片欧洲热妇乱xxx | 给我免费的视频在线观看 | 无码午夜成人1000部免费视频 | 成人亚洲精品久久久久软件 | 大色综合色综合网站 | 无码午夜成人1000部免费视频 | 中文字幕无码日韩专区 | 国产美女精品一区二区三区 | 高清无码午夜福利视频 | 国产特级毛片aaaaaaa高清 | 老熟妇仑乱视频一区二区 | 99精品无人区乱码1区2区3区 | 无码毛片视频一区二区本码 | 国产97人人超碰caoprom | 亚洲欧美精品伊人久久 | 国产熟妇高潮叫床视频播放 | 亚洲中文字幕在线观看 | 亚洲综合精品香蕉久久网 | 99精品视频在线观看免费 | 夫妻免费无码v看片 | 欧美日韩视频无码一区二区三 | 国产97人人超碰caoprom | 天下第一社区视频www日本 | 东京热男人av天堂 | 精品久久久久香蕉网 | 成人精品视频一区二区 | 人人妻人人澡人人爽人人精品浪潮 | 久久精品国产99精品亚洲 | 成人欧美一区二区三区黑人 | 中文字幕无码免费久久9一区9 | 国产国产精品人在线视 | 97精品人妻一区二区三区香蕉 | 久久久国产精品无码免费专区 | 日韩少妇白浆无码系列 | 少妇一晚三次一区二区三区 | 一本大道久久东京热无码av | 18黄暴禁片在线观看 | 又大又黄又粗又爽的免费视频 | 久久亚洲a片com人成 | 久久国产劲爆∧v内射 | 亚洲中文字幕无码中字 | 全黄性性激高免费视频 | 国产熟妇另类久久久久 | 精品国产成人一区二区三区 | 东京热无码av男人的天堂 | 狠狠cao日日穞夜夜穞av | 午夜性刺激在线视频免费 | 亚洲色偷偷偷综合网 | 十八禁视频网站在线观看 | 国产精品第一国产精品 | 日韩欧美中文字幕在线三区 | 老子影院午夜伦不卡 | 国产三级精品三级男人的天堂 | 亚欧洲精品在线视频免费观看 | 欧美日本精品一区二区三区 | 亚洲一区av无码专区在线观看 | 国产亚洲精品久久久闺蜜 | 亚洲一区二区三区香蕉 | 久久人人爽人人爽人人片ⅴ | 少妇人妻偷人精品无码视频 | 欧美亚洲国产一区二区三区 | 国产激情无码一区二区app | 少妇无码av无码专区在线观看 | 波多野结衣av在线观看 | 国产精品欧美成人 | 在线观看国产午夜福利片 | 狠狠噜狠狠狠狠丁香五月 | 中文字幕无码日韩专区 | 99久久久国产精品无码免费 | 曰韩少妇内射免费播放 | 日韩少妇白浆无码系列 | 国产人妻人伦精品1国产丝袜 | 日日天日日夜日日摸 | 精品少妇爆乳无码av无码专区 | 免费观看激色视频网站 | 国产精品亚洲五月天高清 | 国产两女互慰高潮视频在线观看 | ass日本丰满熟妇pics | 初尝人妻少妇中文字幕 | 亚洲成a人一区二区三区 | 国产av无码专区亚洲a∨毛片 | 国产超碰人人爽人人做人人添 | 精品午夜福利在线观看 | 未满成年国产在线观看 | 国产莉萝无码av在线播放 | 少妇人妻大乳在线视频 | 亚洲国产成人av在线观看 | 激情爆乳一区二区三区 | 亚洲成av人综合在线观看 | 国产成人无码a区在线观看视频app | 天天摸天天碰天天添 | 图片小说视频一区二区 | 精品一区二区三区无码免费视频 | 日本一卡2卡3卡四卡精品网站 | 精品国产一区二区三区四区 | 久久伊人色av天堂九九小黄鸭 | 欧美熟妇另类久久久久久不卡 | 熟女少妇在线视频播放 | 99久久亚洲精品无码毛片 | 欧美一区二区三区视频在线观看 | 国产无套内射久久久国产 | 图片区 小说区 区 亚洲五月 | 国产精品.xx视频.xxtv | 中文字幕乱码中文乱码51精品 | 欧美日韩人成综合在线播放 | 成人免费无码大片a毛片 | 老熟女重囗味hdxx69 | 亚洲成a人片在线观看无码3d | 在线亚洲高清揄拍自拍一品区 | 成人欧美一区二区三区 | 激情内射日本一区二区三区 | 波多野结衣av一区二区全免费观看 | 免费网站看v片在线18禁无码 | 在线观看国产一区二区三区 | 亚洲成av人片在线观看无码不卡 | 俄罗斯老熟妇色xxxx | 大地资源网第二页免费观看 | a在线亚洲男人的天堂 | 正在播放老肥熟妇露脸 | 亚无码乱人伦一区二区 | 扒开双腿吃奶呻吟做受视频 | 亚洲欧美综合区丁香五月小说 | 亚洲の无码国产の无码影院 | 亚欧洲精品在线视频免费观看 | 欧美熟妇另类久久久久久不卡 | 国产成人午夜福利在线播放 | 熟妇人妻中文av无码 | 日韩在线不卡免费视频一区 | 婷婷色婷婷开心五月四房播播 | 久久综合色之久久综合 | 久久99精品国产.久久久久 | 少妇性l交大片欧洲热妇乱xxx | 久久久久久亚洲精品a片成人 | 日本熟妇人妻xxxxx人hd | 精品人妻人人做人人爽夜夜爽 | 欧美色就是色 | 欧美性猛交xxxx富婆 | 亚洲日韩av一区二区三区中文 | 亚洲一区二区观看播放 | 国产一区二区三区精品视频 | 国产一精品一av一免费 | 日韩人妻无码一区二区三区久久99 | 99er热精品视频 | 日韩亚洲欧美精品综合 | 亚洲大尺度无码无码专区 | 天天摸天天透天天添 | 玩弄中年熟妇正在播放 | 欧美午夜特黄aaaaaa片 | 久久久久亚洲精品中文字幕 | 黑森林福利视频导航 | 国产成人无码区免费内射一片色欲 | 久久国内精品自在自线 | 精品熟女少妇av免费观看 | 精品 日韩 国产 欧美 视频 | 丰满人妻一区二区三区免费视频 | 人人爽人人澡人人高潮 | 久久精品人妻少妇一区二区三区 | 欧美人与禽zoz0性伦交 | 久久久久se色偷偷亚洲精品av | 国产色精品久久人妻 | 国产无遮挡吃胸膜奶免费看 | 婷婷丁香五月天综合东京热 | 2019nv天堂香蕉在线观看 | 欧美日韩一区二区免费视频 | 国产极品美女高潮无套在线观看 | 鲁一鲁av2019在线 | 少妇无码吹潮 | 人妻天天爽夜夜爽一区二区 | 成人无码视频免费播放 | 亚洲欧美日韩成人高清在线一区 | 男女爱爱好爽视频免费看 | 18无码粉嫩小泬无套在线观看 | 国内少妇偷人精品视频免费 | 欧美日本精品一区二区三区 | 无码任你躁久久久久久久 | 国产婷婷色一区二区三区在线 | 熟妇女人妻丰满少妇中文字幕 | 日韩人妻无码一区二区三区久久99 | 熟妇人妻激情偷爽文 | 大肉大捧一进一出好爽视频 | 国产乱人无码伦av在线a | av在线亚洲欧洲日产一区二区 | 任你躁国产自任一区二区三区 | 日产精品高潮呻吟av久久 | 日日碰狠狠躁久久躁蜜桃 | 国产成人精品三级麻豆 | 国产精品无码一区二区三区不卡 | 亚洲男人av天堂午夜在 | 亚洲乱码国产乱码精品精 | 精品偷拍一区二区三区在线看 | 中文字幕无码视频专区 | 亚洲色偷偷男人的天堂 | 在线播放免费人成毛片乱码 | 国产色xx群视频射精 | 国产精品对白交换视频 | 国产又爽又黄又刺激的视频 | 一本久久a久久精品亚洲 | 天天做天天爱天天爽综合网 | 欧美成人高清在线播放 | 国产精品爱久久久久久久 | 国产办公室秘书无码精品99 | 日本乱人伦片中文三区 | 欧美精品无码一区二区三区 | av人摸人人人澡人人超碰下载 | 色情久久久av熟女人妻网站 | 澳门永久av免费网站 | 欧美性黑人极品hd | 午夜福利不卡在线视频 | 波多野42部无码喷潮在线 | 粉嫩少妇内射浓精videos | 老司机亚洲精品影院无码 | 内射老妇bbwx0c0ck | 欧美色就是色 | 麻豆国产97在线 | 欧洲 | 男女下面进入的视频免费午夜 | 国产午夜视频在线观看 | 国产精品久久久一区二区三区 | 天堂无码人妻精品一区二区三区 | 人人爽人人澡人人人妻 | 国产精品美女久久久网av | 亚洲国产精品一区二区美利坚 | 亚洲熟妇色xxxxx欧美老妇 | 欧美亚洲日韩国产人成在线播放 | 300部国产真实乱 | 欧美 日韩 亚洲 在线 | 少妇性荡欲午夜性开放视频剧场 | 欧美 日韩 亚洲 在线 | 精品国产乱码久久久久乱码 | 精品厕所偷拍各类美女tp嘘嘘 | 欧美老熟妇乱xxxxx | 1000部啪啪未满十八勿入下载 | 男人的天堂2018无码 | 国产黑色丝袜在线播放 | 国产熟妇另类久久久久 | 成人毛片一区二区 | 色婷婷综合中文久久一本 | 奇米影视7777久久精品人人爽 | 久9re热视频这里只有精品 | 中文字幕无码免费久久9一区9 | 久久久久久a亚洲欧洲av冫 | 国产乱人伦av在线无码 | 伊人久久大香线蕉av一区二区 | 久久精品国产99精品亚洲 | 男人的天堂2018无码 | 久久伊人色av天堂九九小黄鸭 | 日韩视频 中文字幕 视频一区 | 狠狠色丁香久久婷婷综合五月 | 风流少妇按摩来高潮 | 中文字幕无码乱人伦 | 在线a亚洲视频播放在线观看 | 精品久久8x国产免费观看 | 久久综合激激的五月天 | 国产欧美精品一区二区三区 | 亚洲另类伦春色综合小说 | 丰满人妻一区二区三区免费视频 | 国产亚洲精品久久久久久国模美 | 丰满少妇高潮惨叫视频 | 色一情一乱一伦一区二区三欧美 | 波多野结衣高清一区二区三区 | 精品国产麻豆免费人成网站 | 精品国产国产综合精品 | 精品无人区无码乱码毛片国产 | 风流少妇按摩来高潮 | 国产av无码专区亚洲a∨毛片 | 成年女人永久免费看片 | 一本久久a久久精品vr综合 | 蜜桃av抽搐高潮一区二区 | 激情综合激情五月俺也去 | 女人被男人躁得好爽免费视频 | 国产精品毛多多水多 | 国产偷国产偷精品高清尤物 | 国产xxx69麻豆国语对白 | 精品久久久久香蕉网 | 97人妻精品一区二区三区 | 内射老妇bbwx0c0ck | 波多野结衣一区二区三区av免费 | 亚洲日韩av一区二区三区中文 | 国产精品自产拍在线观看 | 久久人妻内射无码一区三区 | 啦啦啦www在线观看免费视频 | 久久久无码中文字幕久... | 国产精品手机免费 | 日本精品少妇一区二区三区 | 麻豆人妻少妇精品无码专区 | 日韩精品无码免费一区二区三区 | 国内精品久久毛片一区二区 | 精品人妻人人做人人爽 | 亚洲国产精品无码一区二区三区 | 国产精品美女久久久网av | 久久亚洲中文字幕精品一区 | 99久久人妻精品免费二区 | 国产热a欧美热a在线视频 | 欧美性猛交内射兽交老熟妇 | 亚洲精品成人av在线 | 2020久久超碰国产精品最新 | 成人免费视频在线观看 | 成人无码视频在线观看网站 | 六月丁香婷婷色狠狠久久 | 国产精品对白交换视频 | 国产午夜视频在线观看 | 300部国产真实乱 | 扒开双腿吃奶呻吟做受视频 | 亚洲精品午夜国产va久久成人 | 中文毛片无遮挡高清免费 | 国产精品嫩草久久久久 | 国产乱人无码伦av在线a | 亚洲国产精品久久人人爱 | 久久精品成人欧美大片 | 中文字幕人妻无码一夲道 | 婷婷色婷婷开心五月四房播播 | 无码人妻久久一区二区三区不卡 | 亚洲无人区一区二区三区 | 亚洲欧美精品aaaaaa片 | 男女性色大片免费网站 | 国内精品九九久久久精品 | 高潮毛片无遮挡高清免费 | 中文无码成人免费视频在线观看 | 无码精品国产va在线观看dvd | 色婷婷欧美在线播放内射 | 初尝人妻少妇中文字幕 | 成人无码视频免费播放 | 国产精品高潮呻吟av久久 | 欧美 日韩 亚洲 在线 | 亚洲小说图区综合在线 | 国产亚洲精品久久久久久大师 | 在线播放免费人成毛片乱码 | 国产又爽又猛又粗的视频a片 | 无码播放一区二区三区 | 婷婷五月综合激情中文字幕 | 领导边摸边吃奶边做爽在线观看 | 无码帝国www无码专区色综合 | 无码人妻少妇伦在线电影 | 欧美三级a做爰在线观看 | 黑人粗大猛烈进出高潮视频 | 国产av久久久久精东av | 少女韩国电视剧在线观看完整 | 天天av天天av天天透 | 中文字幕精品av一区二区五区 | а√天堂www在线天堂小说 | 99久久99久久免费精品蜜桃 | 两性色午夜视频免费播放 | 漂亮人妻洗澡被公强 日日躁 | 久久精品国产精品国产精品污 | 少妇厨房愉情理9仑片视频 | 激情内射亚州一区二区三区爱妻 | 99久久无码一区人妻 | 精品人人妻人人澡人人爽人人 | 国产成人一区二区三区在线观看 | 日韩欧美群交p片內射中文 | 性色欲网站人妻丰满中文久久不卡 | 国产莉萝无码av在线播放 | 国产色xx群视频射精 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产精品久久久久久亚洲影视内衣 | 成人无码影片精品久久久 | 丝袜足控一区二区三区 | 18黄暴禁片在线观看 | 久久天天躁狠狠躁夜夜免费观看 | 欧美精品无码一区二区三区 | 又黄又爽又色的视频 | 丰满人妻被黑人猛烈进入 | aⅴ在线视频男人的天堂 | 少妇太爽了在线观看 | 国产午夜亚洲精品不卡 | 国产精品人妻一区二区三区四 | 中文字幕av无码一区二区三区电影 | 国内精品久久久久久中文字幕 | 激情亚洲一区国产精品 | 欧美激情一区二区三区成人 | 内射爽无广熟女亚洲 | 国产乱人伦av在线无码 | 国产明星裸体无码xxxx视频 | 精品乱子伦一区二区三区 | 伊人久久大香线蕉av一区二区 | 亚洲精品一区三区三区在线观看 | 久久99久久99精品中文字幕 | 国产激情无码一区二区 | 色窝窝无码一区二区三区色欲 | 亚洲国产欧美日韩精品一区二区三区 | 1000部夫妻午夜免费 | 精品无码一区二区三区的天堂 | www国产亚洲精品久久久日本 | 2020久久香蕉国产线看观看 | 丰满人妻一区二区三区免费视频 | 国产乱码精品一品二品 | 5858s亚洲色大成网站www | 欧美阿v高清资源不卡在线播放 | 亚洲国产欧美日韩精品一区二区三区 | 成人无码影片精品久久久 | 欧美兽交xxxx×视频 | 欧美黑人巨大xxxxx | 无码人妻av免费一区二区三区 | aⅴ亚洲 日韩 色 图网站 播放 | 欧美精品国产综合久久 | a片在线免费观看 | 精品国产一区二区三区四区 | 香蕉久久久久久av成人 | 乱人伦人妻中文字幕无码久久网 | 久久天天躁狠狠躁夜夜免费观看 | 久久精品女人天堂av免费观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品人人爽人人做我的可爱 | 男女猛烈xx00免费视频试看 | 青青青手机频在线观看 | 天下第一社区视频www日本 |