Я не могу отобразить «11e5», как в электронной таблице Excel, используя PHP - PullRequest
0 голосов
/ 06 сентября 2018

Я экспортирую данные в файл CSV, но есть значение " 11e5 ", которое в Excel интерпретируется как число. Вместо текста в таблице Excel отображается 1.10E + 06 .

Я пытался добавить префикс к значению апострофом, но затем он отображается как 1100000 в Excel.

Вот код, который я использую для тестирования, живой код получает данные из MySQL.

function array2csv(array &$array)
{
  if (count($array) == 0) {
    return null;
  }
  ob_start();
  $df = fopen("php://output", 'w');
  fputcsv($df, array_keys(reset($array)));
  foreach ($array as $row) {
     fputcsv($df, $row);
  }
  fclose($df);
  return ob_get_clean();
}

function download_send_headers($filename){
  $now = gmdate("D, d M Y H:i:s");
  header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
  header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
  header("Last-Modified: {$now} GMT");
  header("Content-Type: application/force-download");
  header("Content-Type: application/octet-stream");
  header("Content-Type: application/download");
  header("Content-Disposition: attachment;filename={$filename}");
  header("Content-Transfer-Encoding: binary");
}

$row1 = array ('Assignment name', 'tet4' );
$row2 = array ('Class name','11e5' );
$row3 = array ('Name', 'Target', 'Start grade', 'End Grade', 'Avarage grade', 'May', 'June', 'July', 'August','06th Aug', '13th Aug', '20th Aug', '27th Aug', '03rd Sep', 'Last 7 days', 'Last 24 hours',  'Total points' );
$row4 = array ('Maan Roy',  2, 1,  1,  0,  0, 0,  0, 0,  0,  0,  0,  0,  0, 6,  0,  32 );
$row5 = array (  'mac mac',  0, 1,  2,  1.5,  0, 0,  0, 0,  0,  0,  0,  0, 0,  98,  0,  98 );

$response = array(); 

array_push($response, $row1);
array_push($response, $row2);
array_push($response, $row3);
array_push($response, $row4);
array_push($response, $row5);
download_send_headers("data_export_" . date("Y-m-d") . ".csv");
echo array2csv($response);

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Формат файла CSV явно не поддерживает метаданные, и у MSExcel есть очень раздражающая привычка предполагать, что все, что похоже на число, является числом (оно также удаляет начальные нули и может вставлять запятые). И чтобы добавить оскорбление к травме, он изменяет данные, а не просто отображает их по-другому.

При импорте вручную вы можете переопределить это поведение, указав тип 'TEXT' для столбца, но это не лучшее решение.

Если вы хотите беспроблемного взаимодействия с пользователем, вам нужно использовать другой формат, чем CSV (или не использовать MSExcel?). Вы можете написать XML, используя стандартные инструменты, и есть библиотеки для создания файла, похожего на xlsx (хотя IME, MSExcel обычно жалуется, что последние по-прежнему находятся в неправильном формате, даже если они будут загружать и отображать данные, как предполагалось).

0 голосов
/ 06 сентября 2018

Отредактируйте ваш код, чтобы вывести значение, например ="11e5", и оно должно работать нормально. Протестировано с Excel 2016 на Mac, но поведение должно быть таким же в Windows.

См. сообщение на SU .

0 голосов
/ 06 сентября 2018

11e5 (11 × 10 5 ) представляет число около 1100000. Excel выбирает другой способ представления одного и того же числа. 1.10E + 06 (1.10 × 10 6 ) действительно представляет собой одно и то же число. Если вы сделаете столбец, содержащий ячейку шире, он может даже показать 1100000 в Excel.

Но для вас 11e5 - это строка, обозначающая название класса. Поэтому в соответствии с CSV попробуйте поместить значение в двойные кавычки ", чтобы указать, что значение является строкой. Или, согласно Excel, попробуйте поставить апостроф ' перед значением, чтобы указать, что значение является строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...