2011-04-07 15 views
25

मैं एक्सेल वर्कशीट कॉलम पर आधारित लूप कैसे कर सकता हूं? मैंने पाया (और प्रयुक्त) वर्कशीट इटरेटर, रोइटरेटर और सेलइटरेटर लेकिन कॉलम के बारे में कुछ भी नहीं।PHPExcel कॉलम लूप

उत्तर

70

कोई कॉलम इटरेटर नहीं है, इसलिए आपको इसे हाथ से करना होगा।

किसी भी कार्यपत्रक के लिए:

एक स्तंभ के लिए पाश पंक्तियों के लिए:

$column = 'A'; 
$lastRow = $worksheet->getHighestRow(); 
for ($row = 1; $row <= $lastRow; $row++) { 
    $cell = $worksheet->getCell($column.$row); 
    // Do what you want with the cell 
} 

एक पंक्ति में पाश स्तंभों के लिए, आप PHP के पर्ल्स शैली पात्रों को बढ़ाने के लिए क्षमता का लाभ ले सकते हैं:

$row = 1; 
$lastColumn = $worksheet->getHighestColumn(); 
$lastColumn++; 
for ($column = 'A'; $column != $lastColumn; $column++) { 
    $cell = $worksheet->getCell($column.$row); 
    // Do what you want with the cell 
} 

ध्यान दें कि जब स्तंभ पत्र की तुलना पाश में अंतिम स्तंभ के लिए परीक्षण करने के लिए, हम बस < या < = उपयोग नहीं कर सकते क्योंकि हम स्ट्रिंग की तुलना कर रहे हैं, और "बी"> "एजेड" मानक स्ट्रिंग तुलना में, इसलिए हम एक = = तुलना का उपयोग करते हैं, जो अंत बिंदु से पहले कॉलम आईडी देने के लिए उच्चतम कॉलम मान बढ़ाता है।

तुम भी इटरेटर getIterateOnlyExistingCells अनुकरण करने के लिए getCell() (या नहीं) का उपयोग करते हुए यह तक पहुँचने() व्यवहार

से पहले पाश में

$worksheet->cellExists($column.$row); 

उपयोग कर सकते हैं एक सेल के अस्तित्व के लिए परीक्षण करने के लिए Iterators वास्तव में काफी धीमी हैं, तो आप अच्छी तरह से इन सरल loops iterators का उपयोग करने से तेज हो सकता है।

अद्यतन (2015-05-06)

PHPExcel संस्करण 1.8.1 एक नया कॉलम इटरेटर शुरू की है। पंक्ति और स्तंभ iterators भी जब सीमा के रूप में

+8

मैं एक अंकीय पाने के लिए कोशिश कर रहा था है पाने के लिए अनुमति देता है कॉलम के लिए मूल्य। मैं PHP की चरित्र वृद्धि सुविधा को अवगत नहीं था। समाधान और इस साफ टिप के लिए धन्यवाद! – Hazar

+0

$ lastColumn = $ वर्कशीट-> getHighestColumn(); वापस आ रहा है बी एंड बी आखिरी भरा कॉलम है कृपया मदद करें। – Bugfixer

+1

ठीक है अगर 'बी' अंतिम भरा कॉलम है, तो आप 'getHighestColumn()' वापस आने की क्या अपेक्षा करते हैं? ऐसा लगता है कि –

4

पाश कॉलम के माध्यम से पाशन आप पंक्तियों या स्तंभों पुनरावृति करने की एक सीमा निर्दिष्ट करें, और आप पिछले() और अच्छी तरह से अगले के रूप में() का उपयोग करने की अनुमति के लिए अनुमति देता

foreach (range('A', $Excel->getActiveSheet()->getHighestColumn()) as $column_key) { 

} 
+2

वाह। मुझे सभी – realtebo

1

इसे आजमाएं! काम!

$limit = 10000; 
$value='sua mensagem' 
for($i=0,$j='A';$i<$limit;$i++,$j++) { 
    $objPHPExcel->setActiveSheetIndex(0) 
    ->setCellValue($j.$i, $value); 
} 

$ मूल्य में सेट करें जो आप प्रिंट करना चाहते हैं।

+1

पर 'रेंज' नहीं पता था, अगर आप सभी कोल्स का उपयोग करना चाहते हैं तो सीमा 16.384 में सेट करें। यह एक्सेल से एक सीमा है। परिवर्तनीय $ जे है (ए ... एएएएएएएए) और $ i (1 ... 1.048.576) है, आप कॉल लेटर के लिए केवल $ जे का उपयोग कर सकते हैं और नंबर ठीक कर सकते हैं: '-> setCellValue ($ j.'1 ', $ मूल्य); ' और $ मूल्य आप मूल्यों को पॉप्युलेट करने के लिए एक और लूप बना सकते हैं या डेटाबेस और/या डेटा फ़ाइल से डेटा डाल सकते हैं। –

7

यह छोटा स्निपेट स्तंभों की पंक्तियों के माध्यम से लूप प्रदान करता है। यह पिछले गैर खाली कॉलम (और इसकी पंक्ति) और सूचकांक में लूप की अनुक्रमणिका प्राप्त करता है, इसलिए एक्सेल में भूल गए मानों से अवगत रहें।

कोड स्तंभ A का सोचा पंक्तियों लूप होता है, तो स्तंभ बी की पंक्तियों ...

$objReader = new PHPExcel_Reader_Excel2007(); 
$objReader->setReadDataOnly(true); 
$objPHPExcel = $objReader->load($file); 

foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) 
{ 
    $worksheetTitle = $worksheet->getTitle(); 
    $highestColumn = $worksheet->getHighestColumn(); 
    $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); 

    // expects same number of row records for all columns 
    $highestRow = $worksheet->getHighestRow(); 

    for($col = 0; $col < $highestColumnIndex; $col++) 
    { 
     // if you do not expect same number of row records for all columns 
     // get highest row index for each column 
     // $highestRow = $worksheet->getHighestRow(); 

     for ($row = 1; $row <= $highestRow; $row++) 
     { 
      $cell = $worksheet->getCellByColumnAndRow($col, $row); 
      $val = $cell->getValue(); 
      // do what you want with cell value 
     } 
    } 
} 
0

यह पुनरावर्ती विधि डिजाइन किया गया था कॉलम का "पत्र", जो कुछ भी स्तंभों की संख्या प्राप्त करने के लिए अनुमति देता है आप , 'ए' से करने के लिए है "ZZZZZZZZZ ...":

function getColumnLetter($number) 
{ 
    $prefix = ''; 
    $suffix = ''; 
    $prefNum = intval($number/26); 
    if($prefNum > 25) 
    { 
     $prefix = getColumnLetter($prefNum); 
    } 
    $suffix = chr(fmod($number, 26)+65); 
    return $prefix.$suffix; 
} 

तो तुम पाश इंडेक्स नंबर पर एक PHP सरणी के स्तंभ और यह पत्र के एक सूत्र के PHPExcel तरीकों में बदलने और उपयोग कर सकते हैं यह, की तरह "setCellValue" ... लेकिन यदि आप उपयोग कर सकते हैं तो ऊपर दिए गए समाधान निश्चित रूप से तेज़ हैं उन्हें !

+1

PHPExcel के पास पहले से ही PHPExcel_Cell :: stringFromColumnIndex() – dctucker

+0

हां, 3 अक्षरों की सीमा के साथ एक सहायक विधि है। https://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Cell.php लाइन 790 –

+1

मुझे लगता है कि तीन-अक्षर सीमा व्यावहारिक सीमाओं से संबंधित है जैसे एक्सेल वर्कशीट में अधिकतम कॉलम (16,384)। तीन अक्षरों ए-जेड उस सीमा को कवर कर सकते हैं और फिर कुछ। क्या आप एक ऐसे केस की पहचान कर सकते हैं जहां चार-अक्षर कॉलम नाम आवश्यक है? – dctucker

1

यह अंतिम संदेश की getColumnLetter विधि के लिए ठीक है, यह आप स्तंभों की "पत्र", जो कुछ भी स्तंभों की संख्या आप

function getColumnLetter($number){ 
    $prefix = ''; 
    $suffix = ''; 
    $prefNum = intval($number/26); 
    if($number > 25){ 
     $prefix = getColumnLetter($prefNum - 1); 
    } 
    $suffix = chr(fmod($number, 26)+65); 
    return $prefix.$suffix; 
} 
संबंधित मुद्दे