2010-11-09 49 views
6

我一般不喜歡使用Excel和Microsoft產品,但Excel 2007/2010有一些非常好的條件格式化功能,可惜,迄今爲止我還沒有在其他許多地方看到過。其中一個我在商業報告中廣泛使用的是數據欄。 http://blogs.msdn.com/b/excel/archive/2009/08/07/data-bar-improvements-in-excel-2010.aspxjqGrid中的單元格內數據條 - 可能與否?

在我看來,這些數據條對理解超出數字的數據的含義非常有幫助。雖然200和2000用戶之間的差異只是人眼難以掌握的數字,但是長10倍的酒吧更直觀。

我的問題:是否有任何方法來包含jqGrid中列的每個值的單元格內條件數據欄,鏡像Excel功能?這將是我看到擺脫我們的Excel表格並在線報告系統中實施報告的唯一方法。一旦習慣了數據條,數據條就不可或缺,而且他們是我們仍然使用Excel進行報表的唯一原因。

如果我假設在jqGrid中沒有像這樣的內置功能,那麼您是否認爲自定義構建它會有很多工作?你有什麼想法是最好的辦法來解決這個問題嗎?

回答

9

它是關於你在你的問題寫了Excel的一個有趣的功能。我以前不知道這件事。

你需要的是實現一個custom formater函數。一般來說很容易。你應該編寫一個小函數來顯示基於值的單元格(顏色欄上的文本)。此外,你應該定義Unformatting custom function這將是非常容易的在你的情況。可以在排序和其他jqGrid操作期間使用unformating函數,其中需要從網格單元獲取值。

所以你的問題可以減少到在顏色欄上顯示數字。

已更新:我一次又一次地談論你的問題,因爲我發現使用顏色格式化數字可能會非常有幫助。所以我花了一些時間,創建了產生以下結果

alt text

,並可以現場here可以看到相應的代碼示例。

對代碼的小意見。我不得不創建其產生的任何現有的瀏覽器以外歌劇漸變欄是格柵被視爲

alt text

的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 }); 

修訂:演示的實際版本是here

+0

謝謝,這很有幫助。我仍然不確定格式化函數的作用是什麼來生成數據欄。 – 2010-11-09 11:39:14

+0

@M。 Cypher:可能我會稍後爲你創建一個演示示例。 – Oleg 2010-11-09 19:19:53

+0

@M。 Cypher:我對你很新。看看我更新的答案。 – Oleg 2010-11-13 16:24:44

1

我認爲這是可能的,但有一點規劃和一些假設。

假設:

如果你有一個數字與列的寬度,可以說100像素,然後做出預確定決定,有10米可能的數據條的寬度。 (0,10px,20px,... 100px)。這些每一個都可以被保存爲圖片,你可以有你漂亮的漸變結束有點太:)

讓我們稱之爲0.png,10.png,20.png,.... 100.png

現在的做法是沿着這些路線的東西:

  1. 的jqGrid讓我們做它的東西,使電網等
  2. 消防jQuery的一些一旦其最終挑選出你想要的數據條
  3. 對於列每列
  4. 對於上面列中的每個單元格
  5. 查看數值,並通過乘以因子(可能需要基於列中的最大值)將其縮小/向上,以便在0和0之間得到10的倍數100
  6. 取這個縮放值,讓我們說20並設置20.png作爲這個單元格的背景。
  7. 沖洗和重複:)
+0

這無疑是一個好的開始。不過,我認爲我更喜歡基於CSS或JS的解決方案,因爲我希望使用數據欄(1)來顯示不同長度的列,(2)使用像素完美寬度,而不是10px-steps。能夠調整列大小並使數據欄自動調整其寬度也是很好的。 – 2010-11-09 11:37:26

+0

我認爲這也可以通過使用類似的邏輯來實現,但是將實際圖像插入到單元格中,並且通過百分比而不是單位來改變其寬度。需要絕對定位/ z-index來確保文本位於數據欄圖像的頂部。 – 2010-11-09 22:35:36

相關問題