Как использовать цикл mysql while с классом xlsxwriter?

Я использую xlsxwriter, но у меня ничего не работает, я пробовал дюжину вещей для передачи данных строки базы данных mysql в данные строки excel, но ничего не сработало :(

<?php
include_once("xlsxwriter.class.php");
include("connection.php");
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL & ~E_NOTICE);

$filename = "PM.xlsx";
header('Content-disposition: attachment; filename = "'.XLSXWriter::sanitize_filename($filename).'"');
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');


$rows = array(); 

                   $sql = "SELECT DATE_FORMAT(jobcard.Open_date_time,' %d-%b-%y') AS datee,vehicles_data.Frame_no, jobcard.Jobc_id,jobcard.serv_nature,jobcard.Customer_name,jobc_invoice.Lnet, jobc_invoice.Pnet, jobc_invoice.Snet, jobcard.Mileage,customer_data.cust_type,vehicles_data.model_year,jobcard.Veh_reg_no,jobcard.comp_appointed, customer_data.mobile,IF(variant_codes.Make IS NULL,'Others',variant_codes.Make) as make FROM `jobcard` LEFT OUTER JOIN jobc_invoice ON jobcard.Jobc_id=jobc_invoice.Jobc_id LEFT OUTER JOIN vehicles_data ON jobcard.Vehicle_id=vehicles_data.Vehicle_id LEFT OUTER JOIN variant_codes ON vehicles_data.Model=variant_codes.Model LEFT OUTER JOIN customer_data ON jobcard.Customer_id=customer_data.Customer_id ORDER BY `make` ASC";

                   $result=mysqli_query($conn,$sql) or die(mysqli_error($sql));
 while($rowz = mysqli_fetch_row($result))
                   {
                        $rows[] = $rowz;
                   }



$writer = new XLSXWriter();
$writer->setAuthor('Some Author'); 
foreach($rows as $row)
    $writer->writeSheetRow('Sheet1', $row);
$writer->writeToStdOut();

exit(0);

Даже пробовал это, играя с массивами, но пока ничего не получилось.

$row_excel=array();
$row_numb=0;
 $writer = new XLSXWriter();
$writer->setAuthor('Some Author');             
                   $result=mysqli_query($conn,$sql) or die(mysqli_error($sql));
 while($row = mysqli_fetch_row($result))
                   {
                       $row_excel[$row_numb]=$row;
                       $writer->writeSheetRow('Sheet1', $row_excel[$row_numb]);

$ row_numb ++; }

$writer->writeToStdOut();
exit(0);

Что произойдет, если это «не сработает»? Есть ли какое-нибудь сообщение об ошибке? Вы проверили, возвращает ли сам запрос к базе данных правильные строки?

Nico Haase 02.05.2018 09:37

Да, я проверяю, что запрос работает нормально, но проблема с созданием кода, это Excel не может открыть файл, потому что расширение файла недействительно или файл поврежден.

Rocky Rock 02.05.2018 09:44

Что вместо этого содержится в файле? Вы пробовали открыть его с помощью Блокнота?

Nico Haase 02.05.2018 09:47

нет, сэр, я сейчас проверю

Rocky Rock 02.05.2018 09:51

он показывает какой-то нечитаемый текст, файл 65 КБ.

Rocky Rock 02.05.2018 09:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
431
3

Ответы 3

попробуй это:

while ($row = mysqli_fetch_row($result)) {

    $data = array();

    for ($i = 0; $i < mysqli_num_fields($result); $i++) {
        $data[$i] = $row[$i];
    }

    $writer->writeSheetRow('Sheet1', $data);
}

$writer->writeToStdOut();
exit(0);

Спасибо за ваше время, я пробовал, но файл Excel по-прежнему не открывается, а блокнот пуст.

Rocky Rock 02.05.2018 10:25

Думаю, проблема в ваших данных. Можете ли вы показать нам результат, если напечатаете строку $ row?

Kevin Adlaon 02.05.2018 10:40

Да, верно, я забыл связать запрос с переменной $ result. теперь блокнот показывает нечитаемый текст размером 65 КБ, но Excel по-прежнему говорит о своем прерванном файле и не отображает в нем данные :(

Rocky Rock 02.05.2018 11:34

даже пробовал это ... $ writer-> writeSheetRow ('Sheet1', $ data [$ i]); но по-прежнему показывает, что файл прерван.

Rocky Rock 02.05.2018 11:57

Возможно, в ваших данных есть специальные символы, которые могут вызвать ошибку в функции writeCell в xlsxwriter.

Kevin Adlaon 04.05.2018 03:15
$data = array();
  $result=mysqli_query($conn,$sql) or die(mysqli_error($sql));

while ($row = mysqli_fetch_row($result)) {


echo "<br/>";
    for ($i = 0; $i < mysqli_num_fields($result); $i++) {
        $data[$i] = $row[$i];
        echo $row[$i];
    }

}

Я попробовал этот код, и он показывает мне данные из базы данных.

Привет, я даю ответ на немного старый вопрос, но это может помочь кому-то, если у меня такая же проблема, как у @Rocky Rock и у меня.

Кроме того, мне приходится обрабатывать большое количество строк, например от 50 000 до 100 000. Поэтому я даже попробовал некоторые другие решения, такие как фрагмент моего результата, попытался экспортировать в CSV и т. д. И т. Д.

Я также пробовал все с принудительной загрузкой с заголовком и $ writer-> writeToStdOut (); но всякая логика напрасна.

Но, в конце концов, после дня или двух работ я закодировал как отдать и избавиться от всего, поверьте мне, он также может загрузить 100 000 строк всего за 20 секунд. Это мой код, поэтому вместо переменных сеанса запроса и имени файла вы можете использовать все, что захотите. Также я бы поставил некоторую фиктивную переменную, как для одного из наших клиентов.

<?php
    include your required libraries..

    include_once("lib/xlsxwriter.class.php");
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset = "utf-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <meta http-equiv = "X-UA-Compatible" content = "IE=edge">
    <title>Download IDs</title>

</head>
<body>

        <?php
            $sqlsel = $_SESSION['rptQry'];
            $ressql = mysqli_query($sqlsel);
            $currentdt = date('Ymdhis');
            $filename = $currentdt."_".$_SESSION['rptFileName'];
            $header = array(
                'Header1'=>'integer',               
                'Header 2'=>'integer',              
                'Header 3'=>'string',
                'Header 4' =>'string'
            );      

            $dataArray = array();

            $writer = new XLSXWriter();
            $writer->setAuthor('Adaptable Services');
            $writer->writeSheetHeader('ExportedIDs', $header);

            while($res = mysqli_fetch_array($ressql)){
                $writer->writeSheetRow('Sheet1',$res);
            }

            $writer->writeToFile('/var/www/html/tmpxls/'.$filename);
            echo '<script>location.href = "www.example.com/tmpxls/'.$filename.'";</script>';
        ?>

</body>
</html>

Другие вопросы по теме