2010-11-09 8 views
6

मुझे आम तौर पर एक्सेल और माइक्रोसॉफ्ट उत्पादों का उपयोग करना पसंद नहीं है, लेकिन एक्सेल 2007/2010 में कुछ बहुत ही सशर्त स्वरूपण विशेषताएं हैं, दुख की बात है, मैंने अब तक कई अन्य स्थानों में नहीं देखा है। इनमें से एक जो मैं व्यवसाय रिपोर्ट में बड़े पैमाने पर उपयोग करता हूं वह डेटा बार है। http://blogs.msdn.com/b/excel/archive/2009/08/07/data-bar-improvements-in-excel-2010.aspxjqGrid में सेल डेटा बार - संभव है या नहीं?

मेरी राय में, इन डेटा बार संख्याओं से परे डेटा के अर्थ को समझने में बेहद सहायक हैं। जबकि 200 से 2000 उपयोगकर्ताओं के बीच अंतर मानव आंखों के लिए एक कठिन-समझने वाला अंक है, एक बार जो 10 गुना लंबा है, वह अधिक सहज है।

मेरा प्रश्न: क्या एक्सेल कार्यक्षमता को प्रतिबिंबित करते हुए, jqGrid में कॉलम के प्रत्येक मान के लिए सेल सशर्त डेटा बार शामिल करने का कोई तरीका है? यह एकमात्र तरीका होगा जो मैं अपने एक्सेल शीट से छुटकारा पाने और ऑनलाइन रिपोर्टिंग सिस्टम में रिपोर्ट को लागू करने के लिए देखता हूं। एक बार जब आप उन्हें उपयोग करते हैं तो डेटा बार केवल अनिवार्य होते हैं, और वे एकमात्र कारण हैं जिन्हें हम अभी भी एक्सेल का उपयोग रिपोर्ट के लिए करते हैं।

यदि, मुझे लगता है कि, jqGrid में इस तरह की कोई अंतर्निहित कार्यक्षमता नहीं है, तो क्या आपको लगता है कि यह कस्टम-निर्माण के लिए बहुत काम करेगा? क्या आपके पास कोई विचार है कि इस तक पहुंचने का सबसे अच्छा तरीका क्या होगा?

उत्तर

9

यह जिसके बारे में आप अपने प्रश्न में लिखा एक्सेल का एक दिलचस्प सुविधा है। मुझे पहले इसके बारे में पता नहीं है।

आपको custom formater फ़ंक्शन को लागू करने की आवश्यकता है। सामान्य में बहुत आसान है। आपको एक छोटा सा फ़ंक्शन लिखना चाहिए जो सेल को मूल्य (रंग बार पर टेक्स्ट) के आधार पर प्रदर्शित करता है। इसके अलावा आपको Unformatting custom function भी परिभाषित करना चाहिए जो आपके मामले में बहुत आसान होगा। अनौपचारिक फ़ंक्शन का उपयोग सॉर्टिंग और अन्य jqGrid ऑपरेशन के दौरान किया जा सकता है जहां किसी को ग्रिड सेल से मूल्य प्राप्त करने की आवश्यकता होती है।

तो आपकी समस्या को रंग बार पर संख्या प्रदर्शित करने के लिए कम किया जा सकता है।

अद्यतन: हालांकि मैं आपके प्रश्न के बारे में बार-बार हूं क्योंकि मुझे लगता है कि संख्याओं के निर्माण के लिए रंगों का उपयोग वास्तव में सहायक हो सकता है। तो मैं कुछ समय बिताने और इसी कोड उदाहरण जो निम्न परिणाम

alt text

उत्पादन और जीने here देखा जा सकता है बनाया।

कोड पर छोटी टिप्पणियां।

.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: मैं कुछ सीएसएस वर्ग है जो ओपेरा को छोड़कर किसी भी वर्तमान ब्राउज़रों में ढाल बार जहां ग्रिड

alt text

सीएसएस वर्ग के रूप में देखा जाता है निम्नलिखित के रूप में परिभाषित कर रहे हैं उत्पादन बनाने के लिए किया था $(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 }); 

UPDATED: डेमो का वास्तविक संस्करण here है।

+0

धन्यवाद, यह सहायक है। मैं अभी भी अनिश्चित हूं हालांकि डेटा बार उत्पन्न करने के लिए वास्तव में स्वरूपण फ़ंक्शन क्या करेगा। –

+0

@ एम। साइफर: शायद मैं थोड़ी देर बाद आपके लिए डेमो उदाहरण तैयार करूंगा। – Oleg

+0

@ एम। साइफर: मेरे पास आपके लिए नया नया है। मेरे अद्यतन उत्तर को देखो। – Oleg

1

मुझे लगता है कि यह संभव है, लेकिन छोटी योजना और कुछ मान्यताओं के साथ।

अनुमान:

आप की चौड़ाई के साथ एक संख्यात्मक स्तंभ है, तो कहते हैं कि 100px की सुविधा देता है, तो एक पूर्व 10 संभव डेटा बार की चौड़ाई के लिए निर्धारित निर्णय करते हैं। (0, 10 पीएक्स, 20 पीएक्स, .... 100 पीएक्स)। इनमें से प्रत्येक छवियों के रूप में सहेजा जा सकता है, आप अपने अच्छा ढाल अंत बिट भी हो सकता है :)

उन्हें 0.png, 10.png, 20.png, फोन की सुविधा देता है .... 100.png

अब दृष्टिकोण इन पंक्तियों के साथ कुछ होगा:

  1. Let jQGrid अपने काम करते हैं, ग्रिड प्रस्तुत करना आदि
  2. आग कुछ jQuery एक बार अपने समाप्त कॉलम जहां डेटा सलाखों
  3. के लिए चाहते हैं चुन प्रत्येक कॉलम
  4. उपरोक्त कॉलम में प्रत्येक सेल के लिए
  5. संख्यात्मक मान को देखें और इसे एक कारक द्वारा गुणा करके इसे नीचे/ऊपर स्केल करें (इसे कॉलम में सबसे बड़े मान पर आधारित होना आवश्यक हो सकता है) ताकि आपको 0 के बीच 10 में से एक मिल सके और 100
  6. इस स्केल किए गए मान को लें, 20 कहें और इस सेल के लिए पृष्ठभूमि के रूप में 20.png सेट करें।
  7. रिंस और दोहराने :)
+0

यह निश्चित रूप से एक अच्छी शुरुआत है। हालांकि मुझे लगता है कि मैं एक सीएसएस या जेएस-आधारित समाधान पसंद करूंगा, क्योंकि मैं अलग-अलग लंबाई के कॉलम के लिए डेटा बार (1) और (2) पिक्सेल-पूर्ण चौड़ाई के साथ 10px-चरणों के विपरीत उपयोग करना चाहता हूं। कॉलम का आकार बदलने में सक्षम होना भी अच्छा होगा और डेटा बार स्वचालित रूप से अपनी चौड़ाई समायोजित कर सकते हैं। –

+0

मुझे लगता है कि यह एक समान तर्क का उपयोग करके भी हासिल किया जा सकता है, लेकिन सेल में वास्तविक छवि डालने और इसकी चौड़ाई को एक प्रतिशत तक बदलना, इकाई नहीं। डेटा पट्टी की छवि के शीर्ष पर पाठ रहता है यह सुनिश्चित करने के लिए पूर्ण स्थिति/जेड-इंडेक्स की आवश्यकता होगी। –