数式

SPREADでは、300種類以上におよぶ関数を提供しています。

コントロールの ClientAutoCalculation プロパティを true に設定することで、コントロールは数式の再計算に Ajax を使用します。 ユーザーが数値を変更すると自動的にサーバー側へコールバックを実行し、ただちに再計算が処理されます。
また、ユーザーによる数式の入力はSheetViewオブジェクトのAllowUserFormulas プロパティをfalseに設定することで禁止できます。この場合、ユーザーが「=」ではじまるデータを入力しても、サーバー側では数式として解析しません。

このサンプルでは、数式を「合計」列に設定しています。 「第1Q」列~「第4Q」列の値を変更すると「合計」列へ反映します。 ドロップダウンリストの選択を変更することにより、数式入力の可否を変更することができます。
 製品ID製品分類製品名第1Q第2Q第3Q第4Q合計
110001乳製品酪農ミルク5,5005,0004,5006,00021,000
220001清涼飲料水いよかんドリンク1,0003,0002,7002,7009,400
320002清涼飲料水ぶどうジュース3,0003,5004,8004,80016,100
420003清涼飲料水マンゴードリンク2,0001,0005001,0504,550
530001ビール激辛ビール5,5008,0008,50010,00032,000
630002ビールモルトビール3,0003,5002,7804,00013,280
720004清涼飲料水ぶどうの街5003002007001,700
830003ビールオリエントの村8,0009,5009,5809,00036,080
940002焼酎吟醸 ほめごろし6,0007,0009,0009,50031,500
1040003焼酎大吟醸 オリエント1,0005,0006,0005,00017,000
1140005焼酎麦焼酎 ちこちこ1,0001,5001,2001,2584,958
1210002乳製品酪農ミルク(低脂肪)5012023804561,539

ソースコード

別ウィンドウで表示
using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Configuration;

public partial class formula : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // クライアントイベントの設定
        string js = "var spid='" + FpSpread1.ClientID + "';";
    js += "var spread = document.getElementById(spid);" + "\r\n";
    js += "if(document.all)" + "\r\n";
    js += "{" + "\r\n";
    js += "  spread.onEditStopped = es;" + "\r\n";
    js += "}" + "\r\n";
    js += "else" + "\r\n";
    js += "{" + "\r\n";
    js += "  spread.addEventListener(\"EditStopped\", es, false);" + "\r\n";
    js += "}" + "\r\n";

        ClientScript.RegisterStartupScript(this.GetType(), "onStartUpScript", js, true);
        
        if (IsPostBack) return;

        // セル型の自動設定を無効化
        FpSpread1.ActiveSheetView.DataAutoCellTypes = false;

        // データ連結
        DataSet ds = new DataSet();
        ds.ReadXml(MapPath("../App_Data/datanum2.xml"));
        FpSpread1.DataSource = ds;

        FarPoint.Web.Spread.SheetView sheet = FpSpread1.Sheets[0];
        
        // SPREAD初期化
        InitSpread(sheet);

        // クライアント側スクリプトの設定
        string clientScript = "<script language=\"JavaScript\">";
        clientScript += "function AllowFormulas(val)";
        clientScript += "{";
        clientScript += "var spread = document.getElementById(\"" + FpSpread1.ClientID + "\");";
        clientScript += "spread.CallBack(\"AllowFormulas.\"+val);";
        clientScript += "}";
        clientScript += "</script>";

        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "formulaScript", clientScript, false);
    }

    private void InitSpread(FarPoint.Web.Spread.SheetView sheet)
    {
        // SPREAD設定
        sheet.FpSpread.CommandBar.Visible = false;
        sheet.FpSpread.CssClass = "spreadStyle";
        sheet.FpSpread.UseClipboard = false;

        // フォントサイズの設定
        sheet.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.ColumnHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.RowHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.SheetCorner.DefaultStyle.Font.Size = FontUnit.Parse("80%");

        // シート設定
        sheet.PageSize = sheet.RowCount;

        // 合計列追加
        sheet.AddColumns(7, 1);
        sheet.ColumnHeader.Cells[0, 7].Text = "合計";

        // 数式設定
        for (int i = 0; i < sheet.RowCount; i++)
        {
            string row = Convert.ToString(i + 1);
            sheet.Cells[i, 7].Formula = "SUM(D" + row + ":G" + row + ")";    
        }
        
        // 列幅の設定
        sheet.Columns[0].Width = 45;
        sheet.Columns[1].Width = 85;
        sheet.Columns[2].Width = 135;
        sheet.Columns[3].Width = 65;
        sheet.Columns[4].Width = 65;
        sheet.Columns[5].Width = 65;
        sheet.Columns[6].Width = 65;
        sheet.Columns[7].Width = 103;

        // 縦方向の揃え位置を中央に設定
        sheet.DefaultStyle.VerticalAlign = VerticalAlign.Middle;

        // 各列のセル型を設定
        FarPoint.Web.Spread.GeneralCellType gnr = new FarPoint.Web.Spread.GeneralCellType();
        gnr.FormatString = "#,##0";
        sheet.Columns[3, 7].CellType = gnr;
        sheet.Columns[3, 7].HorizontalAlign = HorizontalAlign.Right;
        sheet.Columns[0, 2].Locked = true;

        // クライアントで値が変更された場合、数式に反映
        sheet.FpSpread.ClientAutoCalculation = true;
    }

    protected void FpSpread1_ButtonCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
    {
        if (e.CommandName.StartsWith("AllowFormulas"))
        {
            string[] strCom = e.CommandName.Split('.');

            FpSpread1.ActiveSheetView.AllowUserFormulas = Convert.ToBoolean(strCom[1]);
        }
    }
}

Partial Public Class formula
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' クライアントイベントの設定
        Dim js As String = "var spid='" + FpSpread1.ClientID & "';"
        js += "var spread = document.getElementById(spid);" & vbCr & vbLf
        js += "if(document.all)" & vbCr & vbLf
        js += "{" & vbCr & vbLf
        js += "  spread.onEditStopped = es;" & vbCr & vbLf
        js += "}" & vbCr & vbLf
        js += "else" & vbCr & vbLf
        js += "{" & vbCr & vbLf
        js += "  spread.addEventListener(""EditStopped"", es, false);" & vbCr & vbLf
        js += "}" & vbCr & vbLf

        ClientScript.RegisterStartupScript(Me.GetType(), "onStartUpScript", js, True)

        If IsPostBack Then
            Return
        End If

        ' セル型の自動設定を無効化
        FpSpread1.ActiveSheetView.DataAutoCellTypes = False

        ' データ連結
        Dim ds As New System.Data.DataSet()
        ds.ReadXml(MapPath("../App_Data/datanum2.xml"))
        FpSpread1.DataSource = ds

        Dim sheet As FarPoint.Web.Spread.SheetView = FpSpread1.Sheets(0)

        ' SPREAD初期化
        InitSpread(sheet)

        ' クライアント側スクリプトの設定
        Dim clientScript__1 As String = "<script language=""JavaScript"">"
        clientScript__1 += "function AllowFormulas(val)"
        clientScript__1 += "{"
        clientScript__1 += "var spread = document.getElementById(""" + FpSpread1.ClientID & """);"
        clientScript__1 += "spread.CallBack(""AllowFormulas.""+val);"
        clientScript__1 += "}"
        clientScript__1 += "</script>"

        ScriptManager.RegisterClientScriptBlock(Me, Me.GetType(), "formulaScript", clientScript__1, False)
    End Sub

    Private Sub InitSpread(ByVal sheet As FarPoint.Web.Spread.SheetView)
        ' SPREAD設定
        sheet.FpSpread.CommandBar.Visible = False
        sheet.FpSpread.CssClass = "spreadStyle"
        sheet.FpSpread.UseClipboard = False

        ' フォントサイズの設定
        sheet.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.ColumnHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.RowHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.SheetCorner.DefaultStyle.Font.Size = FontUnit.Parse("80%")

        ' シート設定
        sheet.PageSize = sheet.RowCount

        ' 合計列追加
        sheet.AddColumns(7, 1)
        sheet.ColumnHeader.Cells(0, 7).Text = "合計"

        ' 数式設定
        For i As Integer = 0 To sheet.RowCount - 1
            Dim row As String = Convert.ToString(i + 1)
            sheet.Cells(i, 7).Formula = "SUM(D" & row & ":G" & row & ")"
        Next

        ' 列幅の設定
        sheet.Columns(0).Width = 45
        sheet.Columns(1).Width = 85
        sheet.Columns(2).Width = 135
        sheet.Columns(3).Width = 65
        sheet.Columns(4).Width = 65
        sheet.Columns(5).Width = 65
        sheet.Columns(6).Width = 65
        sheet.Columns(7).Width = 103

        ' 縦方向の揃え位置を中央に設定
        sheet.DefaultStyle.VerticalAlign = VerticalAlign.Middle

        ' 各列のセル型を設定
        Dim gnr As New FarPoint.Web.Spread.GeneralCellType()
        gnr.FormatString = "#,##0"
        sheet.Columns(3, 7).CellType = gnr
        sheet.Columns(3, 7).HorizontalAlign = HorizontalAlign.Right
        sheet.Columns(0, 2).Locked = True

        ' クライアントで値が変更された場合、数式に反映
        sheet.FpSpread.ClientAutoCalculation = True
    End Sub

    Protected Sub FpSpread1_ButtonCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.ButtonCommand
        If e.CommandName.StartsWith("AllowFormulas") Then
            Dim strCom As String() = e.CommandName.Split("."c)

            FpSpread1.ActiveSheetView.AllowUserFormulas = Convert.ToBoolean(strCom(1))
        End If
    End Sub
End Class
<%@ Page MasterPageFile="~/MasterPage.master" Language="c#" AutoEventWireup="true" 
         Inherits="formula" CodeFile="formula.aspx.cs" %>

<%@ Register Assembly="FarPoint.Web.SpreadJ" Namespace="FarPoint.Web.Spread" TagPrefix="FarPoint" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeaderPlaceHolder1" Runat="Server">
<script type="text/javascript">
      function es() {
        var spread = document.getElementById(spid);
        var row = spread.GetActiveRow();
        var col = spread.GetActiveCol();
        if (col == 3 || col == 4 || col == 5 || col == 6) //数値列が編集された時のみ処理を行う
        {
            var td = spread.GetCellByRowCol(row, col);
            var v = spread.GetValue(row, col);
            td.innerHTML = setFormat(v);
        }
    }
    function setFormat(val) {
        //数値を3桁区切りにする
        var v = val;
        var t;
        while (v != (t = v.replace(/^([+-]?\d+)(\d\d\d)/, "$1,$2")))
            v = t;
        return v;
    }
</script>
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <asp:DropDownList ID="DropDownList1" runat="server" onchange="AllowFormulas(this[this.selectedIndex].value);">
        <asp:ListItem Value="true">ユーザーの数式入力を許可</asp:ListItem>
        <asp:ListItem Value="false">ユーザーの数式入力を禁止</asp:ListItem>
    </asp:DropDownList>
    <farpoint:FpSpread ID="FpSpread1" runat="server" 
        onbuttoncommand="FpSpread1_ButtonCommand">
        <CommandBar BackColor="Control" ButtonFaceColor="Control" ButtonHighlightColor="ControlLightLight"
            ButtonShadowColor="ControlDark" />
        <Sheets>
            <farpoint:SheetView SheetName="Sheet1">
            </farpoint:SheetView>
        </Sheets>
    </farpoint:FpSpread>
</asp:Content>