2017-03-23 7 views
1

J'ai actuellement une solution utilisant AngularJS/SpreadJS où nous devons mettre à jour la section d'en-tête avec une formule. Lorsque nous modifions une valeur de cellule dans l'en-tête en utilisant setValue everythign affiche ok, nous devons afficher une formule en utilisant setFormula, dans ce cas la formule est calculée et affichée dans les lignes appartenant à la feuille où mes données sont.Placer des formules (setFormula) sur les en-têtes SpreadJS (colHeader)

//Does not work and displays in row 2 of the sheet: 
sheet.setFormula(2, i, formula, GC.Spread.Sheets.SheetArea.colHeader); 

//Displays value in actual header in teh correct location/header cell     
sheet.setValue(2, i, 'my formula!', GC.Spread.Sheets.SheetArea.colHeader); 

Toute aide sera appréciée. Merci!

+0

Pouvez-vous s'il vous plaît expliquer le cas d'utilisation pour cela. Cela ne sera pas facile car l'en-tête ne fait pas partie de l'arbre de dépendances de la calcengine. Si vous fournissez plus de détails, je demanderai à notre équipe de s'en occuper. Est-il possible d'utiliser la feuille elle-même comme un en-tête, c'est-à-dire de placer la formule dans la rangée supérieure puis de figer le volet de la rangée supérieure puis de masquer l'en-tête lui-même. –

+0

Merci! Nous avons un en-tête dynamique où nous affichons l'agrégation de nos colonnes. Nos spreads peuvent avoir 1000 enregistrements, d'où les utilisateurs demandent d'avoir des agrégations sur le dessus. Nous avons déjà commencé le développement et placé tous nos en-têtes dans le colHeader. Nous remplissons actuellement notre feuille avec un simple setDataSource (ourData), comment pouvons-nous définir cela pour commencer à tout peupler (en-têtes de colonne de données, données, etc.) sur une ligne particulière? Dans l'attente de votre réponse. – eagleEye

Répondre

1

Mis en œuvre ci-dessous solution pour obtenir la formule SOMME dans la colonne en-tête de la fonction de propagation sheet.This peut être appelée sur les événements de la feuille de diffusion comme cellChanged, clipBoardPasted pour obtenir la fonctionnalité.

var spread = new GC.Spread.Sheets.Workbook($("#ss").get(0), { sheetCount: 2 }); 
    var displaySheet = spread.getSheet(0); 
    displaySheet.setRowCount(2, GC.Spread.Sheets.SheetArea.colHeader); 

    for (var i = 0; i < 10; i++) { 
     for (var j = 0; j < 10; j++) { 
      displaySheet.setValue(i, j, i + j); 
     } 
    } 
    $("#btnSetAutoTotal").click(function() { 
     setTotal(displaySheet, 0); 
    }); 

    function setTotal(sheet, columnIndex) { 
    var formula = "SUM(R[1]C[1]:R[10]C[10]"; 
    value = GC.Spread.Sheets.CalcEngine.evaluateFormula(sheet, 'SUM(A:A)', 0, 
    columnIndex, false); 
    sheet.setValue(0, columnIndex, value, GC.Spread.Sheets.SheetArea.colHeader); 

}; 
0

L'équipe a créé cet exemple pour montrer ce dont vous avez besoin. J'espère que cela t'aides.

 function setColumnHeaderFunction() { 
 
      this.name = "SetColumnHeader"; 
 
      this.maxArgs = 3; 
 
      this.minArgs = 3; 
 
     } 
 
     setColumnHeaderFunction.prototype = new GC.Spread.CalcEngine.Functions.Function(); 
 
     setColumnHeaderFunction.prototype.description = function() { 
 
      return { 
 
       name:"SetColumnHeader", 
 
       description: "The function will apply the calc result on specified column", 
 
       parameters: [{ 
 
        name: "result", 
 
        description: "The value which will be setted on column" 
 
       }, { 
 
        name: "rowIndex", 
 
        description: "The row index" 
 
       }, { 
 
        name: "colIndex", 
 
        description: "The column index" 
 
       }] 
 
      } 
 
     } 
 
     setColumnHeaderFunction.prototype.evaluate = function() { 
 
      var value = arguments[0], rowIndex = arguments[1], colIndex = arguments[2]; 
 
      var spread = GC.Spread.Sheets.findControl("ss"); 
 
      var sheet = spread.getSheet(0); 
 
      sheet.setValue(rowIndex, colIndex, value, GC.Spread.Sheets.SheetArea.colHeader); 
 
     } 
 

 
     $(document).ready(function() { 
 
      var spread = new GC.Spread.Sheets.Workbook($("#ss").get(0), {sheetCount: 2}); 
 
      spread.addCustomFunction(new setColumnHeaderFunction()); 
 
      var displaySheet = spread.getSheet(0); 
 
      displaySheet.setDataSource(getSource(100)); 
 
      displaySheet.setRowCount(3, GC.Spread.Sheets.SheetArea.colHeader); 
 
      displaySheet.setValue(0,0,"Count:",GC.Spread.Sheets.SheetArea.colHeader); 
 
      displaySheet.setValue(0,3,"Sum:",GC.Spread.Sheets.SheetArea.colHeader); 
 
      displaySheet.setValue(0,4,"Average:",GC.Spread.Sheets.SheetArea.colHeader); 
 
      displaySheet.setValue(0,5,"Sum:",GC.Spread.Sheets.SheetArea.colHeader); 
 

 

 
      var calcSheet = spread.getSheet(1); 
 
      calcSheet.visible(false); 
 
      calcSheet.setFormula(0, 1, "SetColumnHeader(SUM(Sheet1!D:D),1,3)"); 
 
      calcSheet.setFormula(0, 2, "SetColumnHeader(AVERAGE(Sheet1!E:E),1,4)"); 
 
      calcSheet.setFormula(0, 3, "SetColumnHeader(SUM(Sheet1!F:F),1,5)"); 
 
      calcSheet.setFormula(0, 4, "SetColumnHeader(COUNT(Sheet1!A:A),1,0)"); 
 
     }); 
 

 
     function getSource(count) { 
 
      var dataList = []; 
 
      var _lines = ["Computers", "Washers", "Stoves"]; 
 
      var _colors = ["Red", "Green", "Blue", "White"]; 
 
      for (var i = 0; i < count; i++) { 
 
       dataList.push({ 
 
        id: i, 
 
        line: _lines[parseInt(Math.random() * 3)], 
 
        color: _colors[parseInt(Math.random() * 4)], 
 
        price: parseInt(Math.random() * 501 + 500), 
 
        cost: parseInt(Math.random() * 601), 
 
        weight: parseInt(Math.random() * 101), 
 
       }) 
 
      } 
 
      return dataList; 
 
     }