6

私は一般的に Excel や Microsoft 製品を使用するのが好きではありませんが、Excel 2007/2010 には非常に優れた条件付き書式設定機能がいくつかあります。ビジネス レポートでよく使用するものの 1 つは、データ バーです。 リンク

私の意見では、これらのデータ バーは、数値を超えたデータの意味を理解するのに非常に役立ちます。200 ユーザーと 2000 ユーザーの違いは、人間の目には把握しにくい数字にすぎませんが、10 倍長いバーは​​はるかに直感的です。

私の質問: Excel の機能を反映して、jqGrid の列のすべての値にセル内の条件付きデータ バーを含める方法はありますか? これは、Excel シートを取り除き、オンライン レポート システムにレポートを実装する唯一の方法です。データ バーは、慣れれば必要不可欠なものであり、レポートに Excel を使用し続けている唯一の理由です。

私が推測するように、jqGrid にこのような組み込み機能がない場合、それをカスタム構築するのは大変な作業になると思いますか? これにアプローチするための最良の方法は何か考えはありますか?

4

2 に答える 2

9

あなたが質問に書いたのは、Excel の興味深い機能です。私はこれについて前に知りませんでした。

必要なのは、カスタム フォーマッタ関数を実装することです。一般的には非常に簡単です。値 (カラーバー上のテキスト) に基づいてセルの内容を表示する小さな関数を作成する必要があります。さらに、あなたのケースでは非常に簡単なUnformatting カスタム関数も定義する必要があります。アンフォーマット関数は、並べ替えや、グリッド セルから値を取得する必要があるその他の jqGrid 操作中に使用できます。

したがって、問題は、カラーバーの上に数値を表示することに軽減される可能性があります。

更新:数値の書式設定に色を使用すると本当に役立つことがわかったので、私はあなたの質問について何度も何度も考えました。そこで、時間をかけて、次の結果を生成する対応するコード例を作成しました

代替テキスト

ここでライブを見ることができます。

コードへの小さなコメント。グリッドが次のように表示される Opera を除く現在のブラウザでグラデーション バーを生成する CSS クラスをいくつか作成する必要がありました。

代替テキスト

CSS クラスは次のように定義されています。

.cellDiv 
{
    left: 0px; top:5px; height:22px;
    position:relative;padding:0;margin-right:-4px;border:0;
}
.cellTextRight
{
    position:relative;
    margin-right:4px;
    text-align:right;
    float:right;
}
.gradient1{
    /* fallback (Opera) */
    background: #008AEF;
    /* Mozilla: https://developer.mozilla.org/en/CSS/-moz-linear-gradient */
    background: -moz-linear-gradient(left, #008AEF, white);
    /* Chrome, Safari: http://webkit.org/blog/175/introducing-css-gradients/ */
    background: -webkit-gradient(linear, left top, right top, from(#008AEF), to(white));
    /* MSIE http://msdn.microsoft.com/en-us/library/ms532997(VS.85).aspx */
    filter: progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#008AEF', EndColorStr='white', GradientType=1);
    /*ie8*/
    -ms-filter: "progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#008AEF', EndColorStr='white', GradientType=1)";
    position: absolute; left: -2px; top:-5px; right: 2px; height:22px; float:left;
}
.gradient2{
    background: #63C384;
    background: -moz-linear-gradient(left, #63C384 0%, white 100%);
    background: -webkit-gradient(linear, left top, right top, from(#63C384), to(white));
    filter: progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#63C384', EndColorStr='white', GradientType=1);
    -ms-filter: "progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#63C384', EndColorStr='white', GradientType=1)";
    position: absolute; left: -2px; top:-5px; right: 2px; height:22px; float:left;
}

および内部の jqGrid コード$(document).ready(function () {/*code*/});:

var grid = $("#list");
var gradientNumberFormat = function (cellvalue, gradientClass, minDataValue,
                                 maxDataValue, minDisplayValue, maxDisplayValue) {
    var dataAsNumber = parseFloat(cellvalue); /* parseInt(cellvalue, 10);*/
    if (dataAsNumber > maxDataValue) {
        dataAsNumber = maxDataValue;
    }
    if (dataAsNumber < minDataValue) {
        dataAsNumber = minDataValue;
    }
    var prozentVal = minDisplayValue+(dataAsNumber-minDataValue)*(maxDisplayValue-
                                      minDisplayValue)/(maxDataValue-minDataValue);
    return '<div class="cellDiv"><div class="'+gradientClass+'" style="width:'+
            prozentVal+'%;"></div><div class="cellTextRight">'+cellvalue +
            '</div></div>';
};
var mydata = [
    { id: "1",  invdate: "2007-10-01", name: "test",  note: "note",
      amount: "200.00", tax: "10.00", total: "210.00" },
    { id: "2",  invdate: "2007-10-02", name: "test2", note: "note2",
      amount: "300.00", tax: "20.00", total: "320.00" },
    { id: "3",  invdate: "2007-09-01", name: "test3", note: "note3",
      amount: "400.00", tax: "30.00", total: "430.00" },
    { id: "4",  invdate: "2007-10-04", name: "test",  note: "note",
      amount: "200.00", tax: "10.00", total: "210.00" },
    { id: "5",  invdate: "2007-10-05", name: "test2", note: "note2",
      amount: "300.00", tax: "20.00", total: "320.00" },
    { id: "6",  invdate: "2007-09-06", name: "test3", note: "note3",
      amount: "400.00", tax: "30.00", total: "430.00" },
    { id: "7",  invdate: "2007-10-04", name: "test",  note: "note",
      amount: "200.00", tax: "10.00", total: "210.00" },
    { id: "8",  invdate: "2007-10-03", name: "test2", note: "note2",
      amount: "300.00", tax: "20.00", total: "320.00" },
    { id: "9",  invdate: "2007-09-01", name: "test3", note: "note3",
      amount: "400.00", tax: "30.00", total: "430.00" },
    { id: "10", invdate: "2007-10-01", name: "test",  note: "note",
      amount: "200.00", tax: "10.00", total: "210.00" },
    { id: "11", invdate: "2007-10-02", name: "test2", note: "note2",
      amount: "300.00", tax: "20.00", total: "320.00" },
    { id: "12", invdate: "2007-09-01", name: "test3", note: "note3",
      amount: "400.00", tax: "30.00", total: "430.00" },
    { id: "13", invdate: "2007-10-04", name: "test",  note: "note",
      amount: "200.00", tax: "10.00", total: "210.00" },
    { id: "14", invdate: "2007-10-05", name: "test2", note: "note2",
      amount: "300.00", tax: "20.00", total: "320.00" },
    { id: "15", invdate: "2007-09-06", name: "test3", note: "note3",
      amount: "400.00", tax: "30.00", total: "430.00" },
    { id: "16", invdate: "2007-10-04", name: "test",  note: "note",
      amount: "200.00", tax: "10.00", total: "210.00" },
    { id: "17", invdate: "2007-10-03", name: "test2", note: "note2",
      amount: "300.00", tax: "20.00", total: "320.00" },
    { id: "18", invdate: "2007-09-01", name: "test3", note: "note3",
      amount: "400.00", tax: "30.00", total: "430.00" }
];
grid.jqGrid({
    data: mydata,
    datatype: "local",
    colNames: ['Inv No', 'Date', 'Client', 'Amount', 'Tax', 'Total', 'Notes'],
    colModel: [
        { name:'id', index:'id', key:true, width:70, align:"right", sorttype:"int",
            formatter: function (cellvalue) {
                // the number 1  will be mapped to no color bar
                // the number 18 will be mapped to the color bar with 100% filled
                return gradientNumberFormat(cellvalue, "gradient1", 1, 18, 0, 100);
            }
        },
        { name:'invdate', index:'invdate', width:90, sorttype:"date" },
        { name:'name', index:'name', width:100 },
        { name:'amount', index:'amount', width:80, align:"right", sorttype:"float",
            formatter: function (cellvalue) {
                // the number 200 will be mapped to the 10% filled color bar
                // the number 400 will be mapped to the 90% filled color bar
                return gradientNumberFormat(cellvalue,"gradient2",200,400,10,90);
            }
        },
        { name:'tax', index:'tax', width:80, align:"right", sorttype:"float" },
        { name:'total', index:'total', width:80, align:"right", sorttype:"float" },
        { name:'note', index:'note', width:150, sortable:false }
    ],
    pager: '#pager',
    rowNum: 10,
    rowList: [5, 10, 20, 50],
    sortname: 'id',
    sortorder: 'desc',
    viewrecords: true,
    height: "100%",
    caption: "Numbers with gradient color"
});
grid.jqGrid('navGrid', '#pager',
            { add:false, edit:false, del:false, search:false, refresh:true });

更新: デモの実際のバージョンはこちらです。

于 2010-11-09T11:17:06.483 に答える
1

可能だと思いますが、ちょっとした計画といくつかの仮定が必要です。

仮定:

幅が 100px の数値列がある場合は、データ バーの幅を 10 にするように事前に決定します。(0, 10px, 20px, .... 100px)。これらのそれぞれは画像として保存することができます.素敵なグラデーションエンドビットも持つことができます:)

それらを 0.png、10.png、20.png、.... 100.png と呼びましょう。

アプローチは次のようなものになります。

  1. jQGridにそのことをさせ、グリッドなどをレンダリングします.
  2. 終了したらjQueryを起動して、データバーが必要な列を選択します
  3. 列ごとに
  4. 上の列の各セルについて
  5. 数値を見て、係数を掛けてスケールダウン/スケールアップします (列の最大値に基づく必要がある場合があります)。これにより、0 から 100 の間で 10 の倍数が得られます。
  6. このスケーリングされた値を取り、20 と言って、このセルの背景として 20.png を設定します。
  7. すすぎ、繰り返します:)
于 2010-11-09T11:16:19.867 に答える