Laravel-excel: خطأ في فتح الملف باستخدام Excel. البيانات المحتملة تالفة أو تالفة امتداد الملف.

تم إنشاؤها على ٢٤ مايو ٢٠١٨  ·  15تعليقات  ·  مصدر: Maatwebsite/Laravel-Excel

المتطلبات الأساسية

  • [x] نظرًا لأنه قادر على إعادة إنتاج السلوك خارج التعليمات البرمجية الخاصة بك ، يتم عزل المشكلة في Laravel Excel.
  • [x] تم التحقق من عدم تقديم مشكلتك بالفعل.
  • [x] تم التحقق مما إذا لم يتم تقديم العلاقات العامة التي تعمل على حل هذه المشكلة.

إصدارات

  • إصدار PHP: 7.1.1
  • إصدار Laravel: 5.5. *
  • إصدار الحزمة: ^ 3.0

وصف

تنزيل ملف من طريقة FromQuery .... تنزيلات الملفات ، عند فتح ملف XLSX ، تتلقى رسالة خطأ من Office:
"لا يمكن لـ Excel فتح الملفلأن تنسيق الملف أو امتداد الملف غير صالح. تحقق من أن الملف لم يتلف وأن امتداد الملف يطابق تنسيق الملف "

خطوات التكاثر

ها هي طريقتي

namespace Modules\Profile\Exports;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Modules\Profile\Entities\Profile;

class ProfileExport implements FromQuery
{
    use Exportable;

    public function __construct($range)
    {
        $this->start = $range['start'];
        $this->end = $range['end'];
    }

    public function query()
    {
      return Profile::query()->where('created_at', '>=', $this->start . ' 00:00:00')
                             ->where('created_at', '<=', $this->end . ' 23:59:59')
                             ->whereHas('user.roles', function($query){
                                  $query->where('id', 2);
                             });
    }
}

أسميها هكذا من وحدة تحكم

//$request->start = '2018-01-01';
//$request->end = '2018-05-01';

$range = ['start'=>$request->start, 'end'=>$request->end];
return (new ProfileExport($range))->download($request->start . '-' . $request->end .'-pet-parent-signups.xlsx');

سلوك متوقع:

الملف المراد تنزيله بالبيانات

السلوك الفعلي:

يتم تنزيل الملف ولكن يعطي Excel خطأ في فتحه

معلومة اضافية

لقد اختبرت الاستعلام بليغة ويعيد مجموعة مع البيانات.

(https://user-images.githubusercontent.com/18451450/40511758-f61e6570-5f5d-11e8-9f37-0b594f60be59.png)

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

مرحبا جميعا،

أقضي يومي لأفهم وظيفة التنزيل غير القابلة للتطبيق. يبدو أن PHPScribSheet يستخدم PHP buffer. واعتمادًا على تكوين PHP الخاص بك ، قد تتداخل بعض التحذيرات أو الأخطاء مع الإخراج.

استخدام :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

يحل بالنسبة لي.
ربما ينبغي أن تساعد بعض الناس.

شكرا لك على هذه المكتبة الرائعة.

ال 15 كومينتر

شكرا لك أيضا مقدما :)

خاصة لأخذ الوقت الكافي لكتابة هذا الغلاف لتبدأ به

لست متأكدًا مما إذا كانت لا تزال نفس المشكلة في PhpSpreadsheet ، لكن PHPExcel واجهت مشاكل في وجود مسافات ( ) أمام العلامات المفتوحة <?php . كان من المعتاد أن يتسبب في هذا الخطأ في الماضي.

يمكنك فتح ملف خطأ باستخدام nano أو vim.
إذا رأيت مسافة قبل PK ، تمامًا مثل هذا :
image
ربما حدث خطأ في التعليمات البرمجية أو البائع. واجهت نفس المشكلة وتعاملت مع إزالة مجلد البائع. يعمل بشكل جيد بعد إعادة تثبيت البائع

مرحبًا بالجميع ، شكرًا على القيادة.

أعتقد أنك محق في وجود فاصل أسطر إضافي أو شيء ما في بداية الملف. لم أقم بتتبعه بعد ولكن عندما أقوم بالتبديل إلى CSV ، يمكنني فتح الملف والبيانات موجودة ولكن الصف الأول فارغ ...

سوف ننظر أكثر ، تقرير سيء مرة أخرى. استحوذت على ملف يبدأ بفاصل أسطر ثم

سأقوم بإغلاق هذا وفتح واحدة جديدة مع وصف أفضل للمشكلة. لا يمكنني العثور على مصدر الصف الفارغ

التقيت نفس المشكلة. أنا ثابتة بواسطة

  • Excel :: تخزين لتخزين الملف على الخادم
  • إرجاع إعادة التوجيه (Storage :: url ("storage / {$ filename}")) ؛
    عينة
    ""
    تصدير الوظيفة العامة (طلب $ request)
    {
    $filename = 'meal_list_'.date('YmdHis').'.xlsx';
     Excel::store(new MealExport($request), $filename, 'public');
     return redirect( Storage::url("storage/{$filename}" ));
}

مرحبا جميعا،

أقضي يومي لأفهم وظيفة التنزيل غير القابلة للتطبيق. يبدو أن PHPScribSheet يستخدم PHP buffer. واعتمادًا على تكوين PHP الخاص بك ، قد تتداخل بعض التحذيرات أو الأخطاء مع الإخراج.

استخدام :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

يحل بالنسبة لي.
ربما ينبغي أن تساعد بعض الناس.

شكرا لك على هذه المكتبة الرائعة.

مرحبا جميعا،

أقضي يومي لأفهم وظيفة التنزيل غير القابلة للتطبيق. يبدو أن PHPScribSheet يستخدم PHP buffer. واعتمادًا على تكوين PHP الخاص بك ، قد تتداخل بعض التحذيرات أو الأخطاء مع الإخراج.

استخدام :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

يحل بالنسبة لي.
ربما ينبغي أن تساعد بعض الناس.

شكرا لك على هذه المكتبة الرائعة.

شكرا جزيلا على إجابته المثالية

مرحبا جميعا،

هذا الحل :

ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

يعمل وحل مشكلة الفساد. ولكن لا تزال تواجه مشكلة في التصدير باستخدام Xlsx / Xls.
يبدو الملف الذي تم تنزيله كالتالي:
image

أي فكرة كيف أصلح هذا المشكل ؟

شكرا !

مرحبا جميعا،

أقضي يومي لأفهم وظيفة التنزيل غير القابلة للتطبيق. يبدو أن PHPScribSheet يستخدم PHP buffer. واعتمادًا على تكوين PHP الخاص بك ، قد تتداخل بعض التحذيرات أو الأخطاء مع الإخراج.

استخدام :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

يحل بالنسبة لي.
ربما ينبغي أن تساعد بعض الناس.

شكرا لك على هذه المكتبة الرائعة.

أحبك يا رجل .. حفظت رأسي ...

لست متأكدًا مما إذا كانت لا تزال نفس المشكلة في PhpSpreadsheet ، لكن PHPExcel واجهت مشاكل في وجود مسافات ( ) أمام العلامات المفتوحة <?php . كان من المعتاد أن يتسبب في هذا الخطأ في الماضي.

مرحباpatrickbrouwers
شكرا على تعليقك.
يحل بالنسبة لي.

إذا كنت تستخدم أياكس للتنزيل ،
الرجاء إضافة responseType: 'blob' إلى طلب ajax الخاص بك (أنا أستخدم axios)

رمز المثال الخاص بي:

axios.post('/path/to/export', data, {
    responseType: 'blob',
})
.then(response => {
    const filename = 'file.xlsx';
    let blob = new Blob([response.data], {
        type: 'application/octet-stream',
    });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were
        // revoked by closing the blob for which they were created.
        // These URLs will no longer resolve as the data backing
        // the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let blobURL = window.URL.createObjectURL(blob);
        let tempLink = document.createElement('a');
        tempLink.style.display = 'none';
        tempLink.href = blobURL;
        tempLink.download = filename;
        tempLink.click();
        window.URL.revokeObjectURL(blobURL);
    }
})

بدون responseType: 'blob' ، لا يمكن فتح الملف الذي تم تنزيله

إذا كنت تستخدم أياكس للتنزيل ،
الرجاء إضافة responseType: 'blob' إلى طلب ajax الخاص بك (أنا أستخدم axios)

رمز المثال الخاص بي:

axios.post('/path/to/export', data, {
    responseType: 'blob',
})
.then(response => {
    const filename = 'file.xlsx';
    let blob = new Blob([response.data], {
        type: 'application/octet-stream',
    });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were
        // revoked by closing the blob for which they were created.
        // These URLs will no longer resolve as the data backing
        // the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let blobURL = window.URL.createObjectURL(blob);
        let tempLink = document.createElement('a');
        tempLink.style.display = 'none';
        tempLink.href = blobURL;
        tempLink.download = filename;
        tempLink.click();
        window.URL.revokeObjectURL(blobURL);
    }
})

بدون responseType: 'blob' ، لا يمكن فتح الملف الذي تم تنزيله

شكر!! أنقذ حياتي ، ما زلت أبحث في أي سطر من كود php أفسد ملفي الذي تم تصديره .. تبين أنه أكسيوس

مرحبا جميعا،

أقضي يومي لأفهم وظيفة التنزيل غير القابلة للتطبيق. يبدو أن PHPScribSheet يستخدم PHP buffer. واعتمادًا على تكوين PHP الخاص بك ، قد تتداخل بعض التحذيرات أو الأخطاء مع الإخراج.

استخدام :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

يحل بالنسبة لي.
ربما ينبغي أن تساعد بعض الناس.

شكرا لك على هذه المكتبة الرائعة.

شكرا لينزور ، لقد أنقذت يومي! انها عملت! أتساءل هل هناك أي شيء لإصلاح هذا ولكن طريقة Lenzuur @ ، أنت تعرف ما أعنيه ، إذا كان لدي 10 فئة تصدير لـ 10 طراز ، عند التنزيل ، يجب أن أضيف في 10 أماكن.

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

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