PHP 创建的 Excel 工作表在打开时出现错误

2023-12-01

所以,我当前的代码可以 100% 运行,文件已创建并在 Excel 中打开。但打开后,会出现一些错误,必须单击才能打开该文件。它们如下:

“address-book.xls”的文件格式和扩展名不匹配。该文件可能已损坏或不安全。除非您信任其来源,否则请勿打开它。您还想打开它吗?

Then:

Excel 检测到“address-book.xls”是 SYLK 文件,但无法加载它。文件有错误或不是 SYLK 文件格式。单击“确定”尝试以其他格式打开文件。

最后:

“address-book.xls”的文件格式和扩展名不匹配。该文件可能已损坏或不安全。除非您信任其来源,否则请勿打开它。您还想打开它吗?

之后才不情愿地打开。这是创建它的代码。 任何有关格式化电子表格的帮助(例如使单元格足够大以容纳内容)都会很棒。但消除打开时的错误是我的首要任务。

<?PHP
require_once('conn.php');

$colnames = array(
    'id' => "ID",
    'Title' => "Title",
    'First_Name' => "First name",
    'Last_Name' => "Last Name",
    'Address' => "Address",
    'City' => "City",
    'State' => "State",
    'Zipcode' => "Zipcode",
    'Home_Phone' => "Home Phone",
    'Cell_Phone' => "Cell Phone",
    'Email1' => "Email #1",
    'Email2' => "Email #2"
);

function map_colnames($input){
    global $colnames;
    return isset($colnames[$input]) ? $colnames[$input] : $input;
}
function cleanData(&$str){
    $str = preg_replace("/\t/", "\\t", $str);
    $str = preg_replace("/\r?\n/", "\\n", $str);
    if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
}

$filename = "address-book";

header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=".$filename.".xls"); 
header("Pragma: no-cache"); 
header("Expires: 0");
$flag = false;
$sql = "SELECT * FROM ".$sDB_table." ORDER BY Last_Name";
$query = $sDBConn -> prepare($sql);
$query -> execute();
while(false !== ($row = $query->fetch(PDO::FETCH_ASSOC))) {
    if(!$flag){
        $firstline = array_map(__NAMESPACE__ . '\map_colnames', array_keys($row));
        echo implode("\t", $firstline) . "\r\n";
        $flag = true;
    }
    array_walk($row, __NAMESPACE__ . '\cleanData');
    echo implode("\t", array_values($row)) . "\r\n";
}
exit;

?>

PHPExcel 错误:

$colnames = array("Title","First name","Last Name","Address","City","State","Zipcode","Home Phone","Cell Phone","Email #1","Email #2");
$col = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

// Add Headers
for($i=0;$i<count($colnames);$i++){
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue($col[$i]."1", $colnames[$i]);
}

$sql = "SELECT * FROM ".$sDB_table." ORDER BY Last_Name";
$query = $sDBConn -> prepare($sql);
$query -> execute();

$rownum = 1;
//Add Content
while(false !== ($row = $query->fetch(PDO::FETCH_ASSOC))) {
    $rownum++;
    for($i=0;$i<count($row);$i++){
        $objPHPExcel->setActiveSheetIndex(0)
                    ->setCellValue($col[$i]."".$rownum, $row[$i]);        
    }
}

当它遇到 while 语句时就会发生错误,如果我去掉那部分,它就会起作用。


问题是ID作为文件的前两个字节。这是 SYLK 文件的签名,SYLK 文件是 Multiplan 使用的一种旧电子表格格式(符号链接交换 - SYLK - 文件格式),它是 Microsoft Excel 的前身。

解决这个问题最简单的方法就是避免ID作为您的标题,并使用Id(IIRC,SYLK 签名区分大小写)或Key或其他一些文本值


您正在使用以下命令保存文件xls扩展名,但实际上您并没有使用 Excel 格式,而只是使用 csv 格式;所以 MS Excel 会抱怨格式与扩展名不匹配...或者将扩展名更改为.csv匹配您正在创建的文件的实际格式;或创建真正的 BIFF 格式的 Excel 文件


Any help with formatting the spreadsheet, such as having the cells be big enough for the content would be great.

您使用的格式 csv(带有制表符分隔符)不支持任何类型的格式,包括列宽。如果您想要这样,那么您需要切换到真正的电子表格格式(巧合的是,SYLK 是真正的电子表格格式,尽管它相当过时,我不会特别推荐它),例如用于真正的 xls 文件的 BIFF,用于 xlsx 的 OfficeOpenXML文件,OASIS 用于 ods 文件。


我用于 OfficeOpenXML xlsx 文件的标头:

// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="01simple.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 创建的 Excel 工作表在打开时出现错误 的相关文章

  • Mysql - 如何比较两个 Json 对象?

    将整个 MySql json 列与 json 对象进行比较的语法是什么 以下不起作用 select count criteria from my alerts where criteria industries 1 locations 1
  • 配置 .htaccess 以在 PHP 框架 (Silex) 上工作

    我的 Apache2 本地主机 linux 上有一个工作路径 http localhost lab silex web index php hello name 我想成为 http localhost lab silex hello nam
  • 如何从字符串中只获取数字? [复制]

    这个问题在这里已经有答案了 我有这样的字符串 第 001 课 完成 在这种情况下 我只想获取数字部分001 我试过这个 str the title preg match all d str matches number implode ma
  • WHERE 子句或 ON 子句中的 INNER JOIN 条件?

    我今天输错了一个查询 但它仍然有效并给出了预期的结果 我的意思是运行这个查询 SELECT e id FROM employees e JOIN users u ON u email e email WHERE u id 139840 但我
  • jQuery和PHP中如何知道返回数据是Json还是String?

    我想在客户端 jQuery 检查 PHP 函数返回的数据是否是 Json 对象或 String 来分配不同的函数 如果 json 的格式不正确 jQuery 的 parseJson 将生成异常 您可以将调用包装在 try catch 块中
  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • 从提交的表单中转义字符串中的字符

    每次发布帖子时 我都会得到转义字符 gt gt gt 我有一个多步骤表单 它将数据从一种表单传输到另一种表单 我将这些值与准备好的语句一起保存在数据库中 数据库中的值当前看起来像Paul s House 用户应该可以在字符串中使用单引号和双
  • Propel Query 中的动态表名称

    我想知道您是否可以使 propel 查询的表名称动态化 有点像变量 一个例子类似于 DynamicVar Query create 我让它在 ifs 中工作 就像下面的例子一样 但如果更动态地制作 可以删除相当多的行 这些表的设置都是相同的
  • CSV 从 UTF8 到 ISO-8859-1

    我正在尝试修改我的 CSV 导出 但它不会将我的 CSV 从 UTF 8 转换 保存为 ISO 8859 1 请问我做错了什么吗 实际上自从修改了这个之后 我得到了一个空的 CSV 文件 php 7 0 x function my Gene
  • WAMP 不显示目录列表中的图标

    过去 我通过 vmware 处理 PHP 代码 但最近我决定转而通过 WAMP 在 Windows 8 1 上 在本地进行处理 我创建了一个空文件夹tests in the www folder 然后在我的浏览器上输入http localh
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • Yii2 DropDownList Onchange 更改自动完成小部件“源”属性?

    我已经尝试过这个 yii2 依赖的自动完成小部件 https stackoverflow com questions 27025791 yii2 dependent autocomplete widget 但我不知道为什么它不起作用 这是我
  • 在无文本搜索查询中使用 sphinx 与 MySQL

    我有这样的疑问 假设我有一个大表 与一个较小的用户表有关系 这个想法是在那个真正的大表中搜索大于给定日期的日期并按分数 例如大整数 排序 并同时获取相关的用户信息 此查询的结果大约每 10 分钟就会更改一次 所以 没有文本搜索 但我有一个非
  • 将秒转换为天、小时、分钟和秒

    我想转换一个变量 uptime这是秒 分为天 小时 分钟和秒 Example uptime 1640467 结果应该是 18 days 23 hours 41 minutes 这可以通过以下方式实现DateTime http php net
  • 在 MySQL 中搜索多个单词

    我使用 HTML 表单来允许用户查找数据库表中的条目
  • 如何使用 PDO 动态构建查询

    我正在使用 PDO 并想做这样的事情 query dbh gt prepare SELECT FROM table WHERE column value query gt bindParam table tableName query gt
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • 修剪工作簿中的所有单元格(VBA)

    我尝试向一直在开发的 Excel 加载项添加功能 该功能会修剪已用单元格末尾的前导空格 甚至可能解析文本 我需要这样做的原因只是为了将其变成超链接我已经在工作了 但是那部分很好 这是我到目前为止所尝试的 我已经修剪了active works
  • 父子进程隔离和子进程列表

    请阅读以下模板 PID Status LPID 10 Closed 25 11 Open 25 31 Open 31 25 Closed 25 54 Open 31 17 Open 17 20 Closed 31 88 closed 77
  • 如何显示不同页眉的页面? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在为我的学校项目开发网站 但我遇到了一个问题 我在每个页面上显示一个标题 我的标题之一包含登录表单 另一标题包含用户名 搜索栏等 问题是

随机推荐

  • Msysgit bash 在 Windows 7 中慢得可怕

    我喜欢 git 并且经常在家中在 OS X 上使用它 在工作中 我们在Windows上使用svn 但希望在工具完全成熟后立即迁移到git 不仅仅是乌龟Git 而且还类似于由以下提供的非常好的 Visual Studio 集成视觉SVN 但我
  • 使用 C# 的年份差异[重复]

    这个问题在这里已经有答案了 如何计算两个日期之间的日期差 以年为单位 例如 Datetime Now Today 11 03 2007 多年 我编写了一个实现 可以正确处理相隔一年的日期 然而 与其他算法不同 它不能很好地处理负时间跨度 它
  • 如何使用类型标签/镜像在方法中获取构造函数参数?

    对于案例类别 case class MyClass param1 String param2 String 为什么采用这种反思方法 import scala reflect runtime universe import scala ref
  • 使用 PHP 查询 XML 文件

    使用PHP5有没有一种方法可以像查询数据库一样查询XML文件 如果我有一个包含 50 个酒店条目的 XML 文件 我如何查询该 XML 文件以获取特定条目 我还可以按字段 例如日期字段 重新组织 XML 条目吗 那么 如果我想按日期降序显示
  • 如何将信号 NaN 转换为安静 NaN?

    我想在 C 中将信号 NaN 转换为安静 NaN 有人可以建议一种方法吗 Thanks 我想我会扩展我的评论并提供解决方案 这里棘手的部分是能够读取 比较sNaN而不触发异常 毕竟 它被称为 信号 是有原因的 维基百科说 即使是比较操作sN
  • ASP.NET 路由:如何使routeConfig 处理更动态的URL 结构

    我的场景如下 一个场地可以属于多个类别 用户也可以在多个类别类型上添加过滤器 所以我的 URL 现在是这样的 venues beaches boats themeparks 这将显示所有海滩 船只和主题公园的场地 venues beache
  • 使用 JButton 增加/减小 textArea 内的字体大小

    我正在使用 Java 创建一个便签应用程序 我想做的事 我想增加里面文字的大小textArea每次我点击增加尺寸 显然我会知道如何做相反的事情 短代码 JButton incButton new JButton fontFrame add
  • 通过套接字接收文件,TCP 连接冻结

    我已经研究了 4 个小时的套接字 我使用的方式是只有一个应用程序作为客户端和服务器 一旦客户端连接 它就会与新客户端打开线程并等待消息 一旦消息发送到服务器 客户端就会收到响应 该部分工作正常 没有任何问题 客户主题的一部分 while t
  • 如何伪造 H2 数据库中的 ENUM 列以进行单元测试?

    我有一套玩 我已经针对 H2 数据库运行了单元测试 我已向模型中添加了一些枚举列 但由于用于创建模型表的 sql 语句 测试现在失败了 错误信息是 14 42 10 435 ERROR Unknown data type ENUM SQL
  • 将 powershell 命令的输出存储在变量中

    以下命令 sun PowerShell DateTime Today AddDays 8 ToString dd MMM yyyy echo sun 回声的输出是 PowerShell DateTime Today AddDays 8 To
  • 更改 JQuery 范围滑块图像

    我正在尝试使用 JQuery 范围滑块 可以为 手柄 其中两个 很好 但我希望两个手柄都有一个 不同的图像而不是相同的图像 左箭头和右箭头 这可能吗 Thanks 抱歉拖了一个老问题 但我想做同样的事情 不幸的是 上面的方法不起作用 因为它
  • 如何将 p 值表添加到生存图中?

    我有数据如下 library survival library survminer data aml aml x lt as character aml x aml 10 3 lt SuperMaintained aml 11 3 lt S
  • Symfony2 数据库翻译加载器未执行

    我必须实现我自己的翻译加载器 我已经使用了以下教程 http blog elendev com development php symfony use a database as translation provider in symfon
  • php 如果小写字母前面没有空格,则将字符串分解为大写

    str Hello MotoBell RingsKing Speech 如果该字符串之前存在小写字母 我需要将其分解为大写字母 像这样 splitted array 0 gt Hello Moto 1 gt Bell Rings 2 gt
  • Kafka Broker SSL - NoAuth 异常 - /brokers/ids 的 KeeperErrorCode NoAuth

    在为 Broker 到 Zookeeper 身份验证实施 SSL 时 我最终在 Broker 2 节点上出现以下异常 从 SSL 设置中 集群配置了 SSL 身份验证 Broker 1 成功连接到 Zookeeper 但在 Broker 2
  • 将多个图分组到一张图中Python

    我的函数返回 28 个图 图 但我需要将它们分组在一个图上 这是我生成 28 个图的代码 for cat in df ASS ASSIGNMENT unique a df loc df ASS ASSIGNMENT cat dates a
  • 如何使用静态数组的结束指针作为循环条件来比较 x86 中的地址?

    中的挑战问题之一从头开始编程就是 修改程序以使用结束地址而不是数字0来知道何时停止 我发现很难做到这一点 因为到目前为止这本书只介绍了movl cmpl incl 以及寻址模式 和jmp指示 基本上 下面的代码片段中的所有内容都是到目前为止
  • 使用面向对象编程将值插入数据库[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用已弃用的 mysql 函数成功重写旧的 mysql php 代码 我无法将这些值插入数据库 但是我也没有收到任何错误消息
  • 目标设置为 iOS 13 的 iOS 应用程序不会在 App Store 上提供旧版本

    I have a new app that I released for App Store that has min target set to iOS 13 In App Store Connect under Pricing and
  • PHP 创建的 Excel 工作表在打开时出现错误

    所以 我当前的代码可以 100 运行 文件已创建并在 Excel 中打开 但打开后 会出现一些错误 必须单击才能打开该文件 它们如下 address book xls 的文件格式和扩展名不匹配 该文件可能已损坏或不安全 除非您信任其来源 否