Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHPSReadSheet将数据数组导出到xlsx文件时出现问题_Php_Phpoffice - Fatal编程技术网

使用PHPSReadSheet将数据数组导出到xlsx文件时出现问题

使用PHPSReadSheet将数据数组导出到xlsx文件时出现问题,php,phpoffice,Php,Phpoffice,大家好,在我的项目中,我试图将数据从数据库导出到xlsx文件,但我没有得到正确的数据。我附上了数据的图像 我正在使用以下代码 use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Writer\Xls; $conn = new mysqli(DB_HOST, DB_USER, DB_PASS,

大家好,在我的项目中,我试图将数据从数据库导出到xlsx文件,但我没有得到正确的数据。我附上了数据的图像

我正在使用以下代码

    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
    use PhpOffice\PhpSpreadsheet\Writer\Xls;

    $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

    $exportArray = array();
    $query = mysqli_query($conn, "select * from table");

    if(mysqli_num_rows($query) > 0){

            while ($row = mysqli_fetch_assoc($query)) {

                    $exportArray[$exp]['id'] = $row['id'];
                    $exportArray[$exp]['name'] = $row['name'];
                    $exportArray[$exp]['address'] = $row['address'];

                    $exp++;

            }

    }
    $array = array();

    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();

    $sheet->setCellValue('A1', 'id');
    $sheet->setCellValue('B1', 'name');
    $sheet->setCellValue('C1', 'address');

    $rowCount = 2;
    foreach ($exportArray as $value) {

        $sheet->setCellValue('A' . $rowCount, $value['id']);
        $sheet->setCellValue('B' . $rowCount, $value['name']);
        $sheet->setCellValue('C' . $rowCount, $value['address']);
        $rowCount++;
    }

    $fileName = 'test123.xls';
    $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="'. $fileName .'.xlsx"'); 
    header('Cache-Control: max-age=0');
    $writer->save('php://output');
    exit();
当我看到使用下面代码的工作表数据时

$sheetData = $sheet->toArray(null, true, true, true);

print_r($sheetData);
我得到了正确的输出。一切看起来都很好,但我不明白,为什么我在工作表中获取的数据格式不正确?

试试这个:

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Helper\Sample;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$conn = new mysqli("localhost","root","root","test");
$sql = "SELECT * FROM customers";
$result = $conn->query($sql);
$write_array = array();
$fileName = "excel.xlsx";
$write_array[] = array("id","name","address");
if($result->num_rows > 0) 
{
    while($row = $result->fetch_assoc()) 
    {
        $write_array[] = array($row["id"],$row["name"],$row["address"]);
    }
}
$conn->close();
$spreadsheet = new Spreadsheet();
$spreadsheet->setActiveSheetIndex(0);
$spreadsheet->getActiveSheet()->fromArray($write_array,NULL,'A1');
$spreadsheet->getActiveSheet()->setTitle("My Excel");

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$fileName.'"');
header('Cache-Control: max-age=0');
header('Cache-Control: max-age=1');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: cache, must-revalidate');
header('Pragma: public');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');

添加此
使用PhpOffice\PhpSpreadsheet\IOFactory

现在使用以下代码以Xlsx格式导出数据

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="test.xlsx"');
header('Cache-Control: max-age=0');
header('Cache-Control: max-age=1');
header('Cache-Control: cache, must-revalidate');
header('Pragma: public');

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');

数据库中存储数据的编码方式是什么?
Content Type
对于XLSX是错误的-您为XLS指定了一种编码,并且您的文件名是
test123.XLS.XLSX
。先保存文件,然后重命名,然后双击,怎么样?前两个
PK
显示它确实是一个PKZIP文件(XLSX),但由于内容类型提示,Excel处理它的方式就好像它是。。。CSV?@lubosdz,我认为这与db无关。因为当我注释foreach循环并使用静态值时,得到的结果是相同的。顺便说一句,它是拉丁语和瑞典语_ci@AmigoJack,那是错的。当我使用$fileName='test123'时;我在文件中得到了相同的数据。您应该使用的内容类型是
application/vnd.openxmlformats officedocument.spreadsheetml.sheet
我搜索了两个小时寻找解决方案,最后找到了这个!谢谢你,成功了,现在我可以吃点东西睡觉了。