@s-developer

Как поменять формат даты при экспорте в Excel?

Избитый вопрос до дури, но мозги уже на столько кипят, что не могу. В php новичок, прошу сильно не пинать.
Сделал я экспорт БД в Excel с рассылкой на почту. Код работает, все вроде бы хорошо, да не совсем. (гуглил, не могу прикинуть что и куда).
Прошу помочь, ане стебаться, все мы когда-то учились и сидели над задачами по программированию долгое время, хотя они и казались простыми.
Итак к делу:
код рабочий, но на выходе у меня в поле выводится дата в американском формате (она итак в БД, откуда я беру данные так записана). Как перевести ее в человеческий формат?
Заранее спасибо всем откликнувшимся, а не пинавшим. Всем добра, любите бобра :-)
Код:
// Create new PHPExcel object
echo date('H:i:s') , " Создан файл Excel" , EOL;
$objPHPExcel = new PHPExcel();

// Set document properties
echo date('H:i:s') , " Установка свойств документа" , EOL;
$objPHPExcel->getProperties()->setCreator("")
               ->setLastModifiedBy("")
               ->setTitle("")
               ->setSubject("")
               ->setDescription("")
               ->setKeywords("")
               ->setCategory("");


// Add some data
echo date('H:i:s') , " Добавление данных" , EOL;
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Проект')
            ->setCellValue('B1', 'Код')
            ->setCellValue('C1', 'Тема')
            ->setCellValue('D1', 'Статус')
            ->setCellValue('E1', 'Исполнитель')
            ->setCellValue('F1', 'Автор')
            ->setCellValue('G1', 'Создано')
            ->setCellValue('H1', 'Описание')
            ->setCellValue('I1', 'Дата совещания')
            ->setCellValue('J1', 'Срок исполнения');

$count = 1;
echo "Data:";
$get_jira = $DBH->query("SELECT * FROM БД WHERE OTKRITA = 1 AND Proect = 'ТАБЛИЦА'");
//while($get_jira_db = $get_jira->fetch()) {  
    
while($get_jira_db = $get_jira->fetch(PDO::FETCH_ASSOC)) {    
      $count++;
      $A = $get_jira_db['Proect'];
      $B = $get_jira_db['CodZadachi'];
      $C = $get_jira_db['Tema'];
      $D = $get_jira_db['Status'];
      $E = $get_jira_db['Ispolnitel'];
      $F = $get_jira_db['Avtor'];
      $G = $get_jira_db['DataSozdania'];
      $H = $get_jira_db['Opisanie'];
      $I = $get_jira_db['DataSoveschania'];
      $J = $get_jira_db['SrokIspolnenia'];
      //Устанавливаем кодировку столбцов, потому что без этого ни хрена не грузит в столбцы русские буквы.
      $C = iconv( "cp1251","UTF-8", $C);
      $D = iconv( "cp1251","UTF-8", $D);
      $E = iconv( "cp1251","UTF-8", $E);
      $F = iconv( "cp1251","UTF-8", $F);
      //Устанавливаем автоматическую ширину столбцов непосредственно в конечном файле Excel, который получит пользователь на свой e-mail.
      $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setAutoSize(true);
      $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setAutoSize(true);

$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A'.$count, $A)
            ->setCellValue('B'.$count, $B)
            ->setCellValue('C'.$count, $C)
            ->setCellValue('D'.$count, $D)
            ->setCellValue('E'.$count, $E)
            ->setCellValue('F'.$count, $F)
            ->setCellValue('G'.$count, $G)
            ->setCellValue('H'.$count, $H)
            ->setCellValue('I'.$count, $I)
            ->setCellValue('J'.$count, $J);
}
echo "--data end--";
// Rename worksheet
echo date('H:i:s') , " Присвоение имени" , EOL;
$objPHPExcel->getActiveSheet()->setTitle('Выгрузка');


// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

// Save Excel 95 file
echo date('H:i:s') , " Запись в формат Excel" , EOL;
$callStartTime = microtime(true);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save(str_replace('.php', '.xls', __FILE__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;

echo date('H:i:s') , " Файл записан как: " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
echo 'Создано за время ' , sprintf('%.4f',$callTime) , " seconds" , EOL;
// Echo memory usage
echo date('H:i:s') , ' Текущее использование памяти : ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;


// Echo memory peak usage
echo date('H:i:s') , " Пиковое использование памяти: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;

// Echo done
echo date('H:i:s') , " Файл записан" , EOL;
echo 'Файл сохранен по пути: ' , getcwd() , EOL;


// пример использования
$file = "excel.xls"; // файл
$mailTo1 = "ПОЧТА 1"; // кому
$mailTo2 = "ПОЧТА 2"; // кому
$from = "ЯЩИК С КОТОРОГО ШЛЮ"; // от кого
$subject = "Рассылка"; // тема письма
$message = "Ваша рассылка"; // текст письма

$r1 = sendMailAttachment($mailTo1, $from, $subject, $message, $file); // отправка письма c вложением
$r2 = sendMailAttachment($mailTo2, $from, $subject, $message, $file); // отправка письма c вложением

echo ($r1)?'Письмо отправлено ':'Ошибка. Письмо не отправлено!<p>';
echo ($r2)?'Письмо отправлено ':'Ошибка. Письмо не отправлено!';
//$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения
//echo ($r)?'Письмо отправлено':'Ошибка. Письмо не отправлено!';
 
/**
* Отправка письма с вложением
* @param string $mailTo
* @param string $from
* @param string $subject
* @param string $message
* @param string|bool $file - не обязательный параметр, путь до файла
* 
* @return bool - результат отправки
*/
 
function sendMailAttachment($mailTo, $from, $subject, $message, $file = false){
    $separator = "---"; // разделитель в письме
    // Заголовки для письма
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: $from\nReply-To: $from\n"; // задаем от кого письмо
    $headers .= "Content-Type: multipart/mixed; boundary=\"$separator\""; // в заголовке указываем разделитель
    $headers .= "Content-type: text/html; charset=utf-8'\n";
    // если письмо с вложением
    if($file){
        $bodyMail = "--$separator\n"; // начало тела письма, выводим разделитель
        $bodyMail .= "Content-type: text/html; charset=utf-8\n"; // кодировка письма
        $bodyMail .= "Content-Transfer-Encoding: quoted-printable"; // задаем конвертацию письма
        $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=\n\n"; // задаем название файла
        $bodyMail .= $message."\n"; // добавляем текст письма
        $bodyMail .= "--$separator\n";
        $fileRead = fopen($file, "r"); // открываем файл
        $contentFile = fread($fileRead, filesize($file)); // считываем его до конца
        fclose($fileRead); // закрываем файл
        $bodyMail .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode(basename($file))."?=\n"; 
        $bodyMail .= "Content-Transfer-Encoding: base64\n"; // кодировка файла
        $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=\n\n";
        $bodyMail .= chunk_split(base64_encode($contentFile))."\n"; // кодируем и прикрепляем файл
        $bodyMail .= "--".$separator ."--\n";
    // письмо без вложения
    }else{
        $bodyMail = $message;
    }
    $result = mail($mailTo, $subject, $bodyMail, $headers); // отправка письма
    return $result;
}

Время и дата выводится сейчас у меня из БД вот так:
Jul 4 2019 12:00AM
а хотелось бы : Июль 4 12:00 2019 (можно без года). Так бы сказать облагородить
  • Вопрос задан
  • 503 просмотра
Решения вопроса 1
erge
@erge
Примус починяю
Один из вариантов - в запросе приводить дату к необходимому формату:
см. Функции форматирования даты и времени
MySQL функция CASE
MySQL Пример конкатенации (сложении) строк-значени...

SELECT
  Proect,
  CodZadachi,
  Tema,
  Status,
  Ispolnitel,
  Avtor,
  CONCAT(
    CASE DATE_FORMAT(DataSozdania,'%m')
      WHEN '01' THEN 'Январь'
      WHEN '02' THEN 'Февраль'
      WHEN '03' THEN 'Март'
      WHEN '04' THEN 'Апрель'
      WHEN '05' THEN 'Май'
      WHEN '06' THEN 'Июнь'
      WHEN '07' THEN 'Июль'
      WHEN '08' THEN 'Август'
      WHEN '09' THEN 'Сентябрь'
      WHEN '10' THEN 'Октябрь'
      WHEN '11' THEN 'Ноябрь'
      WHEN '12' THEN 'Декабрь'
    END,
    DATE_FORMAT(DataSozdania,' %e %H:%i %Y')
  ) AS DataSozdania,
  Opisanie,
  DataSoveschania,
  SrokIspolnenia,
FROM БД WHERE OTKRITA = 1 AND Proect = 'ТАБЛИЦА'


Можно через регулярные выражения в PHP заменить все английские названия месяцев на русские см. Функции для работы с регулярными выражениями (Perl...

Но в таком виде для Excel это будет обычная строка, дата не распознается.

можно отформатировать дату в запросе (см. выше) в формат dd.mm.yyyy hh:mi, такой формат Excel понимает.
и потом применить к ячейке необходимое форматирование даты, формат будет такой: MMMM DD HH:MM YYYY
но название месяца склоняется (по крайней мере в LibreOffice) и выглядит как-то не очень.
см. например: PHPEXCEL: КАК УСТАНОВИТЬ ФОРМАТ ДАТЫ ДЛЯ ЯЧЕЙКИ
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы