Laravel-excel: [سؤال] استخدم الملف الحالي كقالب لإلحاق البيانات الجديدة قبل التصدير

تم إنشاؤها على ٢٢ فبراير ٢٠١٩  ·  5تعليقات  ·  مصدر: Maatwebsite/Laravel-Excel

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

إصدارات

  • إصدار PHP: 7.2
  • إصدار Laravel: 5.7
  • إصدار الحزمة: 3.1.1

وصف

أحاول تحرير ملف موجود لاستخدامه كقالب. أنا الآن أنه بالنسبة لهذا الإصدار ، لم يتم تطوير هذه الوظيفة لاستخدامها بسهولة. لكني أرغب في معرفة ما إذا كان بإمكاني القيام بذلك بنفسي باستخدام الوظائف داخل المكون الإضافي واللعب بـ function resisterEvents() .

لقد حصلت على تنزيل ملف موجود واختيار ورقة. لكن ليس لتحريره.

هذا هو الكود الخاص بي:

    /**
     * <strong i="16">@return</strong> array
     */
    public function registerEvents(): array
    {
        return [
            BeforeWriting::class  => function(BeforeWriting $event) {
                $event->writer->reopen(storage_path('app/public/files/mytemplate.xlsx'),Excel::XLSX);
                $event->writer->getSheetByIndex(0);
                return $event->getWriter()->getSheetByIndex(0);
            }
        ];
    }

بعض الاقتراحات؟

شكرا جزيلا

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

حاولت إضافة معلومات بقيمة بهذا الرمز داخل function resisterEvents() ولا يعمل:

AfterSheet::class => function(AfterSheet $event) {
       $event->sheet->setCellValue('G2', 'Hello world');
}

وأيضًا لإلحاق البيانات من خلال function query()

question

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

->reopen() طريقة داخلية ويجب استخدامها بحذر. ربما يمكنك حلها بتمرير new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) لإعادة الفتح.

تحرير الملفات الموجودة (القوالب) موجود في خريطة الطريق الخاصة بنا (الإصدار 3.3) ، ولكن بدون تاريخ إصدار محدد.

إذا كنت بحاجة إليها على سبيل الأولوية ، فيرجى إلقاء نظرة على قسم الدعم التجاري لدينا: https://laravel-excel.com/commercial-support .

ال 5 كومينتر

أخيرًا ، نجح هذا الأمر بالنسبة لي في الإصدار 3.1.0. في الإصدار الفعلي 3.1.10 ، لا يعمل هذا لأن الوظيفة reopen قد تغيرت. في انتظار التحديثات والتحسينات الجديدة لتحرير ملف موجود.

->reopen() طريقة داخلية ويجب استخدامها بحذر. ربما يمكنك حلها بتمرير new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) لإعادة الفتح.

تحرير الملفات الموجودة (القوالب) موجود في خريطة الطريق الخاصة بنا (الإصدار 3.3) ، ولكن بدون تاريخ إصدار محدد.

إذا كنت بحاجة إليها على سبيل الأولوية ، فيرجى إلقاء نظرة على قسم الدعم التجاري لدينا: https://laravel-excel.com/commercial-support .

شكرا على هذه الإجابة السريعة.

سأحاول بهذه الطريقة.

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

إذا وجدت شيئًا جيدًا سأبلغك

في حالة التحديث يرجى التعليق في أقرب وقت ممكن

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

  1. اتصل بفئة Excel لتجاوز فصلك الدراسي Export (هذا المثال يستخدم طريقة download )
  2. تحدد فئة Excel أي Writer يجب استخدامه واستدعاء طريقة export في هذا Writer .
  3. افتح Writer الخاص بك Export (واستدع الحدث BeforeExport ) ، ثم املأ ورقة جديدة ، ثم اتصل بالطريقة write .
  4. طريقة write ( Writer class) ستستدعي الحدث BeforeWriting وتكتب في الملف لأنواع أخرى غير XLSX

لهذا السبب لا يعمل BeforeWriting ، وإذا كنت تستخدمه على BeforeExport ، فسيعمل ولكن في ورقة جديدة .

للتغلب على هذه المشكلة ، أضفت علامة على طريقة الحصول على بيانات التصدير (في حالتي FromCollection). بهذه الطريقة لن تتم العملية في الخطوة 2. ثم ، في BeforeWriting أقوم بتمييز العلم ، واحصل على الورقة المطلوبة واستدعاء طريقة export عليها.

هذا هو الكود:

public function collection()
{
    if ($this->calledByEvent) { // flag
        return $this->myCollectionToExport;
    }

    return collect([]);
}

public function registerEvents(): array
{
    return [
        BeforeWriting::class => function(BeforeWriting $event) {
            $templateFile = new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'));
            $event->writer->reopen($templateFile, Excel::XLSX);
            $event->writer->getSheetByIndex(0);

            $this->calledByEvent = true; // set the flag
            $event->writer->getSheetByIndex(0)->export($event->getConcernable()); // call the export on the first sheet

            return $event->getWriter()->getSheetByIndex(0);
        },
    ];
}

ألقِ نظرة على طرق download و write Maatwebsite\Excel\Writer ، ستكون مفيدة جدًا.

باستخدام هذه المعلومات والخطوات ، سيكون من الممكن إنشاء حل بديل أكثر تعقيدًا.

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