خطأ غريب عند إنشاء ملفات Excel باستخدام Spreadsheet_Excel_Writer

StackOverflow https://stackoverflow.com/questions/244110

  •  04-07-2019
  •  | 
  •  

سؤال

هذا هو الرمز.ليس كثيرا لذلك.

<?php
include("Spreadsheet/Excel/Writer.php");

$xls = new Spreadsheet_Excel_Writer();

$sheet = $xls->addWorksheet('At a Glance');

$colNames = array('Foo', 'Bar');
$sheet->writeRow(0, 0, $colNames, $colHeadingFormat);

for($i=1; $i<=10; $i++)
{
    $row = array( "foo $i", "bar $i");

    $sheet->writeRow($rowNumber++, 0, $row);
}

header ("Expires: " . gmdate("D,d M Y H:i:s") . " GMT");
header ("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
$xls->send("test.xls");
$xls->close();
?>

المشكلة هي أنني أتلقى الخطأ التالي عندما أقوم بفتح الملف باستخدام Excel:

File error:  data may have been lost.

والأغرب من ذلك هو حقيقة أنه على الرغم من الخطأ، يبدو الملف جيدًا.أي بيانات أقوم بكتابتها موجودة هناك.

هل لديك أي أفكار حول كيفية التخلص من هذا الخطأ؟


يحرر

لقد قمت بتعديل نموذج التعليمات البرمجية لتوضيح المشكلة بشكل أفضل.لا أعتقد أن العينة الأولى كانت اختبارًا شرعيًا.

هل كانت مفيدة؟

المحلول

يحتوي الكود الموجود في السؤال على خطأ يسبب الخطأ.

يكتب هذا السطر مجموعة من أسماء الأعمدة للصف 0

$sheet->writeRow(0, 0, $colNames, $colHeadingFormat);

ثم لدينا الحلقة التي من المفترض أن تكتب صفوف القيمة.

for($i=1; $i<=10; $i++)
{
    $row = array( "foo $i", "bar $i");

    $sheet->writeRow($rowNumber++, 0, $row);
}

المشكلة هي $rowNumber لم يتم التصريح عنه في أي مكان لذا فهو يقوم بالكتابة فوق الصف 0 عند المرور الأول خلال الحلقة.

يبدو أن هذه الكتابة الفوقية تسبب مشكلة في برنامج Excel Writer.

الشيء الغريب هو أنه في ملف Excel الذي يعطي الخطأ، لا تزال ترى الصف الذي يحتوي على أسماء الأعمدة على الرغم من أنه تمت الكتابة فوقه من الناحية الفنية.

لقد وجدت الحل هنا على مجموعات جوجل.انتقل لأسفل إلى أسفل.إنها آخر مشاركة لـ ميخا الذي يذكر هذه المسألة.


وهنا الحل

<?php
include("Spreadsheet/Excel/Writer.php");

$xls = new Spreadsheet_Excel_Writer();

$rowNumber = 0;
$sheet = $xls->addWorksheet('At a Glance');

$colNames = array('Foo', 'Bar');
$sheet->writeRow($rowNumber, 0, $colNames, $colHeadingFormat);

for($i=1; $i<=10; $i++)
{
    $rowNumber++;
    $row = array( "foo $i", "bar $i");

    $sheet->writeRow($rowNumber, 0, $row);
}

header ("Expires: " . gmdate("D,d M Y H:i:s") . " GMT");
header ("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
$xls->send("test.xls");
$xls->close();
?>

نصائح أخرى

كما يشير مارك بيك، فإن المشكلة الرئيسية هي ذلك $rowNumber غير مهيأ وعلى هذا النحو يحل محل الصف 0.

وهذا يعني أن ملف Excel الذي تم إنشاؤه سيحتوي على إدخالين بيانات للخلايا A1 وB1 (0، 0 و0، 1).

لم تكن هذه مشكلة قبل Office Service Pack 3.ومع ذلك، بمجرد تثبيت حزمة الخدمة SP3، سيقوم برنامج Excel بإظهار تحذير "ربما تم فقدان البيانات" إذا واجه إدخالات مكررة للخلية.

الحل العام هو عدم كتابة أكثر من بيانات في الخلية.:-)

وهنا المزيد شرح مفصل من هذه القضية.إنه يتعلق بـ Perl جدول البيانات::WriteExcel الوحدة النمطية (التي تُشتق منها وحدة PHP) ولكن التوجه هو نفسه.

وهم أنا فقط تثبيته لاختبار ولم تحصل على خطأ - قالت فو كما ينبغي

وإنشاء الملف كان 3584 بايت. فتحت في Excel 2002

وحصلت على هذا الخطأ عند الكتابة إلى العمود 0 (A0) مع PHPExcel. التفوق هو 1 فهرسة (A1)، لهذا السبب قال أنه "قد تم فقدان البيانات".

$this->m_excel->getActiveSheet()->SetCellValue($chr[$col].$row, $data));

وتمت تهيئة $row 0

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top