ナビゲーション リンクのスキップ
 新機能 の展開 新機能
 InputMan連携 の展開 InputMan連携
 マルチタッチ機能 の展開 マルチタッチ機能
 セル、行、列、ヘッダ の展開 セル、行、列、ヘッダ
 シート の展開 シート
 スタイル の展開 スタイル
 選択 の展開 選択
 セル型 の展開 セル型
 編集 の展開 編集
 ソート の展開 ソート
 フィルタリング の展開 フィルタリング
 グループ化 の展開 グループ化
 ページング の展開 ページング
 スクロール の展開 スクロール
 データ連結 の展開 データ連結
 階層表示 の展開 階層表示
 コマンドバー の展開 コマンドバー
 チャート の展開 チャート
 数式 の縮小 数式
 インポート/エクスポート の展開 インポート/エクスポート
 クライアント側スクリプト の展開 クライアント側スクリプト

数式

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>