3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

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

综合教程

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 | 天天爽夜夜爽夜夜爽 | 99视频精品全部免费免费观看 | 伊人色综合久久天天小片 | 国内精品久久久久久中文字幕 | 精品久久综合1区2区3区激情 | 理论片87福利理论电影 | 国产极品美女高潮无套在线观看 | 综合激情五月综合激情五月激情1 | 乱中年女人伦av三区 | 国内少妇偷人精品视频 | 久久精品国产大片免费观看 | 爆乳一区二区三区无码 | аⅴ资源天堂资源库在线 | 成人性做爰aaa片免费看不忠 | 漂亮人妻洗澡被公强 日日躁 | a片在线免费观看 | 亚洲 高清 成人 动漫 | 国产成人精品一区二区在线小狼 | 亚洲成av人在线观看网址 | 亚洲日本在线电影 | 中文字幕乱码人妻二区三区 | 中文字幕av无码一区二区三区电影 | 国产精品a成v人在线播放 | 永久免费精品精品永久-夜色 | 国产婷婷色一区二区三区在线 | 国产在线无码精品电影网 | 2020久久香蕉国产线看观看 | 日韩精品a片一区二区三区妖精 | 精品国产精品久久一区免费式 | 亚洲精品综合五月久久小说 | 荫蒂添的好舒服视频囗交 | 亚洲精品综合一区二区三区在线 | 成年美女黄网站色大免费视频 | 色偷偷人人澡人人爽人人模 | 97无码免费人妻超级碰碰夜夜 | 日本丰满熟妇videos | 一本色道久久综合亚洲精品不卡 | 正在播放东北夫妻内射 | 亚洲国产成人a精品不卡在线 | 欧洲精品码一区二区三区免费看 | 国产精品丝袜黑色高跟鞋 | 一本大道伊人av久久综合 | 奇米影视7777久久精品人人爽 | 亚洲色大成网站www | 成年女人永久免费看片 | 亚洲人交乣女bbw | 日韩少妇白浆无码系列 | 亚洲国产日韩a在线播放 | 九九在线中文字幕无码 | 黑人玩弄人妻中文在线 | 西西人体www44rt大胆高清 | 亚洲人亚洲人成电影网站色 | 青青青爽视频在线观看 | 免费网站看v片在线18禁无码 | 日本熟妇人妻xxxxx人hd | 免费人成在线观看网站 | 精品久久久久久亚洲精品 | 精品 日韩 国产 欧美 视频 | 无遮挡啪啪摇乳动态图 | 亚洲日韩av一区二区三区四区 | 精品无人区无码乱码毛片国产 | 国产精品二区一区二区aⅴ污介绍 | 亚洲综合精品香蕉久久网 | av小次郎收藏 | 樱花草在线播放免费中文 | 日韩av无码中文无码电影 | 天天摸天天碰天天添 | 精品水蜜桃久久久久久久 | 蜜臀av无码人妻精品 | 又色又爽又黄的美女裸体网站 | 国产舌乚八伦偷品w中 | 亚洲日韩av一区二区三区中文 | 在线成人www免费观看视频 | 日本爽爽爽爽爽爽在线观看免 | 国产超碰人人爽人人做人人添 | 国产精品理论片在线观看 | 人妻无码久久精品人妻 | 欧美阿v高清资源不卡在线播放 | 成人欧美一区二区三区黑人免费 | 国产成人综合美国十次 | 精品成人av一区二区三区 | 久久亚洲精品中文字幕无男同 | 国产内射老熟女aaaa | 国产三级精品三级男人的天堂 | 麻豆md0077饥渴少妇 | 精品偷自拍另类在线观看 | 永久免费观看美女裸体的网站 | 宝宝好涨水快流出来免费视频 | 国产精品无套呻吟在线 | 国产超级va在线观看视频 | 久久久久亚洲精品中文字幕 | 国产亚洲精品精品国产亚洲综合 | 午夜时刻免费入口 | 欧美成人免费全部网站 | 人人澡人摸人人添 | 无码人妻少妇伦在线电影 | 婷婷五月综合缴情在线视频 | 性生交大片免费看女人按摩摩 | 日日橹狠狠爱欧美视频 | 成年美女黄网站色大免费视频 | 国产一区二区三区精品视频 | 亚洲精品无码国产 | 成熟人妻av无码专区 | 98国产精品综合一区二区三区 | 国产性生交xxxxx无码 | 免费无码午夜福利片69 | 中文字幕乱码中文乱码51精品 | 久久综合狠狠综合久久综合88 | 国产日产欧产精品精品app | 激情人妻另类人妻伦 | 久久久久亚洲精品男人的天堂 | 国内精品九九久久久精品 | 国产在线aaa片一区二区99 | 国产av无码专区亚洲awww | 国产精品爱久久久久久久 | 未满小14洗澡无码视频网站 | 成人无码精品一区二区三区 | 亚洲欧洲日本综合aⅴ在线 | 老司机亚洲精品影院 | 精品国产一区二区三区四区 | 蜜臀av无码人妻精品 | 欧洲熟妇色 欧美 | 久久久久久久女国产乱让韩 | 国产精品久久久av久久久 | 黑人粗大猛烈进出高潮视频 | 色五月五月丁香亚洲综合网 | 欧美黑人巨大xxxxx | 亚洲欧美中文字幕5发布 | a国产一区二区免费入口 | 亚洲成av人影院在线观看 | 欧美日韩一区二区综合 | 中文精品久久久久人妻不卡 | 999久久久国产精品消防器材 | 性啪啪chinese东北女人 | 一本久久a久久精品亚洲 | 亚洲人成影院在线观看 | 精品国产青草久久久久福利 | a在线亚洲男人的天堂 | 久久久无码中文字幕久... | 大色综合色综合网站 | 精品国产av色一区二区深夜久久 | 人妻与老人中文字幕 | 88国产精品欧美一区二区三区 | 欧美日韩在线亚洲综合国产人 | 99久久99久久免费精品蜜桃 | 一个人看的www免费视频在线观看 | 欧美高清在线精品一区 | 夫妻免费无码v看片 | 亚洲春色在线视频 | 国产又粗又硬又大爽黄老大爷视 | 撕开奶罩揉吮奶头视频 | 婷婷综合久久中文字幕蜜桃三电影 | 成人欧美一区二区三区黑人 | 美女扒开屁股让男人桶 | 亚洲 日韩 欧美 成人 在线观看 | 激情国产av做激情国产爱 | 国产乱人偷精品人妻a片 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产人妻精品午夜福利免费 | 精品 日韩 国产 欧美 视频 | 免费看男女做好爽好硬视频 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲成av人片天堂网无码】 | 精品国产乱码久久久久乱码 | 亚洲大尺度无码无码专区 | 水蜜桃亚洲一二三四在线 | 精品国产精品久久一区免费式 | 蜜桃无码一区二区三区 | 国内少妇偷人精品视频 | 精品国产国产综合精品 | 欧美xxxxx精品 | 国色天香社区在线视频 | 四虎影视成人永久免费观看视频 | 久久精品女人的天堂av | 亚洲一区二区三区四区 | 精品国产一区二区三区av 性色 | 少妇邻居内射在线 | 天干天干啦夜天干天2017 | 久久97精品久久久久久久不卡 | 国产精品久免费的黄网站 | 欧美野外疯狂做受xxxx高潮 | 麻豆果冻传媒2021精品传媒一区下载 | 婷婷六月久久综合丁香 | 免费网站看v片在线18禁无码 | 国产精品99爱免费视频 | 久久久久成人精品免费播放动漫 | 日韩无套无码精品 | 乱人伦人妻中文字幕无码 | 国产在线aaa片一区二区99 | 欧美激情综合亚洲一二区 | 狠狠色噜噜狠狠狠7777奇米 | 色狠狠av一区二区三区 | 免费观看又污又黄的网站 | 中文精品无码中文字幕无码专区 | 一本一道久久综合久久 | 中文字幕乱码中文乱码51精品 | 99久久精品午夜一区二区 | 亚洲日本一区二区三区在线 | 午夜不卡av免费 一本久久a久久精品vr综合 | 久久久久久九九精品久 | 亚洲精品国产精品乱码视色 | 嫩b人妻精品一区二区三区 | 亚洲午夜久久久影院 | 国产一精品一av一免费 | 中文无码精品a∨在线观看不卡 | 中国女人内谢69xxxxxa片 | 精品国偷自产在线视频 | 久久久av男人的天堂 | 午夜福利不卡在线视频 | 九一九色国产 | 国产人妻人伦精品1国产丝袜 | 水蜜桃av无码 | 扒开双腿疯狂进出爽爽爽视频 | 欧美丰满熟妇xxxx性ppx人交 | 国产在线精品一区二区高清不卡 | 亚洲春色在线视频 | 中文字幕+乱码+中文字幕一区 | 国产成人av免费观看 | 国产精品手机免费 | 亚洲毛片av日韩av无码 | 性做久久久久久久免费看 | 国精产品一区二区三区 | 免费人成在线观看网站 | 国产精品无码一区二区桃花视频 | 2020最新国产自产精品 | 成在人线av无码免费 | 99国产精品白浆在线观看免费 | av无码电影一区二区三区 | 人妻无码久久精品人妻 | 秋霞特色aa大片 | 国产成人无码av片在线观看不卡 | 男人的天堂av网站 | 99精品国产综合久久久久五月天 | 欧美激情综合亚洲一二区 | 少女韩国电视剧在线观看完整 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲男人av香蕉爽爽爽爽 | 亚洲成av人片在线观看无码不卡 | av香港经典三级级 在线 | 乱人伦人妻中文字幕无码 | 在线 国产 欧美 亚洲 天堂 | 中文字幕 亚洲精品 第1页 | 最新国产麻豆aⅴ精品无码 | 亚洲色偷偷偷综合网 | 丁香啪啪综合成人亚洲 | 国产成人无码a区在线观看视频app | 亚洲色欲久久久综合网东京热 | 国产黄在线观看免费观看不卡 | √天堂中文官网8在线 | 曰韩无码二三区中文字幕 | 成人免费视频一区二区 | 午夜精品一区二区三区在线观看 | 国产乱人无码伦av在线a | 无人区乱码一区二区三区 | 国产欧美熟妇另类久久久 | 一本色道婷婷久久欧美 | 国产精品久久久久久久影院 | 色综合久久中文娱乐网 | 国产精品欧美成人 | 欧美日韩一区二区三区自拍 | 亚洲狠狠婷婷综合久久 | 曰本女人与公拘交酡免费视频 | 久久久中文久久久无码 | 久久久www成人免费毛片 | 在线观看免费人成视频 | 欧美性猛交xxxx富婆 | 国内丰满熟女出轨videos | 无码av岛国片在线播放 | 成人无码精品一区二区三区 | 精品无码一区二区三区爱欲 | 熟妇人妻无乱码中文字幕 | 少妇久久久久久人妻无码 | 亚洲午夜久久久影院 | 高清国产亚洲精品自在久久 | 国产内射老熟女aaaa | 国产av无码专区亚洲a∨毛片 | 国内精品久久久久久中文字幕 | 免费人成网站视频在线观看 | 精品国偷自产在线视频 | 无码人妻精品一区二区三区不卡 | 亚洲成a人片在线观看日本 | 欧美日本日韩 | 激情综合激情五月俺也去 | 成人欧美一区二区三区 | 久久精品人人做人人综合试看 | 久久99精品国产麻豆 | 成人无码视频在线观看网站 | 亚洲人成无码网www | 中文字幕无码乱人伦 | 少妇一晚三次一区二区三区 | 久久国产精品精品国产色婷婷 | 国产乱人偷精品人妻a片 | 国产午夜亚洲精品不卡 | 无码av最新清无码专区吞精 | 国产无遮挡又黄又爽又色 | 我要看www免费看插插视频 | 国产内射爽爽大片视频社区在线 | 少妇被粗大的猛进出69影院 | 国产无套内射久久久国产 | 成熟女人特级毛片www免费 | 亚洲热妇无码av在线播放 | 免费观看黄网站 | 装睡被陌生人摸出水好爽 | 色欲久久久天天天综合网精品 | 久久久久国色av免费观看性色 | 日本熟妇人妻xxxxx人hd | 毛片内射-百度 | 永久免费观看美女裸体的网站 | 成人亚洲精品久久久久 | 中文字幕 人妻熟女 | 日本熟妇人妻xxxxx人hd | 少妇的肉体aa片免费 | 日日噜噜噜噜夜夜爽亚洲精品 | 欧美熟妇另类久久久久久多毛 | 亚洲精品久久久久久久久久久 | 全黄性性激高免费视频 | 亚洲精品国产a久久久久久 | 最新国产麻豆aⅴ精品无码 | 国产激情一区二区三区 | 啦啦啦www在线观看免费视频 | 中文字幕久久久久人妻 | 无码乱肉视频免费大全合集 | av无码电影一区二区三区 | 人人妻人人澡人人爽欧美精品 | 亚洲国精产品一二二线 | √8天堂资源地址中文在线 | 欧美国产日韩亚洲中文 | 久久久精品456亚洲影院 | 亚洲aⅴ无码成人网站国产app | 青青草原综合久久大伊人精品 | 成年美女黄网站色大免费视频 | 婷婷丁香六月激情综合啪 | 亚洲爆乳大丰满无码专区 | 欧美 丝袜 自拍 制服 另类 | 2020久久超碰国产精品最新 | 久久国产36精品色熟妇 | 久久无码中文字幕免费影院蜜桃 | 国产真实伦对白全集 | 精品国产福利一区二区 | 亚洲精品成人福利网站 | 无码国产激情在线观看 | 伦伦影院午夜理论片 | 欧洲精品码一区二区三区免费看 | 国产精品久久久一区二区三区 | 大肉大捧一进一出视频出来呀 | 国产精品亚洲lv粉色 | 狂野欧美性猛交免费视频 | 午夜福利一区二区三区在线观看 | 成人女人看片免费视频放人 | 婷婷色婷婷开心五月四房播播 | 国产精品久久久久久无码 | 国产9 9在线 | 中文 | 妺妺窝人体色www婷婷 | 欧美 日韩 人妻 高清 中文 | 国产一精品一av一免费 | 丝袜美腿亚洲一区二区 | 日韩av无码一区二区三区不卡 | 岛国片人妻三上悠亚 | 狠狠色欧美亚洲狠狠色www | 国模大胆一区二区三区 | 无码国产色欲xxxxx视频 | 天堂一区人妻无码 | 玩弄人妻少妇500系列视频 | 免费无码午夜福利片69 | 色欲av亚洲一区无码少妇 | 成人动漫在线观看 | 久久久久成人精品免费播放动漫 | 国产偷国产偷精品高清尤物 | 初尝人妻少妇中文字幕 | 亚洲区欧美区综合区自拍区 | 最新国产麻豆aⅴ精品无码 | 少妇性荡欲午夜性开放视频剧场 | 亚洲狠狠婷婷综合久久 | 亚洲gv猛男gv无码男同 | 国产激情综合五月久久 | 国产精品怡红院永久免费 | 国产在线aaa片一区二区99 | 成人免费视频视频在线观看 免费 | 久久精品中文字幕大胸 | 欧美熟妇另类久久久久久多毛 | www一区二区www免费 | yw尤物av无码国产在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 国内精品人妻无码久久久影院蜜桃 | 99久久无码一区人妻 | 领导边摸边吃奶边做爽在线观看 | 日韩精品无码免费一区二区三区 | 色婷婷香蕉在线一区二区 | 免费观看的无遮挡av | 性欧美疯狂xxxxbbbb | 国产精品无码久久av | 久精品国产欧美亚洲色aⅴ大片 | 精品久久久久久人妻无码中文字幕 | 日韩av无码中文无码电影 | 日日鲁鲁鲁夜夜爽爽狠狠 | 乌克兰少妇xxxx做受 | 女人被爽到呻吟gif动态图视看 | 99精品国产综合久久久久五月天 | 国产午夜亚洲精品不卡 | 亚洲日韩乱码中文无码蜜桃臀网站 | 婷婷色婷婷开心五月四房播播 | 中文字幕色婷婷在线视频 | 99国产欧美久久久精品 | 午夜精品一区二区三区在线观看 | 国产精品成人av在线观看 | 免费看少妇作爱视频 | 亚洲人成无码网www | 国产成人人人97超碰超爽8 | 午夜免费福利小电影 | 国产熟女一区二区三区四区五区 | 国产人妻精品一区二区三区 | 综合激情五月综合激情五月激情1 | 亚洲天堂2017无码中文 | 亚洲人成影院在线无码按摩店 | 噜噜噜亚洲色成人网站 | 红桃av一区二区三区在线无码av | 欧美丰满熟妇xxxx性ppx人交 | 一二三四在线观看免费视频 | 精品一区二区三区无码免费视频 | 欧美人与禽猛交狂配 | 成熟妇人a片免费看网站 | 波多野42部无码喷潮在线 | 成年美女黄网站色大免费全看 | 在线成人www免费观看视频 | 亚洲人成影院在线观看 | 欧美日韩一区二区三区自拍 | 精品国产aⅴ无码一区二区 | 18禁止看的免费污网站 | 全球成人中文在线 | 狠狠cao日日穞夜夜穞av | 亚洲欧美日韩国产精品一区二区 | 久久人妻内射无码一区三区 | 无码人妻丰满熟妇区五十路百度 | 内射白嫩少妇超碰 | 四虎国产精品免费久久 | 丰满少妇熟乱xxxxx视频 | aⅴ亚洲 日韩 色 图网站 播放 | 内射白嫩少妇超碰 | 色婷婷综合中文久久一本 | 男人的天堂2018无码 | 亚洲日韩精品欧美一区二区 | 国产疯狂伦交大片 | 久久99精品久久久久久 | 高清国产亚洲精品自在久久 | 欧美黑人性暴力猛交喷水 | 久久久国产一区二区三区 | 欧美35页视频在线观看 | 色老头在线一区二区三区 | 国产在线aaa片一区二区99 | √天堂中文官网8在线 | 丰满人妻翻云覆雨呻吟视频 | aa片在线观看视频在线播放 | 久久精品一区二区三区四区 | 少妇人妻大乳在线视频 | 亚洲毛片av日韩av无码 | 国产成人一区二区三区在线观看 | 波多野结衣一区二区三区av免费 | 狂野欧美性猛交免费视频 | 午夜肉伦伦影院 | 亚洲日韩av一区二区三区四区 | 爱做久久久久久 | 亚洲欧美日韩国产精品一区二区 | 色一情一乱一伦一区二区三欧美 | 少妇被黑人到高潮喷出白浆 | 无码帝国www无码专区色综合 | 呦交小u女精品视频 | 午夜无码人妻av大片色欲 | 国产美女精品一区二区三区 | 色狠狠av一区二区三区 | 成人无码视频免费播放 | 亚洲精品国产精品乱码不卡 | 欧美自拍另类欧美综合图片区 | 欧美性生交活xxxxxdddd | 亚洲精品成人av在线 | 国精品人妻无码一区二区三区蜜柚 | 精品久久8x国产免费观看 | 久久精品中文字幕一区 | 人人妻人人澡人人爽欧美一区 | 免费人成在线观看网站 | 亚洲色无码一区二区三区 | 亚洲精品综合一区二区三区在线 | 亚洲国产精华液网站w | 国产99久久精品一区二区 | 综合人妻久久一区二区精品 | 国产9 9在线 | 中文 | 丝袜人妻一区二区三区 | 妺妺窝人体色www婷婷 | 波多野结衣av在线观看 | 女高中生第一次破苞av | 久激情内射婷内射蜜桃人妖 | 久久综合给合久久狠狠狠97色 | 日韩少妇内射免费播放 | 久久人人爽人人人人片 | 色欲av亚洲一区无码少妇 | 疯狂三人交性欧美 | 欧美人与牲动交xxxx | 成人无码影片精品久久久 | 红桃av一区二区三区在线无码av | 欧美黑人乱大交 | 亚洲精品午夜无码电影网 | 久久国产精品_国产精品 | 2020久久香蕉国产线看观看 | 综合人妻久久一区二区精品 | 国产成人久久精品流白浆 | 精品无人区无码乱码毛片国产 | 亚洲欧美综合区丁香五月小说 | 又粗又大又硬又长又爽 | 99riav国产精品视频 | 国产精品无套呻吟在线 | 丝袜美腿亚洲一区二区 | 高中生自慰www网站 | 无码国内精品人妻少妇 | 久久久精品欧美一区二区免费 | 人妻少妇精品久久 | 欧美肥老太牲交大战 | 亚洲色无码一区二区三区 | 无套内射视频囯产 | 久久99精品久久久久久动态图 | 国产精品无码mv在线观看 | 三上悠亚人妻中文字幕在线 | 婷婷五月综合缴情在线视频 | 男女爱爱好爽视频免费看 | 少妇无码av无码专区在线观看 | 午夜精品一区二区三区的区别 | 日日碰狠狠丁香久燥 | 在线欧美精品一区二区三区 | 欧美精品在线观看 | 无码国产色欲xxxxx视频 | 欧美喷潮久久久xxxxx | 国产莉萝无码av在线播放 | 岛国片人妻三上悠亚 | 欧美精品国产综合久久 | 久久综合狠狠综合久久综合88 | 亚洲自偷自偷在线制服 | 国产疯狂伦交大片 | 日韩精品无码一本二本三本色 | 国产极品视觉盛宴 | 亚洲综合另类小说色区 | 国产真实乱对白精彩久久 | 日韩亚洲欧美中文高清在线 | 国产午夜精品一区二区三区嫩草 | 丰满肥臀大屁股熟妇激情视频 | 国产无遮挡又黄又爽免费视频 | 少妇人妻大乳在线视频 | 国产手机在线αⅴ片无码观看 | 国产亚洲精品久久久久久久久动漫 | 人人澡人人透人人爽 | 国内精品久久久久久中文字幕 | 清纯唯美经典一区二区 | 欧美丰满熟妇xxxx性ppx人交 | 在线观看国产午夜福利片 | a国产一区二区免费入口 | 久久亚洲精品中文字幕无男同 | 国产乱子伦视频在线播放 | 欧美人与禽zoz0性伦交 | 精品 日韩 国产 欧美 视频 | 久久综合给久久狠狠97色 | a在线亚洲男人的天堂 | 国产99久久精品一区二区 | 欧美丰满熟妇xxxx性ppx人交 | 台湾无码一区二区 | 狠狠色欧美亚洲狠狠色www | 欧美 丝袜 自拍 制服 另类 | 中文字幕日产无线码一区 | 老熟女重囗味hdxx69 | 国产精品人妻一区二区三区四 | www成人国产高清内射 | 国产无套内射久久久国产 | 亚拍精品一区二区三区探花 | 男人的天堂av网站 | 免费观看又污又黄的网站 | 久久伊人色av天堂九九小黄鸭 | 亚洲成a人片在线观看日本 | 亚洲成a人片在线观看无码3d | 波多野结衣一区二区三区av免费 | 免费无码一区二区三区蜜桃大 | 西西人体www44rt大胆高清 | 亚洲成av人影院在线观看 | 亚洲 另类 在线 欧美 制服 | 久久国产精品萌白酱免费 | 午夜成人1000部免费视频 | 国产精品丝袜黑色高跟鞋 | 2020久久香蕉国产线看观看 | 久久人妻内射无码一区三区 | 亚洲aⅴ无码成人网站国产app | 西西人体www44rt大胆高清 | 亚洲国产精品无码一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 亚洲伊人久久精品影院 | 波多野结衣av在线观看 | 欧美老妇交乱视频在线观看 | 少妇的肉体aa片免费 | 亚洲最大成人网站 | 波多野结衣 黑人 | 西西人体www44rt大胆高清 | 亚洲欧美日韩综合久久久 | 无码福利日韩神码福利片 | 国产亚洲视频中文字幕97精品 | 国产午夜亚洲精品不卡下载 | 一个人看的视频www在线 | 人人妻人人藻人人爽欧美一区 | 天堂亚洲2017在线观看 | 亚洲人成网站在线播放942 | 日韩精品无码免费一区二区三区 | 日本一区二区更新不卡 | 99久久精品日本一区二区免费 | 中文字幕无码日韩专区 | 国产色xx群视频射精 | 欧美 丝袜 自拍 制服 另类 | 欧洲精品码一区二区三区免费看 | 精品久久久久久亚洲精品 | 欧美熟妇另类久久久久久多毛 | 天堂а√在线地址中文在线 | 大胆欧美熟妇xx | 精品无码国产一区二区三区av | 国产97色在线 | 免 | 日日摸夜夜摸狠狠摸婷婷 | 伦伦影院午夜理论片 | 国产精品资源一区二区 | 国产亚洲精品久久久ai换 | 国产国产精品人在线视 | 精品人人妻人人澡人人爽人人 | 亚洲综合无码一区二区三区 | 国产成人综合在线女婷五月99播放 | 国产亚洲视频中文字幕97精品 | 天堂在线观看www | 狠狠色欧美亚洲狠狠色www | 国产真人无遮挡作爱免费视频 | 国产精品99爱免费视频 | 精品国产一区二区三区四区在线看 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲乱码国产乱码精品精 | 国内少妇偷人精品视频免费 | 2020久久超碰国产精品最新 | 一本久久a久久精品vr综合 | 一本色道久久综合亚洲精品不卡 | 内射白嫩少妇超碰 | 日韩精品无码一本二本三本色 | 亚洲色大成网站www国产 | 欧洲美熟女乱又伦 | 乱人伦中文视频在线观看 | 理论片87福利理论电影 | 老司机亚洲精品影院无码 | 少妇无码一区二区二三区 | 久久伊人色av天堂九九小黄鸭 | 黑人大群体交免费视频 | 真人与拘做受免费视频一 | 黑人大群体交免费视频 | 久久精品国产亚洲精品 | 国产内射爽爽大片视频社区在线 | 久久精品女人的天堂av | 97精品人妻一区二区三区香蕉 | 久久午夜夜伦鲁鲁片无码免费 | 欧美怡红院免费全部视频 | a片免费视频在线观看 | 18禁黄网站男男禁片免费观看 | 999久久久国产精品消防器材 | 乌克兰少妇性做爰 | 东京一本一道一二三区 | 亚洲日韩av一区二区三区四区 | 亚洲码国产精品高潮在线 | 岛国片人妻三上悠亚 | 亚洲精品中文字幕久久久久 | 国产99久久精品一区二区 | 久久精品国产精品国产精品污 | 蜜臀av无码人妻精品 | 99精品无人区乱码1区2区3区 | 日本一卡2卡3卡四卡精品网站 | 又粗又大又硬又长又爽 | 久久精品国产99精品亚洲 | 男人的天堂av网站 | 狠狠色丁香久久婷婷综合五月 | 精品国产麻豆免费人成网站 | 亚洲人成网站色7799 | 国产亚洲人成a在线v网站 | 久久久久久九九精品久 | 67194成是人免费无码 | 欧美变态另类xxxx | √天堂资源地址中文在线 | 免费播放一区二区三区 | 免费无码一区二区三区蜜桃大 | 色一情一乱一伦一视频免费看 | 美女毛片一区二区三区四区 | 又大又紧又粉嫩18p少妇 | 国产卡一卡二卡三 | 日本护士xxxxhd少妇 | 乱人伦人妻中文字幕无码久久网 | 国产精品久久久久影院嫩草 | 国产精品福利视频导航 | 亚洲精品午夜国产va久久成人 | 窝窝午夜理论片影院 | 久久久中文字幕日本无吗 | 人人妻人人澡人人爽欧美精品 | 免费无码一区二区三区蜜桃大 | 久久国内精品自在自线 | 乱码av麻豆丝袜熟女系列 | 激情内射亚州一区二区三区爱妻 | 无码人妻av免费一区二区三区 | 亚洲熟妇色xxxxx亚洲 | 国语自产偷拍精品视频偷 | 天天躁夜夜躁狠狠是什么心态 | 日韩无套无码精品 | 波多野结衣av一区二区全免费观看 | 麻豆成人精品国产免费 | 青青青手机频在线观看 | 激情五月综合色婷婷一区二区 | 在线精品国产一区二区三区 | 一本久道久久综合婷婷五月 | 亚洲熟女一区二区三区 | 国产成人亚洲综合无码 | 成人影院yy111111在线观看 | 免费视频欧美无人区码 | 国产成人无码区免费内射一片色欲 | 欧美兽交xxxx×视频 | 亚洲精品一区国产 | 精品国产一区二区三区四区 | 无码纯肉视频在线观看 | 少妇性俱乐部纵欲狂欢电影 | 久久久久久亚洲精品a片成人 | 一本精品99久久精品77 | 精品成人av一区二区三区 | 未满成年国产在线观看 | 久久久久免费精品国产 | 欧美老妇与禽交 | 成人免费视频视频在线观看 免费 | 97精品国产97久久久久久免费 | 亚洲精品一区二区三区四区五区 | 亚洲精品国产品国语在线观看 | 狂野欧美性猛xxxx乱大交 | 正在播放东北夫妻内射 | 两性色午夜视频免费播放 | 亚洲国产精品美女久久久久 | 国产精品va在线观看无码 | 精品一二三区久久aaa片 | 亚洲精品www久久久 | 蜜臀aⅴ国产精品久久久国产老师 | 性做久久久久久久免费看 | 无码国产激情在线观看 | 极品嫩模高潮叫床 | 丰满少妇弄高潮了www | 少妇高潮喷潮久久久影院 | 久久久精品成人免费观看 | 欧美兽交xxxx×视频 | 少妇厨房愉情理9仑片视频 | 免费无码的av片在线观看 | 亚洲精品一区二区三区在线观看 | 亚洲综合色区中文字幕 | 亚洲精品午夜无码电影网 | 精品国产青草久久久久福利 | 免费观看又污又黄的网站 | 精品人妻中文字幕有码在线 | 欧美大屁股xxxxhd黑色 | 日本在线高清不卡免费播放 | 国产人妖乱国产精品人妖 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲一区二区三区 | 国内丰满熟女出轨videos | 久久精品国产一区二区三区肥胖 | 无码国产激情在线观看 | 国产成人精品优优av | 日本大乳高潮视频在线观看 | 国产精品视频免费播放 | 少妇久久久久久人妻无码 | 东京一本一道一二三区 | 国产成人精品一区二区在线小狼 | 一本大道久久东京热无码av | 亚洲色欲久久久综合网东京热 | 天堂久久天堂av色综合 | 久久久久av无码免费网 | 亚洲精品国偷拍自产在线观看蜜桃 | 麻豆av传媒蜜桃天美传媒 | 强辱丰满人妻hd中文字幕 | 日日摸日日碰夜夜爽av | 国产无遮挡又黄又爽免费视频 | 亚洲中文无码av永久不收费 | 在线精品国产一区二区三区 | 精品人妻av区 | 免费播放一区二区三区 | 蜜桃视频韩日免费播放 | 久9re热视频这里只有精品 | 97久久精品无码一区二区 | 亚洲精品久久久久久久久久久 | 成年美女黄网站色大免费全看 | 久久精品女人的天堂av | 男女爱爱好爽视频免费看 | 思思久久99热只有频精品66 | 999久久久国产精品消防器材 | 亚拍精品一区二区三区探花 | 亚洲成av人片天堂网无码】 | 国产在线aaa片一区二区99 | 亚洲啪av永久无码精品放毛片 | 国产激情无码一区二区 | 国产午夜无码精品免费看 | 国产精品毛片一区二区 | 无码精品人妻一区二区三区av | 午夜性刺激在线视频免费 | 久久久国产一区二区三区 | 欧美喷潮久久久xxxxx | 中文无码成人免费视频在线观看 | 亚洲人亚洲人成电影网站色 | 精品久久久久久人妻无码中文字幕 | 四虎4hu永久免费 | 东京热一精品无码av | 亚洲色成人中文字幕网站 | 国产在线精品一区二区三区直播 | 日日碰狠狠丁香久燥 | 风流少妇按摩来高潮 | 亚洲自偷精品视频自拍 | 无码成人精品区在线观看 | 国产真实伦对白全集 | 国产精品内射视频免费 | 5858s亚洲色大成网站www | 亚洲人成人无码网www国产 | 午夜福利不卡在线视频 | 欧美性生交xxxxx久久久 | 亚洲熟妇色xxxxx欧美老妇 | 特黄特色大片免费播放器图片 | 人人妻人人藻人人爽欧美一区 | 性生交大片免费看女人按摩摩 | 精品人妻中文字幕有码在线 | 夜先锋av资源网站 | 青青青手机频在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲精品一区二区三区在线 | 欧美国产日韩亚洲中文 | 中文久久乱码一区二区 | 丝袜 中出 制服 人妻 美腿 | 亚洲精品无码人妻无码 | 强辱丰满人妻hd中文字幕 | 国产精品-区区久久久狼 | 综合激情五月综合激情五月激情1 | 欧美日韩在线亚洲综合国产人 | 国产熟妇另类久久久久 | 亚洲综合另类小说色区 | 久久99国产综合精品 | 性啪啪chinese东北女人 | 成人三级无码视频在线观看 | 粉嫩少妇内射浓精videos | 奇米影视7777久久精品人人爽 | 欧美熟妇另类久久久久久多毛 | 一本大道伊人av久久综合 | 亚洲日韩av一区二区三区中文 | 国产香蕉97碰碰久久人人 | 一区二区三区乱码在线 | 欧洲 | 男人扒开女人内裤强吻桶进去 | 国产精品鲁鲁鲁 | 午夜福利一区二区三区在线观看 | 无码精品国产va在线观看dvd | 国产精品久久久一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 99久久人妻精品免费二区 | 久久精品中文字幕一区 | 国产香蕉尹人综合在线观看 | 欧美性猛交内射兽交老熟妇 | 黑人巨大精品欧美黑寡妇 | 5858s亚洲色大成网站www | 风流少妇按摩来高潮 | 亚洲国产欧美日韩精品一区二区三区 | 人妻天天爽夜夜爽一区二区 | 中文久久乱码一区二区 | 国产肉丝袜在线观看 | 久久久久久久人妻无码中文字幕爆 | 男女爱爱好爽视频免费看 | 成人无码精品一区二区三区 | 纯爱无遮挡h肉动漫在线播放 | 亚洲精品中文字幕久久久久 | 黑人大群体交免费视频 | 国内少妇偷人精品视频免费 | 最新国产麻豆aⅴ精品无码 | 欧美老熟妇乱xxxxx | 亚洲色成人中文字幕网站 | 亚洲色欲久久久综合网东京热 | 在线观看国产一区二区三区 | 亚洲中文无码av永久不收费 | 精品一区二区三区无码免费视频 | 国产成人精品视频ⅴa片软件竹菊 | 丰满人妻被黑人猛烈进入 | 中文字幕乱妇无码av在线 | 88国产精品欧美一区二区三区 | 亚洲区小说区激情区图片区 | 人妻尝试又大又粗久久 | 国产亚洲精品精品国产亚洲综合 | 少妇性l交大片欧洲热妇乱xxx | 国产午夜手机精彩视频 | 图片区 小说区 区 亚洲五月 | 久久久久久久人妻无码中文字幕爆 | 东北女人啪啪对白 | 女人色极品影院 | 欧美性生交活xxxxxdddd | 亚洲乱码日产精品bd | 久久亚洲国产成人精品性色 | 精品人妻人人做人人爽夜夜爽 | 自拍偷自拍亚洲精品被多人伦好爽 | 欧美日韩一区二区综合 | 少妇人妻av毛片在线看 | 精品乱子伦一区二区三区 | 国产深夜福利视频在线 | 77777熟女视频在线观看 а天堂中文在线官网 | 九九久久精品国产免费看小说 | 国产肉丝袜在线观看 | 少女韩国电视剧在线观看完整 | 亚洲国产一区二区三区在线观看 | 精品国产aⅴ无码一区二区 | 国产人妻精品一区二区三区不卡 | 国产精品毛多多水多 | 色欲久久久天天天综合网精品 | 成人无码精品1区2区3区免费看 | av人摸人人人澡人人超碰下载 | 亚洲色成人中文字幕网站 | 欧美黑人性暴力猛交喷水 | 欧洲美熟女乱又伦 | 亚洲中文字幕乱码av波多ji | 国产精品99爱免费视频 | 丰满少妇熟乱xxxxx视频 | 男人扒开女人内裤强吻桶进去 | 久久婷婷五月综合色国产香蕉 | 人妻少妇被猛烈进入中文字幕 | 又粗又大又硬又长又爽 | 福利一区二区三区视频在线观看 | 国产午夜亚洲精品不卡 | 亚洲色www成人永久网址 | 兔费看少妇性l交大片免费 | 免费人成在线视频无码 | 国内丰满熟女出轨videos | ass日本丰满熟妇pics | 成人性做爰aaa片免费看 | 一个人看的视频www在线 | 日日碰狠狠丁香久燥 | 日本欧美一区二区三区乱码 | 鲁大师影院在线观看 | 色综合视频一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 人妻无码久久精品人妻 | 香蕉久久久久久av成人 | 亚洲 激情 小说 另类 欧美 | 欧美老妇交乱视频在线观看 | 亚洲精品综合五月久久小说 | 亚洲熟妇色xxxxx亚洲 | 在线天堂新版最新版在线8 | 国产精品人人爽人人做我的可爱 | 女人被男人爽到呻吟的视频 | 窝窝午夜理论片影院 | 婷婷六月久久综合丁香 | 男人和女人高潮免费网站 | 亚洲精品午夜国产va久久成人 | 黑人巨大精品欧美黑寡妇 | 丰满少妇人妻久久久久久 | 欧美日本免费一区二区三区 | 激情爆乳一区二区三区 | 国产绳艺sm调教室论坛 | 亚洲gv猛男gv无码男同 | 强奷人妻日本中文字幕 | 日韩人妻系列无码专区 | 亚洲色在线无码国产精品不卡 | 沈阳熟女露脸对白视频 | 久久国产精品精品国产色婷婷 | 亚洲自偷自偷在线制服 | 特大黑人娇小亚洲女 | 免费观看激色视频网站 | 亚洲男人av香蕉爽爽爽爽 | 精品无码成人片一区二区98 | 国产成人精品优优av | 久久五月精品中文字幕 | 97人妻精品一区二区三区 | 久久精品中文闷骚内射 | 成熟人妻av无码专区 | 久久国产劲爆∧v内射 | 麻花豆传媒剧国产免费mv在线 | 中文字幕 亚洲精品 第1页 | 国精品人妻无码一区二区三区蜜柚 | 性色欲情网站iwww九文堂 | 亚洲自偷自偷在线制服 | 精品国产aⅴ无码一区二区 | 97久久超碰中文字幕 | 色五月丁香五月综合五月 | 在线亚洲高清揄拍自拍一品区 | 免费无码午夜福利片69 | 亚洲熟妇色xxxxx欧美老妇y | 狠狠色欧美亚洲狠狠色www | 午夜精品一区二区三区在线观看 | 中文字幕精品av一区二区五区 | 人妻尝试又大又粗久久 | 妺妺窝人体色www在线小说 | 红桃av一区二区三区在线无码av | 国产国产精品人在线视 | 久久99精品国产麻豆蜜芽 | 国产一区二区三区日韩精品 | 国产绳艺sm调教室论坛 | 我要看www免费看插插视频 | 无码人妻精品一区二区三区下载 | 狠狠噜狠狠狠狠丁香五月 | 伦伦影院午夜理论片 | 亚洲自偷自拍另类第1页 | 奇米影视888欧美在线观看 | 玩弄少妇高潮ⅹxxxyw | 精品国产精品久久一区免费式 | 久久国产精品偷任你爽任你 | 兔费看少妇性l交大片免费 | 国产人妻大战黑人第1集 | 九九在线中文字幕无码 | 76少妇精品导航 | 国产精品久久久久久亚洲毛片 | 夜夜躁日日躁狠狠久久av | 曰韩少妇内射免费播放 | 九月婷婷人人澡人人添人人爽 | 影音先锋中文字幕无码 | 国内精品人妻无码久久久影院蜜桃 | 水蜜桃av无码 | 久久久久成人精品免费播放动漫 | 亚洲高清偷拍一区二区三区 | 亚洲gv猛男gv无码男同 | 少妇无码吹潮 | 成人亚洲精品久久久久软件 | 亚洲综合伊人久久大杳蕉 | 亚洲热妇无码av在线播放 | 亚洲色在线无码国产精品不卡 | 正在播放老肥熟妇露脸 | 国内丰满熟女出轨videos | 久久久久免费看成人影片 | 无码人妻久久一区二区三区不卡 | 中文字幕无码av激情不卡 | 亚洲第一网站男人都懂 | 国产午夜手机精彩视频 | 色一情一乱一伦 | 国产精品无套呻吟在线 | 性色欲网站人妻丰满中文久久不卡 | 天天做天天爱天天爽综合网 | 乱码av麻豆丝袜熟女系列 | 亚洲人交乣女bbw | 亚洲中文字幕av在天堂 | 毛片内射-百度 | 一本大道久久东京热无码av | 成在人线av无码免观看麻豆 | 午夜精品久久久久久久 | 日韩人妻无码一区二区三区久久99 | 狠狠cao日日穞夜夜穞av | 亚洲日韩av一区二区三区中文 | 色综合久久久无码中文字幕 | 亚洲熟女一区二区三区 | 男人扒开女人内裤强吻桶进去 | 成人性做爰aaa片免费看 | 日日躁夜夜躁狠狠躁 | 人人妻人人澡人人爽人人精品浪潮 | 高中生自慰www网站 | 狠狠亚洲超碰狼人久久 | 在线播放无码字幕亚洲 | 国内精品人妻无码久久久影院 | 99精品无人区乱码1区2区3区 | 在线a亚洲视频播放在线观看 | 强辱丰满人妻hd中文字幕 | 久久综合狠狠综合久久综合88 | 国产成人无码专区 | 久久综合九色综合97网 | 内射爽无广熟女亚洲 | 欧美日本日韩 | 四十如虎的丰满熟妇啪啪 | 中文字幕乱码人妻无码久久 | 成人无码精品一区二区三区 | av无码不卡在线观看免费 | 无码国产色欲xxxxx视频 | 久久国产自偷自偷免费一区调 | 国产亚洲人成在线播放 | 国产97色在线 | 免 | 午夜丰满少妇性开放视频 | 成人动漫在线观看 | 动漫av网站免费观看 | 亚洲精品国产第一综合99久久 | 国产后入清纯学生妹 | 97夜夜澡人人双人人人喊 | 麻花豆传媒剧国产免费mv在线 | 天下第一社区视频www日本 | 免费乱码人妻系列无码专区 | 亚洲日韩av一区二区三区中文 | 精品乱子伦一区二区三区 | 98国产精品综合一区二区三区 | 88国产精品欧美一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 2020久久香蕉国产线看观看 | 日韩av无码一区二区三区不卡 | а√天堂www在线天堂小说 | 无遮无挡爽爽免费视频 | 成熟人妻av无码专区 | 少妇无码吹潮 | 国产激情艳情在线看视频 | 成人性做爰aaa片免费看 | 免费观看又污又黄的网站 | 国产内射爽爽大片视频社区在线 | 欧美日本精品一区二区三区 | 国产乱码精品一品二品 | 人妻少妇被猛烈进入中文字幕 | 精品无码一区二区三区的天堂 | 麻豆人妻少妇精品无码专区 | 激情综合激情五月俺也去 | 国产另类ts人妖一区二区 | 美女极度色诱视频国产 | 色欲av亚洲一区无码少妇 | 久久国产精品_国产精品 | 亚洲性无码av中文字幕 | 亚洲欧美色中文字幕在线 | 澳门永久av免费网站 | 丰满少妇熟乱xxxxx视频 | 巨爆乳无码视频在线观看 | 亚洲国精产品一二二线 | 国产精品va在线播放 | 伊人久久大香线蕉av一区二区 | 亚洲精品美女久久久久久久 | aⅴ亚洲 日韩 色 图网站 播放 | 色婷婷香蕉在线一区二区 | 国产精品美女久久久网av | 麻豆md0077饥渴少妇 | 国产亚洲精品久久久久久国模美 | 国产深夜福利视频在线 | 无码乱肉视频免费大全合集 | 亚洲精品美女久久久久久久 | 狠狠色欧美亚洲狠狠色www | 婷婷五月综合激情中文字幕 | 丰满肥臀大屁股熟妇激情视频 | 成人一区二区免费视频 | 国产精品久久久av久久久 | 久久久婷婷五月亚洲97号色 | 久久无码中文字幕免费影院蜜桃 | 国产手机在线αⅴ片无码观看 | 日本xxxx色视频在线观看免费 | 国产国语老龄妇女a片 | 色综合久久中文娱乐网 | 欧美 丝袜 自拍 制服 另类 | а√资源新版在线天堂 | 国色天香社区在线视频 | 亚洲中文字幕无码一久久区 | 精品成在人线av无码免费看 | 一本大道久久东京热无码av | 久久综合九色综合欧美狠狠 | 国产亲子乱弄免费视频 | 中文字幕无码av波多野吉衣 | 妺妺窝人体色www在线小说 | 成人免费视频一区二区 | 女人被男人爽到呻吟的视频 | 欧洲欧美人成视频在线 | 午夜福利不卡在线视频 | 久久99精品国产.久久久久 | 国产精品久久国产精品99 | 人人澡人人透人人爽 | 亚洲一区二区观看播放 | 亚洲精品久久久久久一区二区 | 性色av无码免费一区二区三区 | a国产一区二区免费入口 | 在线精品国产一区二区三区 | 欧美亚洲日韩国产人成在线播放 | 欧美日韩亚洲国产精品 | 久久综合久久自在自线精品自 | 天堂亚洲免费视频 | 妺妺窝人体色www在线小说 | 久久久久久九九精品久 | 国产激情精品一区二区三区 | 99在线 | 亚洲 | 亚洲欧美日韩成人高清在线一区 | 欧美日韩一区二区综合 | 麻豆果冻传媒2021精品传媒一区下载 | 国产午夜福利100集发布 | 亚洲色www成人永久网址 | 无码免费一区二区三区 | 日本精品久久久久中文字幕 | 亚洲精品中文字幕乱码 | 国产麻豆精品一区二区三区v视界 | 国产香蕉97碰碰久久人人 | 亚洲 欧美 激情 小说 另类 | 日韩精品无码免费一区二区三区 | 久激情内射婷内射蜜桃人妖 | 性欧美熟妇videofreesex | 色综合久久久无码中文字幕 | 大胆欧美熟妇xx | 亚洲色欲色欲欲www在线 | 亚洲a无码综合a国产av中文 | 亚洲日本va午夜在线电影 | 国产97人人超碰caoprom | 曰本女人与公拘交酡免费视频 | 牲欲强的熟妇农村老妇女 | 国产性生交xxxxx无码 | 乱人伦人妻中文字幕无码久久网 | 亚洲熟妇自偷自拍另类 | 女人和拘做爰正片视频 | 欧美xxxx黑人又粗又长 | 丰满少妇女裸体bbw | 国精产品一品二品国精品69xx | 国产亚洲精品久久久闺蜜 | 国产明星裸体无码xxxx视频 | 亚洲高清偷拍一区二区三区 | 黑人玩弄人妻中文在线 | 国产在线精品一区二区三区直播 | 天天摸天天碰天天添 | 任你躁在线精品免费 | 无码国产乱人伦偷精品视频 | 领导边摸边吃奶边做爽在线观看 | 国产综合色产在线精品 | 亚洲色偷偷男人的天堂 | 久久精品国产亚洲精品 | 免费无码午夜福利片69 | 日本丰满护士爆乳xxxx | 亚洲一区二区三区香蕉 | 99久久精品国产一区二区蜜芽 | 欧美人与禽zoz0性伦交 | 久久久久亚洲精品中文字幕 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲小说春色综合另类 | 久久久久99精品国产片 | 亚洲男人av天堂午夜在 | 奇米影视888欧美在线观看 | 欧洲欧美人成视频在线 | 帮老师解开蕾丝奶罩吸乳网站 | 色婷婷综合中文久久一本 | 国产高清av在线播放 | 人妻互换免费中文字幕 | 久久久久久亚洲精品a片成人 | 久久精品国产日本波多野结衣 | 亚洲欧美色中文字幕在线 | 娇妻被黑人粗大高潮白浆 | 国产午夜亚洲精品不卡 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 乱人伦人妻中文字幕无码久久网 | 又大又硬又爽免费视频 | 任你躁在线精品免费 | 亚洲一区二区三区四区 | 亚洲国产高清在线观看视频 | 亚洲日韩精品欧美一区二区 | 天天av天天av天天透 | 我要看www免费看插插视频 | 鲁大师影院在线观看 | 国产成人人人97超碰超爽8 | 在线 国产 欧美 亚洲 天堂 | av无码不卡在线观看免费 | 色婷婷综合激情综在线播放 | 国产成人人人97超碰超爽8 | 国产午夜福利100集发布 | 亚洲欧洲无卡二区视頻 | 日本乱人伦片中文三区 | 无码人妻精品一区二区三区不卡 | 色噜噜亚洲男人的天堂 | 久久国产精品_国产精品 | 天海翼激烈高潮到腰振不止 | 天天综合网天天综合色 | 成人免费视频视频在线观看 免费 | 性做久久久久久久免费看 | 强伦人妻一区二区三区视频18 | 久久天天躁夜夜躁狠狠 | 女高中生第一次破苞av | 3d动漫精品啪啪一区二区中 | 99精品视频在线观看免费 | www成人国产高清内射 | 国产精品久久久久影院嫩草 | 日日麻批免费40分钟无码 | v一区无码内射国产 | 久久精品国产一区二区三区肥胖 | 丰满人妻被黑人猛烈进入 | 沈阳熟女露脸对白视频 | 国产乱子伦视频在线播放 | 亚洲成av人综合在线观看 | 国精产品一区二区三区 | 精品水蜜桃久久久久久久 | 国产精品人人爽人人做我的可爱 | 亚洲成a人片在线观看无码3d | 国产午夜精品一区二区三区嫩草 | 特黄特色大片免费播放器图片 | 成人aaa片一区国产精品 | 黄网在线观看免费网站 | 少妇人妻偷人精品无码视频 | 久久天天躁夜夜躁狠狠 | 色五月五月丁香亚洲综合网 | 人人妻人人澡人人爽人人精品浪潮 | 欧美黑人巨大xxxxx | 成人试看120秒体验区 | 亚洲另类伦春色综合小说 | 少妇高潮喷潮久久久影院 | 在线观看国产一区二区三区 | 午夜福利一区二区三区在线观看 | 给我免费的视频在线观看 | 粗大的内捧猛烈进出视频 | 久久综合激激的五月天 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产亚洲精品久久久久久 | 妺妺窝人体色www婷婷 | 在线观看欧美一区二区三区 | 欧美国产亚洲日韩在线二区 | 一本久道久久综合狠狠爱 | 巨爆乳无码视频在线观看 | 久久久久久亚洲精品a片成人 | 中文亚洲成a人片在线观看 | 亚洲s码欧洲m码国产av | 亚洲欧美日韩综合久久久 | 国产精品爱久久久久久久 | 国产精品无码mv在线观看 | 色综合久久久无码中文字幕 | 国产人妖乱国产精品人妖 | 欧美日韩在线亚洲综合国产人 | 中文字幕无码av激情不卡 | 四十如虎的丰满熟妇啪啪 | 成年美女黄网站色大免费全看 | 亚洲va欧美va天堂v国产综合 | 无码人妻丰满熟妇区五十路百度 | 日韩少妇内射免费播放 | 国产亚洲精品久久久久久国模美 | 无码免费一区二区三区 | 久久99精品久久久久婷婷 | 亚洲成av人片在线观看无码不卡 | 无码国内精品人妻少妇 | 狠狠色噜噜狠狠狠狠7777米奇 | 久久久久久av无码免费看大片 | 熟妇女人妻丰满少妇中文字幕 | www国产精品内射老师 | 装睡被陌生人摸出水好爽 | 日韩精品成人一区二区三区 | 亚洲精品一区二区三区在线 | 人人妻人人澡人人爽欧美一区九九 | 色综合天天综合狠狠爱 | 免费人成在线观看网站 | 久久综合给合久久狠狠狠97色 | 男人和女人高潮免费网站 | 国内精品久久久久久中文字幕 | 国内老熟妇对白xxxxhd | 76少妇精品导航 | 久久人人爽人人爽人人片ⅴ | 中文字幕无码免费久久9一区9 | 欧美刺激性大交 | 欧美35页视频在线观看 | 日欧一片内射va在线影院 | 乱人伦中文视频在线观看 | 日本乱人伦片中文三区 | 色情久久久av熟女人妻网站 | 亚洲成a人片在线观看日本 | 亚洲无人区午夜福利码高清完整版 | 亚洲春色在线视频 | 国产午夜亚洲精品不卡 | 熟女俱乐部五十路六十路av | 国产xxx69麻豆国语对白 | 自拍偷自拍亚洲精品被多人伦好爽 | 最近的中文字幕在线看视频 | 少妇激情av一区二区 | 亚洲精品久久久久久一区二区 | 国产黑色丝袜在线播放 | 狠狠色欧美亚洲狠狠色www | 国产激情无码一区二区app | 亚洲国产精品成人久久蜜臀 | 国产激情精品一区二区三区 | 色欲综合久久中文字幕网 | 天堂无码人妻精品一区二区三区 | 国产成人无码av一区二区 | 午夜丰满少妇性开放视频 | 国产免费久久精品国产传媒 | 国产一精品一av一免费 | 黑人大群体交免费视频 | 亚洲爆乳精品无码一区二区三区 | 色 综合 欧美 亚洲 国产 | 精品夜夜澡人妻无码av蜜桃 | 亚洲色在线无码国产精品不卡 | 国产午夜无码视频在线观看 | 欧美国产亚洲日韩在线二区 | 高清国产亚洲精品自在久久 | 国产精品亚洲五月天高清 | 一本色道久久综合狠狠躁 | 久久国产自偷自偷免费一区调 | 国产成人av免费观看 | 日本一区二区三区免费播放 | 高清无码午夜福利视频 | 欧美乱妇无乱码大黄a片 | 国产小呦泬泬99精品 | 三级4级全黄60分钟 | 奇米影视7777久久精品 | 1000部啪啪未满十八勿入下载 | 欧美一区二区三区视频在线观看 | 精品国产青草久久久久福利 | 老熟妇仑乱视频一区二区 | 欧美成人高清在线播放 | 牲欲强的熟妇农村老妇女 | 国产偷国产偷精品高清尤物 | 亚洲自偷自偷在线制服 | 樱花草在线播放免费中文 | 97久久超碰中文字幕 | 欧美兽交xxxx×视频 | 日韩精品一区二区av在线 | 台湾无码一区二区 | 欧美日韩在线亚洲综合国产人 | 99国产欧美久久久精品 | 男人扒开女人内裤强吻桶进去 | 国产精品二区一区二区aⅴ污介绍 | 粗大的内捧猛烈进出视频 | 亚洲精品一区三区三区在线观看 | 性生交大片免费看l | 亚洲乱亚洲乱妇50p | 老司机亚洲精品影院无码 | 内射后入在线观看一区 | 精品少妇爆乳无码av无码专区 | 国产电影无码午夜在线播放 | 亚洲成熟女人毛毛耸耸多 | 97人妻精品一区二区三区 | 精品国产一区av天美传媒 | 国产女主播喷水视频在线观看 | 国产肉丝袜在线观看 | 国产亚av手机在线观看 | 成人免费视频视频在线观看 免费 | 亚洲中文字幕在线观看 | 国产成人无码专区 | 秋霞特色aa大片 | 亚洲精品一区三区三区在线观看 | 欧美日韩视频无码一区二区三 | 亚洲の无码国产の无码影院 | 国产亚洲精品久久久ai换 | 亚洲精品无码人妻无码 | 欧美日韩亚洲国产精品 | 亚洲无人区午夜福利码高清完整版 | 国精产品一区二区三区 | 国产99久久精品一区二区 | 无码av中文字幕免费放 | 东京无码熟妇人妻av在线网址 | 午夜精品一区二区三区的区别 | 亚洲综合伊人久久大杳蕉 | 国产69精品久久久久app下载 | 国产亚洲人成a在线v网站 | 日韩成人一区二区三区在线观看 | 中文字幕无码人妻少妇免费 | 欧美xxxxx精品 | 日日天干夜夜狠狠爱 | 爽爽影院免费观看 | 97精品人妻一区二区三区香蕉 | 亚洲国产午夜精品理论片 | 少妇厨房愉情理9仑片视频 | 少妇性俱乐部纵欲狂欢电影 | 日韩欧美群交p片內射中文 | √天堂资源地址中文在线 | 88国产精品欧美一区二区三区 | 综合激情五月综合激情五月激情1 | 国产精品久久福利网站 | www国产精品内射老师 | 国产精品久久福利网站 | 欧美三级不卡在线观看 | 丰满少妇人妻久久久久久 | 夜先锋av资源网站 | 亚洲精品午夜无码电影网 | 精品久久久中文字幕人妻 | 精品少妇爆乳无码av无码专区 | 最近的中文字幕在线看视频 | 乱人伦人妻中文字幕无码久久网 | 波多野结衣高清一区二区三区 | 久久亚洲精品中文字幕无男同 | 欧美日韩一区二区免费视频 | 东京无码熟妇人妻av在线网址 | 欧美兽交xxxx×视频 | 无码国产激情在线观看 | 夜精品a片一区二区三区无码白浆 | 精品久久久久久亚洲精品 | 丝袜美腿亚洲一区二区 | 人妻夜夜爽天天爽三区 | 国产办公室秘书无码精品99 | 国产精品怡红院永久免费 | 老子影院午夜伦不卡 | 亚洲日韩一区二区三区 | 国产后入清纯学生妹 | 欧美老妇交乱视频在线观看 | 国产av剧情md精品麻豆 | 中文字幕av日韩精品一区二区 | 51国偷自产一区二区三区 | 国产片av国语在线观看 | 久久久久99精品成人片 | 男人的天堂2018无码 | 未满小14洗澡无码视频网站 | 又大又黄又粗又爽的免费视频 | av人摸人人人澡人人超碰下载 | 亚洲国产精品无码一区二区三区 | 国产成人av免费观看 | av香港经典三级级 在线 | 日日摸天天摸爽爽狠狠97 | 久久精品99久久香蕉国产色戒 | 日本一卡二卡不卡视频查询 | 又大又黄又粗又爽的免费视频 | 内射欧美老妇wbb | 暴力强奷在线播放无码 | 国产精品毛多多水多 | 少妇厨房愉情理9仑片视频 | 少妇被黑人到高潮喷出白浆 | 日日天日日夜日日摸 | 亚洲中文字幕在线无码一区二区 | 日韩无套无码精品 | 欧美老人巨大xxxx做受 | 欧美精品一区二区精品久久 | 精品国偷自产在线视频 | 国产精品久久福利网站 | 国产又爽又黄又刺激的视频 | 久久亚洲精品中文字幕无男同 | 国产一精品一av一免费 | 98国产精品综合一区二区三区 | 国产成人无码午夜视频在线观看 | 真人与拘做受免费视频 | 久久99热只有频精品8 | 无码任你躁久久久久久久 | 高中生自慰www网站 | 久久婷婷五月综合色国产香蕉 | 97资源共享在线视频 | 亚拍精品一区二区三区探花 | 亚洲狠狠色丁香婷婷综合 | 国产农村乱对白刺激视频 | 久久精品国产99精品亚洲 | 午夜精品久久久久久久久 | 午夜无码人妻av大片色欲 | 精品国产精品久久一区免费式 | 精品久久综合1区2区3区激情 | 在线 国产 欧美 亚洲 天堂 | 中文字幕乱码人妻二区三区 | 久久午夜无码鲁丝片午夜精品 | 国产乱人伦偷精品视频 | 最近免费中文字幕中文高清百度 | 日韩欧美成人免费观看 | 国产特级毛片aaaaaa高潮流水 | 国产精品99久久精品爆乳 | 久久久久久国产精品无码下载 | 亚洲第一网站男人都懂 | 亚洲欧洲日本综合aⅴ在线 | 亚洲精品国产a久久久久久 | 水蜜桃色314在线观看 | 亚洲欧洲日本无在线码 | 日韩 欧美 动漫 国产 制服 | 色狠狠av一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 亚洲自偷自拍另类第1页 | 亚洲精品国偷拍自产在线麻豆 | 亚洲自偷自偷在线制服 | 人妻aⅴ无码一区二区三区 | 国产深夜福利视频在线 | 中文字幕人成乱码熟女app | 国产后入清纯学生妹 | 亚洲七七久久桃花影院 | 成熟女人特级毛片www免费 | 成人免费视频在线观看 | 久久精品无码一区二区三区 | 自拍偷自拍亚洲精品被多人伦好爽 | 人妻少妇精品视频专区 | 欧美阿v高清资源不卡在线播放 | 久久国产36精品色熟妇 | 蜜桃视频韩日免费播放 | 欧美阿v高清资源不卡在线播放 | 无码吃奶揉捏奶头高潮视频 | 乱人伦人妻中文字幕无码久久网 | 67194成是人免费无码 | 亚洲大尺度无码无码专区 | 亚洲啪av永久无码精品放毛片 | 免费乱码人妻系列无码专区 | 欧美三级不卡在线观看 | 荫蒂添的好舒服视频囗交 | 久久久无码中文字幕久... | 欧美日韩一区二区综合 | 少妇性l交大片欧洲热妇乱xxx | 99久久精品午夜一区二区 | 国产人妻精品午夜福利免费 | 国产人妻大战黑人第1集 | 男女作爱免费网站 | 免费人成在线视频无码 | 亚洲色在线无码国产精品不卡 | 国产在线精品一区二区高清不卡 | 国产熟女一区二区三区四区五区 | 综合网日日天干夜夜久久 | 亚洲精品国产精品乱码不卡 | 亚洲gv猛男gv无码男同 | 女人被爽到呻吟gif动态图视看 | 国产sm调教视频在线观看 | 国产精品爱久久久久久久 | 国产免费久久精品国产传媒 | 少妇性l交大片欧洲热妇乱xxx | 欧美熟妇另类久久久久久不卡 | 搡女人真爽免费视频大全 | 亚洲成在人网站无码天堂 | 97久久国产亚洲精品超碰热 | 成年美女黄网站色大免费视频 | 亚洲欧美国产精品久久 | 欧美日韩人成综合在线播放 | 国产内射老熟女aaaa | 国产人成高清在线视频99最全资源 | 亚洲精品国偷拍自产在线麻豆 | 亚洲色大成网站www国产 | 无码午夜成人1000部免费视频 | 成 人 网 站国产免费观看 | 午夜精品久久久久久久 | 亚洲一区二区三区国产精华液 | 蜜桃臀无码内射一区二区三区 | 婷婷丁香五月天综合东京热 | 黑森林福利视频导航 | 人妻中文无码久热丝袜 | 国产黑色丝袜在线播放 | 欧美人与善在线com | 国产口爆吞精在线视频 | 精品乱码久久久久久久 | 精品一区二区三区波多野结衣 | 日本熟妇乱子伦xxxx | 亚洲国产成人av在线观看 | 狠狠噜狠狠狠狠丁香五月 | 亚洲成a人片在线观看无码 | 久久97精品久久久久久久不卡 | 亚洲成av人在线观看网址 | 最新国产乱人伦偷精品免费网站 | 综合网日日天干夜夜久久 | 亚洲国产av精品一区二区蜜芽 | 亚洲aⅴ无码成人网站国产app | 久久精品中文闷骚内射 | 亚洲精品国产品国语在线观看 | 亚洲一区二区三区偷拍女厕 | 中文字幕亚洲情99在线 | 激情综合激情五月俺也去 | 欧美喷潮久久久xxxxx | 免费人成在线视频无码 | 999久久久国产精品消防器材 | 成人免费视频视频在线观看 免费 | 日韩人妻少妇一区二区三区 | 成年女人永久免费看片 | 亚洲精品中文字幕 | 亚洲 a v无 码免 费 成 人 a v | 亚洲国产精品毛片av不卡在线 | 无码av最新清无码专区吞精 | 蜜桃视频插满18在线观看 | 东北女人啪啪对白 | 熟女体下毛毛黑森林 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲熟熟妇xxxx | 一本久久a久久精品vr综合 | 国内精品人妻无码久久久影院蜜桃 | 特黄特色大片免费播放器图片 | а√天堂www在线天堂小说 | 欧美一区二区三区 | 日韩人妻无码一区二区三区久久99 | 久久亚洲中文字幕精品一区 | 久久综合久久自在自线精品自 | 国产无套粉嫩白浆在线 | 午夜丰满少妇性开放视频 | 精品日本一区二区三区在线观看 | 强开小婷嫩苞又嫩又紧视频 | 亚洲а∨天堂久久精品2021 | 日日天日日夜日日摸 | 撕开奶罩揉吮奶头视频 | 国产无遮挡吃胸膜奶免费看 | 久久www免费人成人片 | 人妻尝试又大又粗久久 | 国产网红无码精品视频 | 久久精品中文闷骚内射 | 国产两女互慰高潮视频在线观看 | 天堂在线观看www | 亚洲成av人影院在线观看 | 午夜丰满少妇性开放视频 | 伊人久久大香线蕉午夜 | 成人女人看片免费视频放人 | 俺去俺来也www色官网 | 少妇无码一区二区二三区 | 中文字幕 亚洲精品 第1页 | 亚洲国产高清在线观看视频 | 无码任你躁久久久久久久 | 亚洲欧美色中文字幕在线 | 老子影院午夜精品无码 | 小泽玛莉亚一区二区视频在线 | 日韩av无码中文无码电影 | 国产做国产爱免费视频 | 蜜桃av抽搐高潮一区二区 | 偷窥村妇洗澡毛毛多 | 97无码免费人妻超级碰碰夜夜 | 亚欧洲精品在线视频免费观看 | 国产精品爱久久久久久久 | 日韩av无码一区二区三区 | 成人女人看片免费视频放人 | 久久久av男人的天堂 | 国产情侣作爱视频免费观看 | 秋霞成人午夜鲁丝一区二区三区 | 午夜精品久久久内射近拍高清 | 无码人妻久久一区二区三区不卡 | 妺妺窝人体色www婷婷 | 国产极品视觉盛宴 | 无套内谢的新婚少妇国语播放 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久精品国产日本波多野结衣 |