Странная ошибка при создании файлов 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, который выдает ошибку, вы по-прежнему видите строку с именами столбцов, хотя технически она была перезаписана.

Я нашел решение здесь, в группах Google . Прокрутите вниз до дна. Это последнее сообщение Мики , в котором упоминается проблема.

<Ч>

А вот и исправление

<?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 будет содержать 2 записи данных для ячеек A1 и B1 (0, 0 и 0, 1).

Это не было проблемой до пакета обновления 3 (SP3) для Office. Однако после установки пакета обновления 3 (SP3) Excel выдаст «данные могут быть потеряны». предупреждение, если встречаются повторяющиеся записи для ячейки.

Общее решение - не записывать более одной информации в ячейку. : -)

Вот более подробное объяснение этой проблемы. , Он связан с Perl Spreadsheet :: WriteExcel модуль (из которого извлечен модуль PHP), но суть та же.

Хм, я только что установил его для тестирования и не получил ошибку - он сказал Foo, как и должно.

Сгенерированный файл был 3584 байта; Я открыл его в Excel 2002

Я получил эту ошибку при записи в столбец 0 (A0) с помощью PHPExcel. Excel имеет индекс 1 (A1), поэтому он сказал, что «данные могут быть потеряны».

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

$ row был инициализирован в 0

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top