Страницы

Поиск по вопросам

Показаны сообщения с ярлыком phpexcel. Показать все сообщения
Показаны сообщения с ярлыком phpexcel. Показать все сообщения

воскресенье, 26 января 2020 г.

PHPExcel Ошибка открытия файла xlsx после сохранения

#phpexcel #php


С помощью PHPExcel сохраняю файл в формате xlsx. Сохраняется нормально, а вот когда
хочешь открыть Excel, выдает ошибку:


  В книге "Отчет по резервам.xlsx" обнаружено содержимое, котрое не
  удалось прочитать. Попробовать
  восстановить содержимое книги? Если вы
  доверяете источнику этой книги,
  нажмите кнопку "Да".


Нажимаем Да - выводится сообщение:


  Была выполнена проверка на уровне
  файла с последующим восстановлением
  файла. Некоторые фрагменты документа
  могли быть восстановлены либо удалены.


Генерируется XML с отчетом об ошибке:



    error048360_01.xml
    Обнаружены ошибки в файле
        "C:\Users\xxx\Downloads\Отчет по
        временным резервам с 01.01.2015
        (6).xlsx"
    
    

        Была выполнена проверка на
            уровне файла с последующим
            восстановлением файла. Некоторые
            фрагменты документа могли быть
            восстановлены либо удалены.
        
    



Настройки PHPExcel:

setPreCalculateFormulas(false);

/*Сохраняем документ*/
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-Disposition: attachment;filename=' . $nameXLS . '.xlsx');


Используется office 2010.

После всех сообщений отчет открывается, и всё с ним нормально, как и должно быть.
Подскажите, как избавится от этих сообщений об ошибках?
    


Ответы

Ответ 1



В общем, проблема решилась довольно-таки просто: Оказалось, что нужно в коде указывать следующее сочетание: $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); header('Content-Type: application/vnd.ms-excel'); либо $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); У меня же было так: $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); header('Content-Type: application/vnd.ms-excel'); Что есть неправильно.

Ответ 2



Скорее всего, имеет смысл порезать css перед генерацией excel. И вообще в принципе тем же самым пару дней назад занимался. Скиньте архив с исходниками и не забудьте в исходнике указать UTF-8(без BOM). гайд

Ответ 3



У меня была та же проблема, и помог этот код. После него ошибки не было. mb_internal_encoding('latin1');

Ответ 4



мучился с той же проблемой помог модуль импорта экспорта opencart https://www.opencart.com/index.php?route=extension/extension/info&extension_id=17 методом втыка подобрал решение в конце надо добавить exit; $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel2007'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="products.xlsx"'); header('Cache-Control: max-age=0'); $objWriter->setPreCalculateFormulas(false); $objWriter->save('php://output'); //без этой строки при открытии файла xlsx ошибка!!!!!! exit; причем с xls такой проблемы нет может кто прокомментирует потому что мозгов не хватает

четверг, 2 января 2020 г.

Как сделать перенос в ячейке при работе с phpexcel

#phpexcel #php


Доброго всем времени суток господа
Пользуюсь phpexcel'ем, причем не первый день. Одну штуковину упорно не могу найти
в мануале (или нет ее там). Ищу перенос внутри ячейки. Вот допустим вам нужно вставить
200 знаков в ячейку, и они не влезают. В экселе есть кнопка - перенос текста. Вот интересует
как нужную ячейку отформатировать, что бы этот перенос был. Можно ли так вообще?
Смысл в том, что текст помещается в ячейке, путем автоматического переноса по строкам.
Вот собственно и все, только команды не знаю, ее и спрашиваю.
p.s.
// выдернул из кода

// выравниваю как надо
$page->getStyle("".$jax."".$stroka."")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
$page->getStyle("".$jax."".$stroka."")->applyFromArray(array("font" => array( "bold"
=> true)));

// вставляю данные, и проклятая переменная $for, неприлично длинная
$page->setCellValue("".$jax."".$stroka."", "".$for."");
    


Ответы

Ответ 1



Насколько мне не изменяет память, то так: $page->getStyle("".$jax."".$stroka."")->getAlignment()->setWrapText(true);

Ответ 2



Вместо \n ввести chr(10) - перевод каретки

Ответ 3



Если нам известно количество объединенных ячеек, то вот такой вариант работает и для объединенной ячейки: $file->setActiveSheetIndex(0)->getStyle('D1:E1')->getAlignment()->setWrapText(true); Похоже, что любой стиль будет работать таким образом для объединенных ячеек.

Ответ 4



Применить стили из массива $objPHPExcel->getActiveSheet()->getStyle('B2')->getAlignment()->applyFromArray( array( 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER, 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER, 'rotation' => 0, 'wrap' => TRUE ) );

среда, 27 ноября 2019 г.

IE убирает границы ячеек при печати нескольких страниц

#php #html #css #вёрстка #phpexcel


При попытке распечатать таблицу, сгенерированную через phpExcel, IE игнорирует любые
стили и границы, при переходе на следующую страницу. 

При выводе в браузер - все отображается корректно, а при печати - уже нет.

border-collapse, ручное прописывание стилей ячейкам, использование @media print css,
и прочее не помогло.

Стили на второй странице выборочно игнорируются, при попытке печатать.

p.s. Прошу прощения за такой способ делания скриншотов. На виндовом компе нет интернета
и возможности вставить флешку.

В браузере: 



В предварительном просмотре:



Пример сгенерированного проблемного кода.

Решение из соседней темы не сработало - там другая проблема была.

Вариант с перемещением doctype в самое начало кода не сработал.

На данный момент воспроизвелось на всех актуальных версиях IE.
На Edge не воспроизвелось, он уже на другом движке.
    


Ответы

Ответ 1



Печать технологической карты обслуживания и ремонта для ЕО "Экземпляр №3 мерный" title не должен стоять до doctype. Такое размещение тегов приводит к переходу в режим Quirks 5 (эмуляции IE 5.5), в котором не только почти все возможности css не поддерживаются, но и имеется огромное количество всяческих багов. Скорее всего, перенос доктайпа в начало документа решит проблему со стилями.

вторник, 16 июля 2019 г.

Как сохранить excel документ с русским названием phpexcel?

Привет всем! Использую PHP, PHPExcel.
Пишу скрипт, который берёт название таблицы из базы данных и сохраняет excel документ с его именем. Название таблицы на русском.
$objWriter->save('teachears/РусскиеБУКВЫ.xlsx');//вместо РусскиеБуквы - переменная хранящая название таблицы.
На выходе - файл имеет в названии непонятные иероглифы.
Возможно ли сохранить файл с русским названием? Или придётся писать костыль для перевода на английский?

Добавлено:
$connection = new mysqli("localhost", "admin", "1234", "teachers"); $connection->set_charset("utf8"); $query1 = "SHOW TABLES FROM `teachers`"; $result = mysqli_query($connection, $query1);
while ($row1 = mysqli_fetch_array($result, MYSQL_NUM)) { $objPHPExcel->getActiveSheet()->setTitle('Демо'); $objPHPExcel->setActiveSheetIndex(0)->setCellValue('B1', 'Мир!'); ...Код наполнения файла данными... $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('teachears/'.$row1[0].'.xlsx');//где $row1[0] - название таблицы }
Собственно, содержимое файла в порядке, проблема только в названии.


Ответ

Резюмирую комментарии:
При создании файлов в php следует учитывать кодировку имени файла, поддерживаемую файловой системой и функциями операционной системы.
Например, для Windows (по признакам видно что именно в этой среде запускается скрипт топикстартером) php-скрипт должен использовать кодировку cp1251, поскольку файлы в php создаются API функцией CreateFileA (по крайней мере именно она есть в списке импорта php5ts.dll).
Задачу, указанную в вопросе, решает строка $sysFilename = iconv('UTF-8', 'CP1251//IGNORE', $dbFilename); (как верно подсказал artoodetoo).
Дополнительно может понадобиться фильтрация имен файлов на предмет содержания в них запрещенных символов (для Windows это <>:"/\|?* и "нулевой" символ), а также обрезка до разрешенной длины (для Windows - 255 символов) см. Naming Conventions
PS. На всякий случай проверил. В Windows нужно проверять длину пути. Из php файл не создается если длина пути больше 255 (что странно, в документации написано про 260 символов)

понедельник, 14 января 2019 г.

Как сделать перенос в ячейке при работе с phpexcel

Доброго всем времени суток господа Пользуюсь phpexcel'ем, причем не первый день. Одну штуковину упорно не могу найти в мануале (или нет ее там). Ищу перенос внутри ячейки. Вот допустим вам нужно вставить 200 знаков в ячейку, и они не влезают. В экселе есть кнопка - перенос текста. Вот интересует как нужную ячейку отформатировать, что бы этот перенос был. Можно ли так вообще? Смысл в том, что текст помещается в ячейке, путем автоматического переноса по строкам. Вот собственно и все, только команды не знаю, ее и спрашиваю. p.s. // выдернул из кода
// выравниваю как надо $page->getStyle("".$jax."".$stroka."")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); $page->getStyle("".$jax."".$stroka."")->applyFromArray(array("font" => array( "bold" => true)));
// вставляю данные, и проклятая переменная $for, неприлично длинная $page->setCellValue("".$jax."".$stroka."", "".$for."");


Ответ

Насколько мне не изменяет память, то так: $page->getStyle("".$jax."".$stroka."")->getAlignment()->setWrapText(true);