最近做了一個比較有趣的功能--在線編輯excel,使用的便是SpreadJS v13。雖然開發用的框架是react,但是spread對框架並沒有特定要求。
先放官方文檔網址,點這里
如果你沒有足夠的耐心看官方文檔,這里將會是輕熟易懂的白話文,包括對文檔參數我的理解。整個文檔將是從無到數據保存大致流程寫下來,有的地方會寫的比較簡單,因為官方文檔上已經寫得很清楚,最后會放一個簡單的完整例子。
如果有理解錯誤之處,請務必留言,會盡快做出修改!!!
那么,讓我們從零開始吧。
- SpreadJs引入
SpreadJS不依賴任何第三方組件。它只需要引用下列文件:gc.spread.sheets.xx.x.x.css,gc.spread.sheets.all.xx.x.x.min.js。
推薦例子:點這里
- 初始化spread
新建一個spread--Workbook
let spread = new GC.Spread.Sheet.Workbook(dom,config)
說明:
spread: 初始化的spread對象實例
dom: dom元素。例如:document.getElementById('ss') 或者 this.refs.ss
config: 初始化spread的參數,例如:
let config={ sheetCount: 1, //表單數量 font: 'normal 11pt Arial' //默認字體設置 }
獲取spread實例--findControl
let spead = var spread = GC.Spread.Sheets.findControl(dom)
spread.options.newTabVisible = false //是否有新增表單的按鈕 spread.options.tabEditable = false //是否可以重命名表單名字
注釋:可手動獲取spread實例,也可初始化時存儲到一個全局變量。spread構造函數中的參數屬性,點這兒
- sheet表單
獲取表單
sheet = spread.getActiveSheet() //獲取當前sheet sheet1 = spread.getSheet(index) //index: 下標 sheet2 = spread.getSheetFromName('Sheet1'); //sheet1,名稱
- spread繪制
spread.suspendPaint() //暫停繪制
spread.resumePaint() //激活繪制
大多數時候, 在你改變 Spread 之后, 控件會自動刷新以達到重繪和更新狀態的目的。 可是, 如果你一次做出大量的改變, 並且不希望每次改變都去重新繪制 Spread , 那么你可以調用 suspendPaint 暫停重繪, 完成改變之后,你可以調用resumePaint 重新激活Spread重繪,例如:
var spread = GC.Spread.Sheets.findControl(document.getElementById('ss')); spread.suspendPaint(); spread.addSheet(0); spread.fromJSON(json); // json data spread.resumePaint();
- 單元格
獲取單元格
sheet.getCell(rowIndex,colIndex) //rowIndex:行下標,colIndex:列下表,為0時,表示整行。獲取某個單元格
sheet.getRange(rowIndex,colIndex,rowCount,colCount) // 獲取范圍單元格。行下標,列下標,行數,列數量
合並單元格
sheet.addSpan(rowIndex,colIndex,rowCount,colCount) // 獲取范圍單元格。行下標,列下標,行數,列數量
sheet.removeSpan(20, 1) //調用 removeSpan 方法來分解指定包含合並的單元格。
- 單元格樣式
構造樣式屬性
var style = new GC.Spread.Sheets.Style();
style.backColor = 'red';
style.foreColor = 'green';
style.isVerticalText = 'true';
sheet.addNamedStyle(style); //添加到樣式表中
sheet.getNamedStyle('style1'); //獲取
sheet.removeNamedStyle('style1'); //刪除
賦值樣式
//set style to cell. sheet.setStyle(5, 5, style, GC.Spread.Sheets.SheetArea.viewport); //set style to row. sheet.setStyle(5, -1, style, GC.Spread.Sheets.SheetArea.viewport); //set style to column. sheet.setStyle(-1, 5, style, GC.Spread.Sheets.SheetArea.viewport);
單獨賦樣式
sheet.getCell(rowIndex,colIndex).backColor('red') //背景顏色
注釋:設置背景顏色時,注意使用英文顏色,例如:'red'。如果使用rgba,可能出現重影問題。
凍結/固定行列
sheet.frozenRowCount(count) //凍結行數量
sheet.frozenColumnCount(count) //凍結列數量
設置列寬
sheet.setColumnWidth(colIndex,width) // 設置某列寬度
- 公式
- 文本格式
sheet.getCell(rowIndex,colIndex).formatter(formatterStr)
更多用法:點這
- 表格保護
可以通過設置表單的isProtected來限制表單的操作行為,詳見這里
表單是否受保護取決於兩個設置共同決定,sheet.options.isProtected 以及當前單元格是否被鎖定,
locked默認為true。更多體驗點這里
- spread例子
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>在線編輯表格</title> </head> <body> <button onclick="setExcel()">點我渲染excel</button> <button onclick="getExcelData()">點我渲染excel</button> <div id="ss" style="width:100%; height:360px;border: 1px solid gray;"></div> <script type="text/javascript"> //全局變量 var spread var sheet var spreadGSS = GC.Spread.Sheet let rowCount = 100 let colCount = 200 let titleArr = ['字段1','字段2','字段3','字段4','字段5','字段6','字段7'] let tableData = [ [1,1,1,1,1,1,1], [1,1,1,1,1,1,1], ] let normalFormat = new GC.Spread.Formatter.GeneralFormatter('#,##0.00') //千位符,兩位小數 // 初始化spread function initSpread(){ let ss = document.getElementById('ss') let config = { sheetCount: 1 } spread = new spreadGSS.Workbook(ss,config) sheet = spead.getActiveSheet() sheet.setColumnCount(colCount) //列數量 sheet.setRowCount(rowCount) //行數量 sheet.name('sheet1') //表單命名 } function setExcel(){ sheet.reset() //重置 spread.suspendPaint() // 暫停 excelStyle() renderHeader() renderData() spread.resumePaint() // 激活 } // 樣式 function excelStyle(){ let titleStyle = new spreadGSS.Style() titleStyle.name = 'titleStyle' titleStyle.locked = true //用於表單保護 titleStyle.backColor = 'rgb(155,194,230)' //藍色 sheet.addNameStyle(titleStyle) let normalStyle = new spreadGSS.Style() normalStyle.name = 'normalStyle' normalStyle.locked = false normalStyle.backColor = 'green' //綠色 sheet.addNameStyle(normalStyle) } // 模擬表格頭部 合並單元格 + 設置單元格值 + 設置樣式 function renderHeader(){ let title = '表格標題' let titleStyle = sheet.getNamedStyle('titleStyle') //第一行 sheet.getRange(0,0,1,7) //合並單元,0:行下標,0:列下標,1:行數,7:列數 sheet.setValue(0,0,title) //設置內容,0:行下標,0:列下標, title: 內容 // 第二行 titleArr.forEach((item,index) => { sheet.setValue(1,index,item) // 1.設置內容 // sheet.getCell(1,index).text(item) 1.設置內容 sheet.setStyle(1,index,titleStyle,GC.Spread.Sheets.SheetArea.viewport) // 2.設置樣式 // sheet.getCell(1,index).backColor('blue') //2.設置樣式 }) } // 數據渲染 + 公式渲染 function renderData(){ // 從第二行渲染 let startRowIndex = 2 tableData.forEach((item,index)=>{ let curRowData = item startRowIndex += index //行下標 // 列循環 curRowData.forEach((data,curColIndex)=>{ sheet.setValue(startRowIndex,curColIndex,data) setFormatter(startRowIndex,curColIndex) //設置數字格式 }) }) titleArr.forEach((item,index) => { let letter = sheet.getText(0,index,spreadGSS.SheetArea.colHeader) //獲取列字母,列下標固定為0 // =SUM(A3:A4) let formulaStr = `=SUM(${letter}3:${letter}4)` sheet.setFormula(startRowIndex+1,index,formulaStr) //3.公式 // sheet.getCell(startRowIndex+1,index).formula(formulaStr) //3.公式 }) let normalStyle = sheet.getNamedStyle('normalStyle') sheet.setStyle(startRowIndex+1,-1,normalStyle) // 行下標,-1:整行, 樣式 } // 數據格式 function setFormatter(rowIndex,colIndex,formatterStr=normalFormat){ sheet.getCell(rowIndex,colIndex).formatter(formatterStr) } // 獲取excel數據 sheet.getValue() function getExcelData(){ let startRowIndex = 2 tableData.forEach((index)=>{ startRowIndex += index //行下標 // 列循環 titleArr.forEach((data,curColIndex)=>{ let value = sheet.getValue(startRowIndex,curColIndex) console.log(value) //每個單元格的值 }) }) } window.onload = initSpread </script> </body> </html>
大致效果圖:
Spread也是十分強大,這里只是基礎使用方法。以上使用方法親測有效,如果你的需求更復雜,請前往官網。