spreadJS在線編輯excel的初級使用


  最近做了一個比較有趣的功能--在線編輯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).formula(formulaStr)   //方式一
    sheet.setFormula(rowIndex,colIndex,formulaStr)    //方式二
  • 文本格式

    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也是十分強大,這里只是基礎使用方法。以上使用方法親測有效,如果你的需求更復雜,請前往官網。

 

 

 

 

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM