2012-06-07 16 views
28

मैं PHPExcel के साथ डाउनलोड करने के लिए डेटा निर्यात करने के लिए काम कर रहा हूं। जब डाउनलोड की गई फ़ाइलें खोलें, सेल के साथ बड़ी संख्या में, यह मूल्य संख्या के बजाय "#######" दिखाता है। मुझे प्रत्येक कॉलम के लिए setAutoSize() आज़माया गया है, फिर $sheet->calculateColumnWidths() पर कॉल करें लेकिन यह अभी भी नहीं बदलेगा। मैं गणना करता हूं कॉलमविड्थ() at here, @ मार्क बेकर का कहना है, "गणना कॉलमविड्थ() मूल्य को 5% तक बढ़ाकर यह सुनिश्चित करने के लिए कि पूरा कॉलम फिट बैठता है"। सेल में संख्या की लंबाई 5% से अधिक है, यह संकल्प लिया की समस्या doen लगताPHPExcel कैसे ऑटो-कॉलम चौड़ाई सेट करें

अद्यतन यह ऑटो आकार कॉलम करने के लिए अपने कार्य है:

function autoFitColumnWidthToContent($sheet, $fromCol, $toCol) { 
     if (empty($toCol)) {//not defined the last column, set it the max one 
      $toCol = $sheet->getColumnDimension($sheet->getHighestColumn())->getColumnIndex(); 
     } 
     for($i = $fromCol; $i <= $toCol; $i++) { 
      $sheet->getColumnDimension($i)->setAutoSize(true); 
     } 
     $sheet->calculateColumnWidths(); 
    } 
+0

आप किस ऑटोोज़ाइज़ विधि को गणना के लिए आवेदन कर रहे हैं? लगभग या सटीक? क्या आप किसी विशेष फ़ॉन्ट का उपयोग कर रहे हैं? या बोल्ड/इटालिक स्टाइल? आंकड़ा कितनी दूर गणना की जाती है? शायद 10% जोड़ना 5% से बेहतर होगा। –

+0

@ मार्कबकर मैंने अपने प्रश्न के लिए उदाहरण कोड अपडेट किया है। मैंने ColumnDimension कक्षा के setAutoSize() का उपयोग किया। – Davuz

उत्तर

28

पहले संभावित समस्या हो सकती है कि आप के साथ काम कर रहे हैं कॉलम अक्षर PHP का incrementor ऑपरेशन कॉलम अक्षरों के साथ काम करेगा, इसलिए यदि मैं $ 'ए' हूं, तो $ i ++ 'बी' देगा, और यदि $ i i ++ से $ Z '' 'है तो' एए 'देगा; लेकिन आप < = अपने तुलनित्र के रूप में उपयोग नहीं कर सकते हैं, क्योंकि 'एए' < = 'Z' है जब सीधे तुलना के रूप में निष्पादित किया जाता है।

इसके बजाय

for($i = $fromCol; $i <= $toCol; $i++) { 

के उपयोग

$toCol++; 
for($i = $fromCol; $i !== $toCol; $i++) { 

बुला $ शीट-> calculateColumnWidths के बाद 5% मार्जिन को जोड़ने के लिए() कार्य करें:

for($i = $fromCol; $i !== $toCol; $i++) { 
    $calculatedWidth = $sheet->getColumnDimension($i)->getWidth(); 
    $sheet->getColumnDimension($i)->setWidth((int) $calculatedWidth * 1.05); 
} 
+0

धन्यवाद! मैं 'setWidth ((int) $ गणना Width * 1.4) का उपयोग करता हूं;' 16 अंकों को फिट करने के लिए। यह अच्छा काम करता है, लेकिन मुझे उम्मीद है कि एक फ़ंक्शन ऑटो पूरी तरह से गणना की जाएगी और कॉलम चौड़ाई ^^ सेट करें। – Davuz

+1

@Panique यह मेरे साथ काम करता है। आप इस 'setWidth ((int) $ गणना Width * 1.4) का प्रयास कर सकते हैं; ', 1.4 को एक बड़े मान, 1.6 या 1.8 में बदलें ... – Davuz

+0

@ मैंने अपनी टिप्पणी हटा दी क्योंकि समस्या मेरी तरफ थी। मैं वास्तव में क्षमा चाहता हूं और आपको सभी +1 देता हूं। शक्ति तुम्हारे साथ हो सकती है! – Sliq

0

सुझावों में से कोई भी काम किया मेरे लिए मैंने मैन्युअल गणना (बल्कि आसान और तेज़) (नमूना कोड निम्न) किया और पूरी तरह से काम करता है (नोट फोंट/सेंट yles डिफ़ॉल्ट हैं लेकिन अन्य फ़ॉन्ट या शैली के लिए समायोजित करना आसान होगा)

foreach((array)$data as $sheet_data) 
{ 
    $maxwidth = array(); 
    $objPHPExcel->setActiveSheetIndex($i++); 
    $sheet = $objPHPExcel->getActiveSheet(); 

    if (!empty($sheet_data['title'])) 
     $sheet->setTitle($sheet_data['title']); 

    if (!empty($sheet_data['rows'])) 
    { 
     foreach((array)$sheet_data['rows'] as $row=>$cols) 
     { 
      foreach((array)$cols as $col=>$val) 
      { 
       $p = strpos($col,':'); 
       if (false !== $p) 
       { 
        // range 
        $range = $col; $xy = substr($col, 0, $p); 
        $col = substr($xy,0,-1); 

        // estimate maximum column width by number of characters 
        $w = mb_strlen($val); 
        if (!isset($maxwidth[$col])) $maxwidth[$col] = $w; 
        elseif ($w > $maxwidth[$col]) $maxwidth[$col] = $w; 

        $sheet->mergeCells($range); 
        $sheet->setCellValue($xy, $val); 
        $sheet->getStyle($range) 
          ->getAlignment() 
          ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) 
          ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER) 
        ; 
       } 
       else 
       { 
        $xy = $col.$row; 

        // estimate maximum column width by number of characters 
        $w = mb_strlen($val); 
        if (!isset($maxwidth[$col])) $maxwidth[$col] = $w; 
        elseif ($w > $maxwidth[$col]) $maxwidth[$col] = $w; 

        $sheet->setCellValue($xy, $val); 
        $sheet->getStyle($xy) 
          ->getAlignment() 
          ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) 
          ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER) 
        ; 
       } 
      } 
     } 
    } 
    // autosize columns based on calculation + some padding 
    foreach($maxwidth as $col=>$width) 
    { 
     $sheet->getColumnDimension($col)->setAutoSize(false); 
     $sheet->getColumnDimension($col)->setWidth((int)($width * 1.2)); // add padding as well 
    } 
} 
संबंधित मुद्दे