在使用PHP将一些数据从MySQL数据库表传输到可下载的excel文件时,excel文件顶部会出现一些空白行

while transferring some data from MySQL database table to a downloadable excel file using PHP , some blank rows appearing at the top in excel file

提问人:Topoti 提问时间:9/12/2023 最后编辑:Topoti 更新时间:9/13/2023 访问量:42

问:

我正在使用PHP将一些数据从MySQL数据库表传输到可下载的excel文件。

这是一个简单的代码。但是,在 Excel 文件中,总是有前 2 行,而第 3 行的前 8 个单元格(我从数据库表中检索 8 个字段)显示为空白。

然后出现第一个表记录的实际数据。

从第 4 行开始,数据被完美地显示出来,没有空白单元格。我无法找出我的错误。我请您看一下我的代码,如下所示:

    function filterData(&$val,$key){ 
      $val = preg_replace("/\t/", "\\t", $val); 
      $val = preg_replace("/\r?\n/", "\\n", $val); 
      if(strstr($val, '"')) $val = '"' . str_replace('"', '""', $val) . '"'; 
    } 

    $fileName = "transFile.xlsx" ;

    $dbObj = new dbConnect($servername,$dbname,$username,$password) ;

    $sql = "select srNo,tranDt,chqNo,particulars,dr,cr,bal,sol from transdata " ;
    $ret = $dbObj->query($sql) ;
    $exportStr = "" ;

    if($ret[0]) {
      if ($ret[1]->num_rows > 0) {
        $flag = true ;

        while ($row = $ret[1]->fetch_array(MYSQLI_ASSOC)) {
            if ($flag){
               $titles = array_keys($row) ;
               array_walk($titles, 'filterData');
               $exportStr .= implode("\t",array_values($titles)) . "\n" ;   
               $flag = false ;
            }
                    
            array_walk($row, 'filterData');
            $exportStr .= implode("\t",array_values($row)) . "\n" ;
        }
      }
      else {
        $exportStr = "No data found" ;
      }
    }

    header("Content-Type: application/vnd.ms-excel");
    header("Content-Disposition: attachment; filename='" . $fileName . "'"); 
    header("Pragma: no-cache"); 
    header("Expires: 0");

    echo $exportStr ;
    exit ; 

这是代码的结果:

将创建一个 Excel 文件,可以按预期下载。但是,第 3 行中的前 2 行和前 8 个单元格在 excel 文件中显示为空白。

我正在从数据库表中检索 8 个字段。

从第 9 个单元格开始,数据库表数据中的第一条记录将出现在第 3 行中。

从第 4 行开始,数据将正确显示。

我尝试对数据库表的字段名称进行硬编码,而不是从数据库中检索它,但它不起作用。

我在这里列出了一些来自数据库的示例源数据,以便更好地理解该问题。

|------

|专栏|类型|空|违约 |------ |//rowId//|int|否| |srNo|int|是|零 |tranDT|日期|是|零 |chqNo|int|是|零 |详情|varchar(200)|是|零 |dr|decimal(10,3)|是|零 |cr|decimal(10,3)|是|零 |bal|十进制(10,3)|是|零 |sol|decimal(10,3)|是|零 == 转储表转数据

|206|1|2023-01-01|342568759|UPI/P7B/ Kotak nami finserv|600.000|0.000|394617.480|72.000 |207|2|2023-01-01|342568758|UPI/P7B/naf bank/09356|16925.000|0.000|377692.480|2567.000 |208|3|2023-01-01|342568757|0354672900:Int.Pd:01-10-2002 至 31-12-2002|0.000|2305.000|379997.480|72.000 |209|4|2023-02-01|342568756|/NEFT/AXIR456793/HDFC BAN/HDFC BA/credit|61500.000|0.000|318497.480|72.000 |210|5|2023-04-01|342568755|/NEFT/AXIR443266699/PREETI S/IDFC BA/出租|65650.000|0.000|252847.480|72.000

谢谢 托波提

php mysql excel 导出

评论

0赞 ADyson 9/12/2023
仅供参考,您似乎实际上正在生成一个制表符分隔的文本文件。这不是一个真正的 xlsx 文件
0赞 ADyson 9/12/2023
请提供一些来自数据库的示例源数据(请作为文本表,而不是图片!!),以便我们可以看到该数据的预期输出是什么。另请参阅如何提问和如何为您的问题制作一个最小的可重现示例。您可以编辑您的帖子。谢谢。
1赞 CBroe 9/12/2023
也许您应用于每行数据的函数会为您提供“空”结果......?这不应该以这种方式开始 - fputcsv 存在(也可用于直接写入输出缓冲区,而不是文件。filterData
0赞 ADyson 9/12/2023
meta.stackoverflow.com/a/302472/5947043
0赞 ADyson 9/13/2023
I am listing here some sample source data from database...您正在以 HTML 格式将数据存储在数据库中???如果不是,你为什么要把html放到样本中?我为您提供了一个链接,该链接显示了如何在您的帖子中格式化数据表。它不涉及html

答: 暂无答案