原生php实现excel文件读写的方法分析


Posted in PHP onApril 25, 2018

本文实例分析了原生php实现excel文件读写的方法。分享给大家供大家参考,具体如下:

最近在工作中遇到一个需求,需要将数据库中的数据导出到excel文件中,并下载excel文件。因为以前没做过,所以就百度了一下,网上说的大多是使用PHPExcel类来操作excel文件,这还要去下载这个类才能使用,而我只想使用原生的php,不想那么麻烦,好在也有网友说到关于原生php生成excel文件的方法,其实很简单,下面把我结合网上资料自己实践的代码分享一下。

一般我们这种导数据的操作都是通过用户在网页页面上点击某个按钮触发相应js方法,然后请求php接口来实现的,所以主要有两种方法来完成这种需求。

方法1:直接在js代码中使用window.open()打开php接口的url,即可将php生成的excel文件下载下来。

php接口代码如下:

$mysqli = mysqli_connect('localhost', 'root', '123456', 'test');
$sql = 'select * from country';
$res = mysqli_query($mysqli, $sql);
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=country.xls");
echo "code\t";
echo "name\t";
echo "population\t\n";
if(mysqli_num_rows($res) > 0) {
  while($row = mysqli_fetch_array($res)) {
    echo $row['code']."\t";
    echo $row['name']."\t";
    echo $row['population']."\t\n";
  }
}

方法2:php接口中先把生成的excel文件保存在服务器中,然后把文件路径返回给js,js再使用window.open()打开文件路径即可下载。

php接口代码如下:

$mysqli = mysqli_connect('localhost', 'root', '123456', 'test');
$sql = 'select * from country';
$res = mysqli_query($mysqli, $sql);
$file = fopen('./country.xls', 'w');
fwrite($file, "code\tname\tpopulation\t\n");
if(mysqli_num_rows($res) > 0) {
  while($row = mysqli_fetch_array($res)) {
    fwrite($file, $row['code']."\t".$row['name']."\t".$row['population']."\t\n");//这里写得不好,应该把所有文件内容组装到一个字符串中然后一次性写入文件。
  }
}
fclose($file);
echo 'http://www.jtw.com/....../country.xls';//这里返回文件路径给js

两种方法很类似,都能实现将数据库中的数据导出到excel文件中并下载文件,最终文件截图如下:

原生php实现excel文件读写的方法分析

如果有需要,还可以使用原生php对excel文件内容进行读取操作,这主要用于需要将excel文件中的数据导入到数据库中的情况。

代码如下:(这里仅展示将文件数据读取到一个数组中)

$path = './country.xls';
$file = fopen($path, 'r');
//标题行读取(第一行)
$row = fgets($file);
$row = explode("\t", $row);
$title = array();
foreach($row as $k => $v) {
  $title[$k] = str_replace("\n", '', $v);
}
//内容读取
$data = array();
$count = 0;
while(!feof($file)) {
  $row = fgets($file);
  $row = explode("\t", $row);
  if(!$row[0]) continue;//去除最后一行
  foreach($title as $k => $v) {
    $data[$count][$title[$k]] = $row[$k];
  }
  $count ++;
}
fclose($file);
echo '<pre>';
print_r($data);

不过,使用原生php生成的excel文件,存在一个问题,就是每次编辑文件之后保存文件的时候总是会出现如下截图的问题:

原生php实现excel文件读写的方法分析

也不知道是什么原因,大概是生成的文件本身存在一些问题吧。。。

而且使用原生php对生成的excel文件进行读取的时候会出现中文乱码等一些奇葩情况。所以,使用原生php生成excel文件最好仅在某种情况下使用:只是单纯地将数据从数据库导出到文件中方便查看,无需对文件进行修改,也无需对文件进行读取。这种情况使用原生php来生成excel足以满足需求,免去使用第三方类库来操作excel的麻烦。不过,若是生成之后的文件还有修改保存、读取数据的需求,那还是老老实实使用phpexcel等第三方类库来进行读写操作吧,可以避免很多让人纠结的问题。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP实现MySQL更新记录的代码
Jun 07 PHP
将数组写入txt文件 var_export
Apr 21 PHP
在PHP中养成7个面向对象的好习惯
Jul 17 PHP
php UBB 解析实现代码
Nov 27 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
详解PHP中的状态模式编程
Aug 11 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
Yii中srbac权限扩展模块工作原理与用法分析
Jul 14 PHP
php getcwd与dirname(__FILE__)区别详解
Sep 24 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
PHP操作Redis常用技巧总结
Apr 24 #PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 #PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 #PHP
php接口实现拖拽排序功能
Apr 23 #PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 #PHP
PHP生成推广海报的方法分享
Apr 22 #PHP
PHP排序算法之归并排序(Merging Sort)实例详解
Apr 21 #PHP
You might like
PHP6 mysql连接方式说明
2009/02/09 PHP
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
php文件上传类的分享
2017/07/06 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
Jquery之Bind方法参数传递与接收的三种方法
2014/06/24 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
2017/04/13 Javascript
jquery.uploadView 实现图片预览上传功能
2017/08/10 jQuery
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
Python3.x中自定义比较函数
2015/04/24 Python
python判断设备是否联网的方法
2018/06/29 Python
Python同步遍历多个列表的示例
2019/02/19 Python
python中的逆序遍历实例
2019/12/25 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
2014年高三毕业生自我评价
2014/01/11 职场文书
心理咨询承诺书
2014/05/20 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
生产设备维护保养制度
2015/08/06 职场文书