PHPExcel স্বয়ংক্রিয় আকারের কলাম প্রস্থ


104

আমি আমার পত্রকের কলামগুলিকে স্বয়ংক্রিয় আকার দেওয়ার চেষ্টা করছি। আমি ফাইলটি লিখছি এবং শেষ পর্যন্ত আমি আমার সমস্ত কলামকে পুনরায় আকার দেওয়ার চেষ্টা করব।

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('B1', 'test1111111111111111111111')
            ->setCellValue('C1', 'test1111111111111')
            ->setCellValue('D1', 'test1111111')
            ->setCellValue('E1', 'test11111')
            ->setCellValue('F1', 'test1')
            ->setCellValue('G1', 'test1');

foreach($objPHPExcel->getActiveSheet()->getColumnDimension() as $col) {
    $col->setAutoSize(true);
}
$objPHPExcel->getActiveSheet()->calculateColumnWidths();

উপরের কোডটি কাজ করে না। পাঠ্যের সাথে মানিয়ে নিতে কলামের আকার পরিবর্তন করে না

আপডেট আমি লেখক ব্যবহার করছি$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

উত্তর:


198

যদি কোনও কলাম অটোসাইজে সেট করা থাকে, পিএইচপিইএক্সেল কলামের গণিত মানের (কোনও সূত্রের ফলাফলের ভিত্তিতে) এবং হাজার বিভাজকের মতো বিন্যাসের মুখোশ যুক্ত যে কোনও অতিরিক্ত অক্ষরগুলির ভিত্তিতে কলামের প্রস্থ গণনা করার চেষ্টা করে।

ডিফল্টরূপে, এটি একটি estimatedপ্রস্থ: জিডি ব্যবহারের উপর ভিত্তি করে আরও সঠিক গণনা পদ্ধতি উপলভ্য, যা ফন্ট শৈলীর বৈশিষ্ট্য যেমন বোল্ড এবং ইটালিক পরিচালনা করতে পারে; তবে এটি অনেক বড় ওভারহেড, সুতরাং এটি ডিফল্টভাবে বন্ধ করা আছে। আপনি আরও সঠিক গণনা ব্যবহার করে সক্ষম করতে পারেন

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

তবে, অটোসাইজ সমস্ত রাইটার ফর্ম্যাটগুলিতে প্রয়োগ হয় না ... উদাহরণস্বরূপ সিএসভি V আপনি কোন লেখক ব্যবহার করছেন তা উল্লেখ করবেন না।

তবে আপনাকে মাত্রা নির্ধারণ করতে কলামগুলি সনাক্ত করতে হবে:

foreach(range('B','G') as $columnID) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)
        ->setAutoSize(true);
}

$objPHPExcel->getActiveSheet()->getColumnDimension() একটি কলাম আইডি আশা করে।

$objPHPExcel->getActiveSheet()->getColumnDimensions()সমস্ত সংজ্ঞায়িত কলামের মাত্রা রেকর্ডগুলির একটি অ্যারে প্রদান করবে; তবে যতক্ষণ না কলামের মাত্রা রেকর্ডটি স্পষ্টভাবে তৈরি করা হয়েছে (সম্ভবত কোনও টেম্পলেট লোড করে বা ম্যানুয়ালি কল করে getColumnDimension()) ততক্ষণ এটি উপস্থিত থাকবে না (মেমরি সঞ্চয়)।


তোমাকে অনেক ধন্যবাদ. এটা কাজ করে। এটি গা bold় ফন্ট থেকে তৈরি অতিরিক্ত ব্যবধান গণনা করে না, যদিও এটি প্রত্যাশিত (আমি এটি কোথাও পড়েছি)। এটিও অন্তর্ভুক্ত করার জন্য আপনি কি নিজের উত্তর আপডেট করতে পারবেন?
অ্যালকিস কালোগেরিস

4
আপনার যদি টাইপফেস স্টাইল যেমন বোল্ড বা ইটালিকের সাথে সেই ডিগ্রি নির্ভুলতার প্রয়োজন হয় তবে আপনার পিএইচপিইএক্সসেল_শ্রেড_ফন্ট :: অটোসিআইজেড_মিথড_এক্সএসিটি ব্যবহার করা দরকার, তবে এটি অনেক ধীর
মার্ক বেকার

ঠিক আছে আমি পাত্তা দিই না। যদিও আমি এটি করতে জানি না। আমি টেস্ট ফোল্ডারটি থেকে 01simple-download-xls.php ব্যবহার করছি। আমি কোথায় এই লাইন যুক্ত করব? আমার সম্পূর্ণ noobness জন্য দুঃখিত। আমি সবেমাত্র এটি নিয়ে খেলতে শুরু করেছি।
অ্যালকিস কালোগেরিস

4
এছাড়াও, আপনি যদি কলামের অক্ষরগুলি অনুসারে পুনরাবৃত্তি করতে না চান তবে সূচকগুলির পরিবর্তে আপনি স্থায়ী পদ্ধতি পিএইচপিএক্সেল_সেল :: স্ট্রিংফ্রমকলামিনডেক্স ($ কলামইন্ডেক্স) কলামের চিঠি পেতে ব্যবহার করতে পারেন
মিটপপিকল

@ মার্কবেকার একটি একক বিবৃতি দেওয়ার জন্য কি এমন কোন পদ্ধতি উপলব্ধ রয়েছে যাতে আমরা একটি তালিকায় প্রদত্ত কলামগুলির প্রস্থ নির্ধারণ করতে পারি? বর্তমানে আমি $ অ্যাক্টিভীট শীটঅবজ-> গিফল কলামডাইমেনশন ('জি') -> সেটউইথ (35) ব্যবহার করছি; তালিকার কলামগুলি কোনও ক্রম হতে পারে।
রোজা মাইস্টিকা

55

আপনার যদি প্রতিটি শিটের একাধিক পত্রক এবং একাধিক কলামে এটি করার দরকার হয় তবে আপনি সেগুলির মাধ্যমে কীভাবে পুনরাবৃত্তি করতে পারেন তা এখানে:

// Auto size columns for each worksheet
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {

    $objPHPExcel->setActiveSheetIndex($objPHPExcel->getIndex($worksheet));

    $sheet = $objPHPExcel->getActiveSheet();
    $cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(true);
    /** @var PHPExcel_Cell $cell */
    foreach ($cellIterator as $cell) {
        $sheet->getColumnDimension($cell->getColumn())->setAutoSize(true);
    }
}

7
এটি আরও ভাল সমাধান, যেহেতু জেড এর অতীতের কলামগুলির জন্য এটি বিশেষ বিবেচনার প্রয়োজন নেই
অ্যান্টনি

4
আমি নিশ্চিত করতে পারি যে এই উত্তরটি পিএইচপিস্প্রেডশীটেও নির্বিঘ্নে কাজ করে। অসংখ্য ধন্যবাদ!
Hissvard

$worksheet->getColumnIterator()জিনিসগুলি এখানে সরল করতে ব্যবহার করুন। আমার উত্তর দেখুন
BARNZ

25

এখানে @ মার্ক বেকার পোস্টের ভিত্তিতে আরও নমনীয় বৈকল্পিক:

foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
        $phpExcelObject->getActiveSheet()
                ->getColumnDimension($col)
                ->setAutoSize(true);
    } 

আশাকরি এটা সাহায্য করবে ;)


14
এটি কেবল জেড অবধি কাজ করে, কারণ range('A', 'AB')কেবল 'এ' নামের একটি আইটেম ফিরে আসবে। সুতরাং range()এই ক্ষেত্রে ব্যবহার করা ভাল ধারণা নয়!
মাইকেল 14

7
যদিও এটি কাজ করে: ($ i = 'A'; $ i! = $ PhpExcelObject-> getActiveSheet () -> getHighest Column (); $ i ++) {$ workheet-> getColumnDimesion ($ i) -> setAutoSize (TRUE) এর জন্য; ।
নাথান

এটি ব্যবহার করবেন না। দয়া করে আমার উত্তরটি দেখুন$sheet->getColumnIterator()
বার্নজেড

16
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}

4
ভাল উত্তর তবে $i <= $objPHPExcel->getActiveSheet()->getHighestColumn()অন্যথায় শেষ কলামটি আকার হতে পারে না
বিিলনোহ

10

ওয়ার্কশিট থেকে সমস্ত কলাম কীভাবে ব্যবহার করবেন এটি উদাহরণস্বরূপ:

$sheet = $PHPExcel->getActiveSheet();
$cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
$cellIterator->setIterateOnlyExistingCells( true );
/** @var PHPExcel_Cell $cell */
foreach( $cellIterator as $cell ) {
        $sheet->getColumnDimension( $cell->getColumn() )->setAutoSize( true );
}

4
কীভাবে এটি সমস্যার সমাধান করে তা বোঝাতে দয়া করে আপনার উত্তরের আশেপাশে কিছু প্রসঙ্গ যুক্ত করুন
অ্যান্ড্রু স্টবস

7

পিপিএস স্প্রেডশিটের জন্য:

$sheet = $spreadsheet->getActiveSheet(); // $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet

foreach (
    range(
         1, 
         Coordinate::columnIndexFromString($sheet->getHighestColumn(1))
    ) as $column
) {
    $sheet
          ->getColumnDimension(Coordinate::stringFromColumnIndex($column))
          ->setAutoSize(true);
}

foreach (range('A', $sheet->getHighestDataColumn()) as $column) {$sheet->getColumnDimension($column)->setAutoSize(true);}
ওয়েসলি অ্যাবেনহুইস

4
@ ওয়েসলি আবেদেনহুই আপনার মন্তব্য কেবল তখনই কাজ করবে যখন ২ 26 টির বেশি কলাম নেই। যখন সর্বোচ্চ কলামটি উদাহরণস্বরূপ: 'এএইচ' ব্যাপ্তি ফাংশনটি সঠিকভাবে কাজ করবে না।
Sander ভ্যান কের

6

এই কোড স্নিপেট সমস্ত শিটের ডেটাযুক্ত সমস্ত কলামকে স্বয়ংক্রিয় আকার দেবে। অ্যাক্টিভশিট গেটর এবং সেটার ব্যবহার করার দরকার নেই।

// In my case this line didn't make much of a difference
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
// Iterating all the sheets
/** @var PHPExcel_Worksheet $sheet */
foreach ($objPHPExcel->getAllSheets() as $sheet) {
    // Iterating through all the columns
    // The after Z column problem is solved by using numeric columns; thanks to the columnIndexFromString method
    for ($col = 0; $col <= PHPExcel_Cell::columnIndexFromString($sheet->getHighestDataColumn()); $col++) {
        $sheet->getColumnDimensionByColumn($col)->setAutoSize(true);
    }
}

3

যদি কেউ এই জন্য সন্ধান করছিল।

নীচের রেজোলিউশনটি PHPSpreadsheetতাদের পিএইপপিএক্সসেলের নতুন সংস্করণেও কাজ করে ।

// assuming $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet
// assuming $worksheet = $spreadsheet->getActiveSheet();
foreach(range('A',$worksheet->getHighestColumn()) as $column) {
    $spreadsheet->getColumnDimension($column)->setAutoSize(true);
}

দ্রষ্টব্য: শেষ প্রকৃত কলামটি getHighestColumn()দিয়ে getHighestDataColumn()বা প্রতিস্থাপন করা যেতে পারে ।

এই পদ্ধতিগুলি কী করে:

getHighestColumn($row = null) - সর্বাধিক কার্যপত্রক কলাম পান।

getHighestDataColumn($row = null) - ডেটাযুক্ত সর্বাধিক ওয়ার্কশিট কলাম পান।

getHighestRow($column = null) - সর্বাধিক ওয়ার্কশিট সারি পান

getHighestDataRow($column = null) - সর্বোচ্চ কর্মশীট সারি পান যাতে ডেটা থাকে।



2

যদি আপনি সাথে for ($col = 2; $col <= 'AC'; ++ $col){...}বা এর সাথে পুনরাবৃত্তি করার চেষ্টা করেনforeach(range('A','AC') as $col) {...} এটির এটির এ থেকে জেড পর্যন্ত কলামগুলির জন্য কাজ করা হয় তবে এটি Z ব্যর্থ হয় (উদাহরণস্বরূপ 'A' থেকে 'AC' এর মধ্যে পুনরাবৃত্তি)।

পাস 'জেড' এর পুনরাবৃত্তি করতে, আপনাকে কলামটি পূর্ণসংখ্যায়, বৃদ্ধি, তুলনা করতে হবে এবং এটি আবার স্ট্রিং হিসাবে পেতে হবে:

$MAX_COL = $sheet->getHighestDataColumn();
$MAX_COL_INDEX = PHPExcel_Cell::columnIndexFromString($MAX_COL);
    for($index=0 ; $index <= $MAX_COL_INDEX ; $index++){
    $col = PHPExcel_Cell::stringFromColumnIndex($index);

    // do something, like set the column width...
    $sheet->getColumnDimension($col)->setAutoSize(TRUE);
}

এটির সাহায্যে আপনি সহজেই পুনরাবৃত্তিগুলি 'জেড' কলামটি পাস করতে পারবেন এবং প্রতিটি কলামে স্বতঃসীমা সেট করুন।


1

দেরিতে আসুন, তবে সর্বত্র অনুসন্ধানের পরে, আমি একটি সমাধান তৈরি করেছি যা "এক" বলে মনে হচ্ছে।

সর্বশেষ এপিআই সংস্করণগুলিতে একটি কলাম পুনরাবৃত্তকারী রয়েছে তা জানা, কিন্তু কলামটি কীভাবে এটি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করা যায় তা জানেন না, মূলত আমি আসল প্রথম ব্যবহৃত কলাম থেকে রিয়েল শেষ ব্যবহৃত কলামে যাওয়ার জন্য একটি লুপ তৈরি করেছি।

এখানে এটা যায়:

//Just before saving de Excel document, you do this:

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

//We get the util used space on worksheet. Change getActiveSheet to setActiveSheetIndex(0) to choose the sheet you want to autosize. Iterate thorugh'em if needed.
//We remove all digits from this string, which cames in a form of "A1:G24".
//Exploding via ":" to get a 2 position array being 0 fisrt used column and 1, the last used column.
$cols = explode(":", trim(preg_replace('/\d+/u', '', $objPHPExcel->getActiveSheet()->calculateWorksheetDimension())));

$col = $cols[0]; //first util column with data
$end = ++$cols[1]; //last util column with data +1, to use it inside the WHILE loop. Else, is not going to use last util range column.
while($col != $end){
    $objPHPExcel->getActiveSheet()->getColumnDimension($col)->setAutoSize(true);

    $col++;
}

//Saving.
$objWriter->save('php://output');

1
// Auto-size columns for all worksheets
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
    foreach ($worksheet->getColumnIterator() as $column) {
        $worksheet
            ->getColumnDimension($column->getColumnIndex())
            ->setAutoSize(true);
    } 
}

1

এই সমস্ত উত্তর কাইন্ডা স্তন্যপান ... ব্যাপ্তি ব্যবহার করবেন না () এটি কলাম Z এর বাইরে কাজ করবে না।

সহজভাবে ব্যবহার করুন:

$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getColumnIterator() as $column) {
    $sheet->getColumnDimension($column->getColumnIndex())->setAutoSize(true);
}

আপনি আপনার ডেটা লেখার পরে এটি করুন যাতে কলাম পুনরাবৃত্তকারী জানতে পারে যে কয়টি কলাম পুনরাবৃত্তি হবে।


0

মাত্রা নির্ধারণ করতে আপনাকে কলামগুলি সনাক্ত করতে হবে:

foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject
        ->getActiveSheet()
        ->getColumnDimension($col)
        ->setAutoSize(true);
}

0
$col = 'A';
while(true){
    $tempCol = $col++;
    $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
    if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
        break;
    }
}

4
দয়া করে আপনার উত্তরটি পুনরায় ফর্ম্যাট করুন এবং এটি সম্পর্কে ভাবেন: একটি উত্তরের উত্তরটি সর্বদা কেবল ওপি-র জন্যই নয়, ভবিষ্যতে এসওতে আগত দর্শকদের জন্য কী করা হয়েছিল এবং কেন এটি এমনভাবে করা হয়েছিল তার একটি ব্যাখ্যা থাকবে always
বি 001 ᛦ

0

Spreedsheet + + পিএইচপি 7 জন্য, আপনি পরিবর্তে লিখতে হবে PHPExcel_Cell::columnIndexFromString, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString। এবং লুপটি একটি ভুল, সেখানে আপনাকে অবশ্যই <কাজ করা উচিত নয় <=। অন্যথায়, তিনি একটি কলামটি লুপের মধ্যে নিয়ে যান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.