【2015-12-17重要更新:需要导入excel文件的请直接参阅今天写的新文章《Drupal导入Excel表格的正确姿势》。】
看到群里有人问feeds excel模块怎么用,才知道有这么个模块。正好前几天用feeds模块导入过csv文件,要是能直接导入excel表格,步骤更简化,岂不更好?于是研究了一下feeds excel模块的使用,就有了这篇文章。
一、下载、安装模块
从官网下载feeds excel(http://drupal.org/project/feeds_excel),先不要启用,因为模块依赖于phpExcelReader这个外部库。从项目页面的链接访问github,下载库文件。库文件是zip格式,用unzip解压后,将相关内容放到sites/all/libraries/phpExcelReader下面。如果原来没有libraries子目录,先手动创建。Drupal使用外部库时需要利用libraries模块,如果系统中没有,要先下载libraries模块并启用。 好了,现在可以启用feeds excel模块了。启用后,不能马上使用,必须先清空cache,否则配置feeds时会报“Missing Feeds plugin ExcelParser”错误。二、模块使用
配置完毕,应该可以用了。新建一个feed,开始一切正常,但到最后一步配置字段映射时,白屏了!!!到官网上查了查,居然全是这个问题,还没人给出解决办法,用Google满世界搜也找不到答案。只能自己想办法了。看了Apache的错误日志,提示在feeds_excel.module文件的第56行有个非对象的方法调用导致的致命错误。研究了半天feeds模块和feeds_excel模块的代码,确认是feeds_excel模块的代码有问题。真坑爹啊!推荐使用的版本居然根本不能运行!!!怎么办?凉拌。解决方法就是:使用开发版。 好了。现在可以建Feed了。Fetcher选“File upload",允许的扩展名中增加”xls“;Parser选”excel parser",parser settings的mapping mode选“rows",因为一般是将一行表格作为一个记录,其他设置按情况自行设置;Processor选”node processor",settings中选择哪种内容类型用于bundle,最后进行字段的mapping设置。 与csv文件导入的时候自己随便设置mapping中的source不同,导入excel文件时,mapping source要用表单中新增的“LEGEND SOURCE"中的token来定义,如第一列对应title,第二列对应published date,则映射定义为: [excel-row:column-1] title [excel-row:column-2] published date 以此类推。 现在就可以导入数据了,步骤跟导入csv文件是一样的。三、其他问题
在使用feeds_excel的时候,还可能会遇到一个怪异的问题,就是当执行导入操作时,表单中的”Import“按钮变成了”Importing(0%)",并且不能点击。这是在安装模块后没有先清空cache造成的,最简单的解决方法是将这个feed删除,重建一个就正常了。四、解决中文乱码问题
到目前为止,我们有了一个好消息,就是feeds_excel模块可以正常使用了。但还有一个坏消息。 因为excel文件是按GBK编码存储的,而一般说来,网站是xAMP架构的,默认的字符编码是UTF-8,这两者是不兼容的。这就导致excel文件中的汉字导入后全部乱码了。折腾了两天,最后才发现官网的issue列表中有人回答过了https://drupal.org/node/1142994,方法是升级phpExcelReader库,用更新的版本。但其实不用升级,做一点小修改就好。 feeds_excel模块的ExcelParser.inc注释第256行//$value = utf8_encode($value);第261行去掉utf8_encode函数,改成
$raw = $sheet['cellsInfo'][$row][$col]['raw'];
phpExcelReader库中的reader.php第168行由
var $_defaultEncoding;
改为
var $_defaultEncoding="UTF-8";
只所以出现这个转换错误是feeds_excel模块的作者对phpExcelReader库的理解有问题。phpExcelReader库本身支持多字节字符转换,但默认没给_defaultEncoding变量赋值,结果转换函数不做任何动作,直接返回参数值,模块作者可能也意识到字符没做转换,所以用了utf8_encoding函数做转换,但这个函数仅仅是将iso-8859-1的字符集转到utf-8,而Windows汉字是用GBK字符集,所以转换不正常。
这种改法不是很好,最好的办法是只给feeds_excel模块改动,增加一个设置编码的函数调用,不动phpExcelReader库,提供一个补丁文件就完美了。有时间再说吧。
虽然解决字符转换问题用了七八个小时,但学到不少东西,值。
五、调试环境
drupal 7.26 libraries 7.x-2.2 feeds 7.x-2.0-alpha 8 feeds_excel 7.x-1.1-beta1+7-dev六、后记
2014年4月9号上午写完了上述内容,现在,也就是4月9号晚9点20分,制作了有生以来第一个patch(见附件),不改phpExcelReader库,只改feeds_excel模块中的ExcelParser.inc文件,这样就比较完美了。也自己提了个issue发drupal.org。真是个值得纪念的日子。
Drupal 版本