|
数式
SPREADでは、300種類以上におよぶ関数を提供しています。
コントロールの ClientAutoCalculation プロパティを true に設定することで、コントロールは数式の再計算に Ajax を使用します。
ユーザーが数値を変更すると自動的にサーバー側へコールバックを実行し、ただちに再計算が処理されます。
また、ユーザーによる数式の入力はSheetViewオブジェクトのAllowUserFormulas プロパティをfalseに設定することで禁止できます。この場合、ユーザーが「=」ではじまるデータを入力しても、サーバー側では数式として解析しません。
このサンプルでは、数式を「合計」列に設定しています。
「第1Q」列~「第4Q」列の値を変更すると「合計」列へ反映します。
ドロップダウンリストの選択を変更することにより、数式入力の可否を変更することができます。
| 製品ID | 製品分類 | 製品名 | 第1Q | 第2Q | 第3Q | 第4Q | 合計 |
1 | 10001 | 乳製品 | 酪農ミルク | 5,500 | 5,000 | 4,500 | 6,000 | 21,000 |
2 | 20001 | 清涼飲料水 | いよかんドリンク | 1,000 | 3,000 | 2,700 | 2,700 | 9,400 |
3 | 20002 | 清涼飲料水 | ぶどうジュース | 3,000 | 3,500 | 4,800 | 4,800 | 16,100 |
4 | 20003 | 清涼飲料水 | マンゴードリンク | 2,000 | 1,000 | 500 | 1,050 | 4,550 |
5 | 30001 | ビール | 激辛ビール | 5,500 | 8,000 | 8,500 | 10,000 | 32,000 |
6 | 30002 | ビール | モルトビール | 3,000 | 3,500 | 2,780 | 4,000 | 13,280 |
7 | 20004 | 清涼飲料水 | ぶどうの街 | 500 | 300 | 200 | 700 | 1,700 |
8 | 30003 | ビール | オリエントの村 | 8,000 | 9,500 | 9,580 | 9,000 | 36,080 |
9 | 40002 | 焼酎 | 吟醸 ほめごろし | 6,000 | 7,000 | 9,000 | 9,500 | 31,500 |
10 | 40003 | 焼酎 | 大吟醸 オリエント | 1,000 | 5,000 | 6,000 | 5,000 | 17,000 |
11 | 40005 | 焼酎 | 麦焼酎 ちこちこ | 1,000 | 1,500 | 1,200 | 1,258 | 4,958 |
12 | 10002 | 乳製品 | 酪農ミルク(低脂肪) | 501 | 202 | 380 | 456 | 1,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>
|
|