Laravel-excel: Laravel 4.2 / Laravel-Excel 1.3: الأرقام المنسقة كنص لا تزال تظهر كرقم

تم إنشاؤها على ٣ ديسمبر ٢٠١٥  ·  38تعليقات  ·  مصدر: Maatwebsite/Laravel-Excel

لقد كنت ألعب بهذا الأمر لبضعة أيام ولكن ببساطة لا يمكنني إنجاحه. لدي بعض الأرقام الطويلة (16 رقمًا) المخزنة في قاعدة البيانات الخاصة بي والتي أستخدمها بعد ذلك وظيفة toArray () لإنشاء جدول بيانات xlsx excel الخاص بي. الكود الذي أستخدمه لتنسيق العمود:
$sheet->setColumnFormat(array( 'A' => '@' ));

ومع ذلك ، يتم عرض الأرقام في Excel كأرقام ويتم تقصيرها بالتدوين العلمي.

هل هناك أي شيء يمكنني القيام به حيال ذلك خارج إلحاق مسافة على كلا الجانبين؟

أنا على دراية بحد رقم اكسل المكون من 15 رقمًا ولكن عند التنسيق كنص كنت أؤمن بأن هذا لن يكون مشكلة.

التعليق الأكثر فائدة

excel $-> sheet ('staff'، function ($ sheet) use ($ data) {
$ sheet-> setColumnFormat (مصفوفة (
"H" => "@"،
)) ؛
$ sheet-> rows ($ data، true)؛
}) ؛

أتمنى أن يساعدك هذا ؛)

ال 38 كومينتر

نفس المشكلة هنا ، ولكن في حالتي هي سلاسل مكونة من 14 رقمًا.

إذا كنت ترغب في تجنب التدوين العلمي للأرقام الطويلة في Excel ، فأنت بحاجة إلى تعيين قناع تنسيق يعرض صراحة هذه القيم كأرقام ..... باستخدام @ هو ببساطة يخبر MS Excel باستخدام سلوكه الافتراضي (وهو استخدام التنسيق العلمي للأرقام الأطول) .... أقترح عليك استخدام قناع تنسيق #0 بدلاً من ذلك

حتى ذلك الحين لا يعمل. هذا ما جربته: $ sheet-> setColumnFormat (['id' => '# 0']) ؛. أظن أيضًا أن setColumnFormat لا تعمل بشكل جيد مع ملفات CSV منذ أن جربت عددًا من التنسيقات ولم يكن لها تأثير فعلي على تنسيق العمود.

لا أعرف ما إذا كان هذا يحدث فرقًا ، ومع ذلك ، كنت أستخدم $ sheet-> fromModel ($ result) ؛ وقد جربت $ sheet-> fromArray ($ result-> toArray ()) وقد أدى كلاهما إلى حدوث هذه المشكلة.

بالنسبة لأولئك الذين لديهم هذه المشكلة مع ملفات CSV ، قمت بإنشاء الطريقة التالية:

الوظيفة العامة getStringIdAttribute ()
{
إرجاع '= "". $ this-> id.' "'؛
}
وفي الجزء العلوي من نموذجي أضفت:
إلحاق محمي بالدولار = ['string_id'] ؛

وقد أدى ذلك إلى عرض الرقم كنص في Excel (بالإضافة إلى جداول بيانات Kingsoft).

إذا كنت تكتب إلى CSV وتستعرض عبر Excel ، فلن يخزن ملف CSV قناع التنسيق وسيعرض Excel النتيجة كرقم باستخدام تنسيقه الافتراضي (علميًا للقيمة الأكبر) ..... تحقق دائمًا من أي ملف CSV باستخدام محرر نصوص

حاولت تصدير الملف باستخدام "# 0" كتنسيق عمود ولكنه يحول الرقم الأخير إلى 0. إذا كان @ هو المعرف "الافتراضي" ، فكيف يمكنني إدراج الخلية كنص فقط حتى لا يلمس برنامج Excel أي شيء ؟

حاليًا يتم تصدير الحل البديل من laravel-excel كملف csv ثم أستخدم برنامج نصي بيثون كتبته للتصدير بتنسيق xlsx حيث يبدو أن openpyxl قادر على التنسيق كنص بشكل صحيح.

هل هناك أي إصلاح لهذا السلوك؟ أقوم بالتصدير إلى XSLX من مجموعة حيث لدي سلاسل مثل "10E00" والتي يتم تصديرها كرقم "10" في Excel. setColumnFormat "@" لا يعمل لدي ...

lachyn لم أجد

@ lszanto لكن هذا غريب ، حتى لو قمت بتصديره إلى "CSV" لدي قيمة "10" بدلاً من "10E00" ، وأنا متأكد من أن في المصفوفة سلسلة "10E00" ....

lachyn بماذا تفتح ملف CSV؟ إذا كان مجرد محرر نصوص ، فربما يلامس Laravel شيئًا آخر حيث يجب أن يكون CSV هو الناتج الخام فقط ، ولا توجد معدِّلات أو أي شيء.

إذا كنت تريد والبيانات ليست خاصة ، يمكنك نشر عينة وسأعطيها عندما تسنح لي الفرصة.

@ lszanto محرر نصوص سامية ...
أقوم بإجراء استعلام باستخدام toArray () في النهاية. إذا قمت بتفريغ هذا المصفوفة ، فسيكون مع "10E00" ، بعد التصدير ... "10". يتم التصدير من هذه المصفوفة ، لذلك يتم تنفيذ جميع المتحولات في الاستعلام .... لذلك يجب تغييرها أثناء التصدير.

@ lszanto ربما وجدت سبب هذه المشكلة. إذا قمت بإزالة صف الرأس من التصدير الخاص بي

  $sheet->prependRow(..)

إنها تعمل الآن كما هو متوقع .... لذا من المحتمل أن هذه الوظيفة تقطع التنسيق بطريقة أو بأخرى. حاولت إنشاء ورقة من النموذج أو من مجموعة ، نفس النتائج.

Excel::create('sklad_vyrobku-'.date('d-m-Y', time()), function($excel) use ($table) {
            $excel->sheet('Sklad vyrobku k '.date('d-m-Y', time()), function($sheet) use ($table) {                                         
                 $sheet->fromModel($table, null, 'A1', false, false);
                     $sheet->prependRow(array('id','kod','...'));
                 $sheet->setColumnFormat(array('B'=>'@','C'=>'@','D'=>'@','E'=>'@'));
            });
         })->download('xlsx');

واجهت نفس المشكلة (Laravel 4.2) ، ولكن تم حلها عن طريق استدعاء setColumnFormat على الفور بعد فتح $ excel-> sheet function shut.
لذلك لا أعتقد أن هذا خطأ ، إنه مجرد نهج منطقي.

مثال:

$excel->sheet("FooBar", function($sheet) use ($x, $y, $z) {

    $sheet->setColumnFormat(array(
       "G:H" => "@",
       "Z" => "@",
       'AH:AI' => '0',
       "AO:BB" => "h:mm",
       "BE:BR" => "h:mm",
    ));

    ...

});

كنت لا أزال أواجه هذه المشكلة ولم يعمل أي من الحلول المذكورة أعلاه بالنسبة لي. كنت أستورد بياناتي من مصفوفة وبينما كانت جميع القيم الموجودة هناك strings ، كنت أفكر في أن setColumnFormat ستظل تقوم بعملها وتحول الخلايا إلى Number Format ، لم يكن هذا هو الحال بالرغم من ذلك.
الطريقة التي قمت بحلها هي عن طريق كتابة جميع القيم الموجودة في المصفوفة الخاصة بي في عدد عوامات / ints قبل استخدام طريقة fromArray لاستيراد البيانات إلى الورقة.

لذلك إذا لم يكن هناك ما يناسبك ، فتأكد من أن البيانات التي تستوردها من النوع الصحيح قبل إدراجها في الورقة. أمل أن هذا يساعد شخصاما :)

لقد وجدت حلاً باستخدام setCellValueExplicit ()
على سبيل المثال:

$sheet->setColumnFormat(array( //se formatea la columna a texto
    'C' => \PHPExcel_Style_NumberFormat::FORMAT_TEXT,
    'I' => 'dd-mm-yyyy hh:mm'
));

$sheet->setCellValueExplicit('C10', $object->card_number, \PHPExcel_Cell_DataType::TYPE_STRING);

أتمنى أن يساعدك هذا ؛)

excel $-> sheet ('staff'، function ($ sheet) use ($ data) {
$ sheet-> setColumnFormat (مصفوفة (
"H" => "@"،
)) ؛
$ sheet-> rows ($ data، true)؛
}) ؛

أتمنى أن يساعدك هذا ؛)

ما زلت مع نفس المشكلة. في الواقع ، إنه يغير التنسيق (الخط) ولكن ليس تنسيق البيانات.
captura de pantalla 2017-04-04 a las 11 11 39 a m
captura de pantalla 2017-04-04 a las 11 05 19 a m
captura de pantalla 2017-04-04 a las 11 12 58 a m

هل الخلل أم أنني أفعل ذلك بطريقة خاطئة؟

تضمين التغريدة
$sheet->rows($data, true) يضيف كل القواعد "صريحة". هذا يعني أنه سيتم إضافته كسلسلة وبالتالي سيتم تجاهل تنسيق العمود.

شكرا @ patrickbrouwers.
أحاول أيضًا مع:

$sheet->fromArray($data, null, 'A1', false, false);

أعتقد أنني وجدت سبب عدم نجاحها ، ولست متأكدًا من سبب إضافتها على الإطلاق: https://github.com/Maatwebsite/Laravel-Excel/blob/2.1/src/Maatwebsite/Excel/Classes/LaravelExcelWorksheet.php#L1262 It يضيف عددًا & أعدادًا صحيحة كقيم "سلسلة" أيضًا.

لذلك لن تنجح؟ :(

فقط لا تقم بتعيين صريح $sheet->rows($data, true); على true.

يستخدم:

$sheet->rows($data);

$sheet->fromArray($data, null, 'A1', false, false); يعمل بشكل جيد بالنسبة لي أيضًا.

لا يزال لا يعمل. بالإضافة إلى ذلك ، كيف يمكنني تنسيق الأعمدة باستخدام:
$sheet->fromArray($data, null, 'A1', false, false);

رمز المثال الخاص بك مع $sheet->rows($data); يعمل بشكل جيد بالنسبة لي. تنسيق العمود صحيح عند فتحه في Excel.

هذا غريب. لا يزال لا يعمل:
captura de pantalla 2017-04-05 a las 11 15 20 a m
captura de pantalla 2017-04-05 a las 11 13 48 a m
لدي النسخة الصحيحة؟ (الإصدار 2.1.16)

أي شخص؟ .. ما زلت أواجه هذه المشكلة ...

في Laravel 5.3 ، موقع maatwebsite / excel 2.1.12

تمكنت من جعله يعمل مع التغييرين التاليين

  1. اقتراح LastxTemplar لتحويل الرقم إلى عدد عشري أو عدد صحيح
  2. وضع setColumnFormat () مباشرة بعد فتح $ excel-> sheet function shut ، لكل @ nikola-Absolute

حصلت على هذه المشكلة مؤخرًا ، أحاول استخدام طريقة setColumnFormat ولكنها لا تعمل معي.
هذا هو الحل الخاص بي:

foreach (...) {
    $sheet->row($row, [
        /* Your Data */
    ]);
    $sheet->setCellValueExplicitByColumnAndRow($column, $row, $value, \PHPExcel_Cell_DataType::TYPE_STRING);
}

نوع الملاحظة $column و $row هو integer ، مرجع هنا .

في Laravel 5.1 ، موقع maatwebsite / excel 2.1.0
لقد تمكنت من جعله يعمل فقط عبر تحويل الرقم إلى عدد عشري أو عدد صحيح
:(
لذلك يجب أن أقوم بعمل حلقة لكل صف لتحقيق ذلك.

أيضا تواجه هذه المشكلة. أي تحديثات قادمة؟

تحرير: تم إصلاحه أيضًا مع الحل البديل لـ @ Neighborhood999

جميع العينات هنا تتحدث عن التصدير إلى Excel ،ماذا عن الاستيراد من عينات اكسل

القيمة-> imei_1 = 356803081142590 ؛

ولكن انتهى بي الأمر بالحصول على imei_1 كـ "3.5680308104231E + 14"

<?php

$path = $request->file('excel')->getRealPath();
$data = Excel::load($path, function ($reader) {
})->get(['brand', 'model', 'batch', 'imei_1', 'imei_2']);

if (!empty($data) && $total = $data->count()) {
    foreach ($data as $key => $value) {
              $insert[] = ['brand' => $value->brand,
                           'model' => $value->model,
                           'batch' => $request->batch ? $request->batch : $value->batch,
                           'imei_1' => strval($value->imei_1),
                           'imei_2' => strval($value->imei_2),
                           'created_at' => Carbon::now(),
                           'updated_at' => Carbon::now()
                         ];
        }
    /*if (!empty($insert)) {
        Device::insert($insert);
        // dd('Insert Record successfully.');
    }*/
}

@ Ra1da35ma لدي نفس المشكلة. لم تحصل في أي مكان مع هذا؟

لقد حاولت تعيين رابط قيمة مخصص ولكن هذا لا يعمل لأن القيم التي يتم ربطها بالخلايا موجودة بالفعل في التدوين العلمي. قد أفتح مشكلة أخرى لمحاولة حلها لأنها ليست نفس المشكلة تمامًا ولكن آمل أن يكون لديك المزيد من المعلومات.

لقد وجدت حلا. كانت المشكلة تتعلق بـ PHP ومتغير الدقة .ini الذي تقرأه فئة PHPExcel_Calculation. لا يمكنك تجاوز هذا في الحزمة Laravel-Excel ولا في الحزمة الأصلية PHPExcel. بدلاً من ذلك ، لإصلاح هذا ، أضفت للتو ini_set('precision', 20) قبل أن أستدعى وظيفة تحميل Excel.

هذه هي وظيفتي:

public function getXlsxFile($filePath)
    {
        ini_set('precision', 18);
        $collection = Excel::load($filePath);

        return $collection->get();
    }

هذه هي الطريقة التي يعمل بها بالنسبة لي مع Laravel 5.1

$ myFile = Excel :: إنشاء ($ filename ، الوظيفة ($ excel) استخدم ($ array) {
$ excel-> setTitle ("العنوان")؛
excel-> sheet ('sheet 1'، function ($ sheet) use ($ array) {
$ sheet-> setColumnFormat (المصفوفة ('B' => '0')) ؛
$ sheet-> setColumnFormat (المصفوفة ('C' => '0')) ؛
$ sheet-> setColumnFormat (المصفوفة ('D' => '0')) ؛
$ sheet-> setColumnFormat (المصفوفة ('E' => '0')) ؛
$ sheet-> rows ($ array، false)؛
// تعيين أسماء العمود
$ sheet-> prependRow (مجموعة (
"اسم العمود 1" ، "المربع 1" ، "المربع 2" ، "المربع 3" ، "الإجمالي"
)) ؛
}) ؛
}) ؛

نحن بصدد إغلاق جميع التذاكر القديمة ، لأن الإصدار 2. * وصل إلى مرحلة نهاية العمر. يتم الآن تخصيص اهتمامنا الكامل للإصدار 3.0. لا يزال من الممكن استخدام 2. * ، ولكن لن يكون هناك دعم نشط بعد الآن.

صب قيمة لعدد صحيح بالنسبة لي.

هذه هي أفضل إجابة ، اكتب متغيراتك في المصفوفة قبل تمريرها إلى الطريقة ->fromArray : على سبيل المثال
$local_order['Quantity'] = (int) $item->quantity;
$local_order['Price'] = (float) $item->price;

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات