PHPExcel导出Excel文件时出现错误的解决办法

 更新时间:2016年11月25日 17:39  点击:2337
phpexcel文件是一款开源的php表格操作插件,只要用到excel数据导入导出的朋友大多数人都选择此款插件了,但在使用中也会有问题出现,下面来看问题分析研究。

PHPExcel是PHP中功能最强大的导入、导出、操作Microsoft Excel的开源项目。但是它体系复杂,有时会让人难以掌控。


PHPExcel导出Excel表的使用方法网上已经很多了,本文就不赘述。不过,在使用过程中,我却发现了一个莫名其妙的问题:那就是使用PHPExcel自动导出excel的文件有时候能够正常导出并打开,有时候生成的excel文件却无法打开,Excel2007提示“发现无法读取的内容”。

使用文本编辑器打开生成的Excel文件,发现一行提示“Fatal error: Call to a member function setValue() on a non-object in PHPExcel/Calculation/FormulaParser.php on line 431”。

经过仔细而又痛苦的检查发现,原来是因为在写入单元格的文本值中,有些值以等号开头,例如“====中国青年报...”,结果PHPExcel在写入这个单元格的时候,将其判定为公式,于是调用公式解析器去计算相应的值,但是又无法正确进行计算(因为本来就不是公式嘛),所以就导致生成的excel文件无法打开。

解决办法非常简单

就是在往excel单元格写入文本值之前,先过滤掉等号“=”,即可。

 

以下是两种错误的解决办法:

(1)Fatal error: Maximum execution time of 30 seconds exceeded解决错误方法
需要修改php.ini文件,如果是使用Ubuntu 9.04 Server的服务器,可以在/etc/php5/apache2/下找到php.ini文件,如果是Freebsd,可以在/usr/local/lib/下找到php.ini文件。使用sudo权限编辑下面的语句:

将如下语句:
max_execution_time = 30
修改为:
max_execution_time = 300
也就是将PHP脚本最长执行时间从30秒延长到300秒。

然后重启一下Apache服务器,如果是Ubuntu Server的服务器,可以使用如下命令:
sudo /etc/init.d/apache2 restart

(2)Fatal error: Allowed memory size of 16777216 bytes exhausted 的解决办法
一样地需要修改php.ini文件:

将如下语句:
memory_limit = 16M
修改为:
memory_limit = 512M

也就是将PHP脚本所能够申请的内存从16M扩大到512M。具体数字可以根据自己的需要确定。

一样需要重启Apache服务器。

需要注意的是:
(1)以上的修改可能存在一定风险,例如给服务器造成过大的负担。所以请再三确认是否有必要给PHPExcel或者是其他PHP程序开放更大的内存空间以及更长的执行时间。
(2)修改完php.ini之后,只有重启Apache之后,新的设置才会生效。
(3)php.ini中的设置,请根据自己服务器的情况量力而行。

php在使用ZipArchive类时出现Fatal error: Class ZipArchive not found错误提示,下面我们来介绍在linux 与windows中的解决办法。

出现这个错误说明是程序在调用'ZipArchive' 这个类的时候没有成功,原因是由于在安装php的时候没有增加php zip的支持(非zlib)。

在Windows下的解决办法是:

1、在php.ini文件中,将extension=php_zip.dll前面的分号“;”去除,然后同样在php.ini文件中,将 zlib.output_compression = Off 改为 zlib.output_compression = On ;

2、重启Apache服务器。

在Unix/Linux下的解决办法:

1、在Linux下没有php_zip.dll这个文件(有也不会起作用的),所以需要重新编译一下php的zip模块。具体安装方法如下:

 代码如下 复制代码

cd /usr/src
wget http://pecl.php.net/get/zip
tar -zxvf zip
cd zip-1.x.x
phpize
./configure
make
sudo make instal

其中, 在最后使用make install命令的时候,可能需要用到root的权限,所以建议使用sudo来运行。安装完之后,屏幕上会提示zip.so的位置。然后将其记录下来,如:/usr/local/lib/php/extensions/zip.so。

2、使用root权限修改php.ini(通常可能会在/usr/local/lib/文件夹下,不过视当初安装php而定,可以通过phpinfo()来查看):

增加

 代码如下 复制代码
extension = /usr/local/lib/php/extensions/zip.so

,然后同样在php.ini文件中,将

 代码如下 复制代码
zlib.output_compression = Off

改为

 代码如下 复制代码
zlib.output_compression = On ;

3、最后别忘了重启一下Apache:apachectl restart;

这个针对php的zip模块就安装完成了,能够在php中使用ZipArchive类了

php + mssql 让真让人痛苦。这些读 php 读 mssql 的 ntext 字段类型问题又来了:当 ntext 的内容过长时,居然读不完整。

在网上找了很久,都是说 php 读 ntext 出错的,但没发现我的页面出错,就郁闷了。后来才查到是说 php 默认最大只能读 4K 的内容,原来是我的内容超过了 4K。修改方法如

下:

1、把 php 升级到 php5 。

    还好,我的已经是 php5 了。

2、调整 php.ini 的参数,把 php 默认最大只能读 4K 改大一点。

    ; Valid range 0 - 2147483647.  Default = 4096.
    ;mssql.textlimit = 4096

    ; Valid range 0 - 2147483647.  Default = 4096.
    ;mssql.textsize = 20480

 

    把 mssql.textlimit  和 mssql.textsize 前面的“;“去了,再把默认值勤改大一点,比如 20480 (20K)

3、重启 web 服务器。


本以为激动人心的时刻会来临,运行 php 页面,效果还是跟以前一样,字段数据没有完全读出来。后来又找到资料说 php 对 ntext 的支持不是很友好,要转为 text。于是又用

Convert(text, content) 转了,无效果不说,还差一点把我的 iis 弄死。在网上找了很久都无解。就在我打算放弃时,一个尝试的概念让我把数据库连接方式改了一下。我把

odbc_connect 改为 mssql_connect 居然就成功了。

 

php 链接mssql问题 ntext不能读取


明明可以链接到数据库,却不能读取的数据。Google,百度一番之后终于知道了,原来是php读取mssql的 ntext字段反回值为空的,建议可以把ntext字段改成 text。

如果是表里面没有ntext字段,可以用以下代码:

 代码如下 复制代码

// Connect to MSSQL

$link = mssql_connect(‘KALLESPCSQLEXPRESS’, ‘sa’, ‘phpfi’);

if(!$link    !mssql_select_db(‘php’, $link))

{

die(‘Unable to connect or select database!’);

}

// Do a simple query, select the version of

// MSSQL and print it.

$version = mssql_query(‘SELECT @@VERSION’);

$row = mssql_fetch_array($version);

echo $row[0];

// Clean up

mssql_free_result($version);

?》

如果表里面有ntext军字段,且不好修改回text字段, 可以如下:

1.修改 php.ini

打开php.ini

找到:

;mssql.textlimit = 4096

改为

mssql.textlimit = 2147483647

找到:

;mssql.textsize = 4096

改为

mssql.textsize = 2147483647

2.可以使用修改字段,由于sql server中,ntext和nvarchar字段是用unicode编码存储内容的,因此php通过mssql扩展读取带ntext和nvarchar类型字段的时候会抱错。

如果 title 字段类型为 nvarchar,content 字段类型为 ntext ,那么下面的sql语句会报错:

错的:

select title,content from article

正确的:

 代码如下 复制代码
select convert(varchar(255),title) as title, convert(text,content) as content from article

{这个方法不太实用,如果ntext内容 太长 转换之后会丢失数据,也就说过长的文章被截断了,而且在sql2008中 把ntext改成 nvarchar(max) 也不行}

3.如果你是虚拟主机,可以使用adodb 组件来读取。如果你主机不支持,目前笔者也没办法了。

 代码如下 复制代码

include(“adodb/adodb.inc.php”); //包含adodb类库文件

$conn=NewADOConnection(‘odbc_mssql’); //连接SQL Server数据库

$conn-》Connect(“Driver={SQL Server};Server=localhost;Database=mydb;”,‘username’,‘password’);

{使用adodb有一点要注意,使用adodbPHP连MSSQL的前提是驱动问题,5.2.10之前,PHP自带的驱动只支持MSSQL 7.0,如果要支持MSSQL 2000,需要将MSSQL 2000的ntwdblib.dll(2000.80.2039.0)复制到System32或者PHP目录下
5.2.11才支持MSSQL 2000,如果需要支持MSSQL 2005和2008,需要安装微软提供的驱动

所以如果是虚拟主机基本没办法

}

?>

 

读取mssql的ntext字段反回空置


在测试的时候明明可以链接到数据库,但是怎么也读取不到数据。经过查找资料发现原来是php读取mssql的 ntext字段反回值为空的,建议可以把ntext字段改成 text。

如果是表里面没有ntext字段,可以用以下代码:

 代码如下 复制代码

// Connect to MSSQL
$link = mssql_connect('KALLESPCSQLEXPRESS', 'sa', 'phpfi');

if(!$link    !mssql_select_db('php', $link))
{
die('Unable to connect or select database!');
}

// Do a simple query, select the version of
// MSSQL and print it.
$version = mssql_query('SELECT @@VERSION');
$row = mssql_fetch_array($version);

echo $row[0];

// Clean up
mssql_free_result($version);
?>
 


如果表里面有ntext军字段,且不好修改回text字段, 可以如下:

1.修改 php.ini

打开php.ini

找到:

;mssql.textlimit = 4096 


改为

mssql.textlimit = 2147483647


找到:

;mssql.textsize = 4096 


改为

mssql.textsize = 2147483647


2.可以使用修改字段,由于sql server中,ntext和nvarchar字段是用unicode编码存储内容的,因此php通过mssql扩展读取带ntext和nvarchar类型字段的时候会抱错。

如果 title 字段类型为 nvarchar,content 字段类型为 ntext ,那么下面的sql语句会报错:

错的:

select title,content from article


正确的:

 代码如下 复制代码
select convert(varchar(255),title) as title, convert(text,content) as content from article

3.如果你是虚拟主机,可以使用adodb 组件来读取。如果你主机不支持,目前笔者也没办法了。

 代码如下 复制代码
include("adodb/adodb.inc.php"); //包含adodb类库文件
$conn=NewADOConnection('odbc_mssql'); //连接SQL Server数据库
$conn->Connect("Driver={SQL Server};Server=localhost;Database=mydb;",'username','password');
?>

 

ecshop分类树显示所有分类的解决方法 有需要的朋友可参考一下本文章。

解决方法如下:
比如在goods.php里,

 代码如下 复制代码
 $smarty->assign('categories',         get_categories_tree());  // 分类树

大概在128行。找下就有了


 代码如下 复制代码
$smarty->assign('categories', get_categories_tree($goods['cat_id']));

改为

 代码如下 复制代码
$smarty->assign('categories', get_categories_tree());

主要就是把goods['cat_id']或得的ID去掉就可以了!

之后清缓存再看下前台,是不是已经变化了呢

注:到这里只解决了一半,还要在category.php进行一样的操作,这样在分类页也显示所有分类了。

 

还有更简单的办法就是修改 get_categories_tree 函数,是水神提醒我的。修改如下:

 代码如下 复制代码
    if ($cat_id > 0)
    {
        $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";
        $parent_id = $GLOBALS['db']->getOne($sql);
    }
    else
    {
        $parent_id = 0;
    }

找到这段判断语句,注释掉,再加上


    // 添加设置,读出所以分类
    $parent_id = 0;

经过一时间的 php + mssql,感觉 mssql 对编码的支持不是很好(其实还是自己没有把握好啦),但是又还没有来得急换数据库,只能将就点,今天又在提交数据时出现了错误。

经过一时间的 php + mssql,感觉 mssql 对编码的支持不是很好(其实还是自己没有把握好啦),但是又还没有来得急换数据库,只能将就点,今天又在提交数据时出现了错误。

由于提交的 ntext 字段的内容比较多,大约有 220 KB,所以造成了我的误解,以为是文章太长而引起的错误。我一看 php 配置,发现  php 对 mssql.textsize 的支持已经在 400 K了,怎么还出错?开启错误后才发现,原来不是文章太长,而是编码引起的错误。错误如下:

 代码如下 复制代码
Notice: iconv() [function.iconv]: Detected an illegal character in input string in...。

 英文实在太烂,只是知道 iconv() 函数出问题。google 翻译,说是输入字符串中检测到非法字符。恍然大悟。

根据错误提示到网上找到问题的解决办法,就是在 iconv() 的第二个参数加个 //IGNORE ,就是忽略错误的意思。代码如下:

 代码如下 复制代码
iconv("utf-8", "gbk//IGNORE", $str);

测试,提交成功。

注:网友经验,gbk 的范围比 gb2313 大,所以用 gbk 编码的出错率比 gb2313 小。

[!--infotagslink--]

相关文章

  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • phpexcel导出数据身份证后四位0000解决办法

    在php中我们如果要导入excel数据我们通常会使用phpexcel插件了,但是有朋友会发与使用phpexcel导出数据出现身份证后四位是0000情况了,下面我们就来看解决办法。 最...2016-11-25
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • Perl CPAN::Modulelist的解决办法

    今天用CPAN安装Term::ReadLine,报了个这样的错误 Going to read /root/.cpan/sources/modules/03modlist.data.gz Can't locate object method "data" via package "C...2016-11-25
  • phpStudy访问速度慢和启动失败的解决办法

    下面给大家介绍phpstudy访问速度慢的解决办法。1、修改mysql数据库链接地址为ip地址127.0.0.1。2、使用最新版本,这个坑了我好久时间。下面一段内容是关于phpstudy启动失败的解决办法。php5.3、5.4和apache都是用vc9编...2015-11-24
  • PHP Curl出现403错误的解决办法

    自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31
  • PHP判断上传文件类型的解决办法

    分享给大家php判断上传文件类型的方法,大家一起学习学习。/** * 读取文件前几个字节 判断文件类型 * @return String */ function checkTitle($filename){ $file=fopen($filename, "rb"); $bin=fread($file, 2); /...2015-10-21
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • PHP页面转UTF-8中文编码乱码的解决办法

    对于乱码这个问题php开发者几乎都会有碰到过,我们下面主要是介绍了php文件乱码和页面乱码。PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题...2015-10-21
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • Ubuntu15下mysql5.6.25不支持中文的解决办法

    apt-get install 安装的,不是源码包安装的mysql1 修改mysql的配置文件/etc/mysql/conf.d/mysql.cnf在[mysql]的下方加入如下语句:(注:这个文件下没有配置,只有【mysql】)no-auto-rehash default-character-set=utf8/etc/...2015-10-21
  • php mail发邮件标题中文乱码的问题解决办法

    本文章来给大家介绍php mail发邮件标题中文乱码的问题解决办法,希望到此类问题的朋友可进入参考。 当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码...2016-11-25
  • FlashFXP连接站点中文显示乱码解决办法

    FlashFXP是一款常用的服务器客户连接软件了,我们可以通过FlashFXP来上传或下载文件,但有一些朋友使用FlashFXP时碰到中文目录或文件名乱码问题,那么要如何来解决呢?具体就...2016-10-10
  • 帝国cms 从6.6升级到7.0 出现的错误及解决办法

    刚升级一会就出现 Multiple primary key definedalter table ***_ecms_infoclass_shop change classid classid int(10) unsigned NOT NULL default '0', DROP INDEX clas...2013-05-20
  • Fatal error: Cannot redeclare class 原因分析与解决办法

    我使用的都是php __autoload状态自动加载类的,今天好好的程序不知道怎么在运行时提示Fatal error: Cannot redeclare class 了,看是重复定义了类,下面我来分析一下解决办...2016-11-25
  • ecshop后台登录超时session过期的解决办法

    可能有不少用户会发现自己的ecshop经常会使用关就超时了,这个问题解决办法有很多种,我们可以直接在ecsho中进行修改,具体方法如下 在includescls_session.php中修改...2016-11-25