原生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 分页类(模仿google)-面试题目解答
Sep 13 PHP
PHP实现利用MySQL保存session的方法
Aug 23 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
常用PHP框架功能对照表
Oct 23 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
PHP实现通过正则表达式替换回调的内容标签
Jun 15 PHP
详解PHP中的状态模式编程
Aug 11 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
Jan 07 PHP
php自定义函数实现二维数组排序功能
Jul 20 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
laravel 获取某个查询的查询SQL语句方法
Oct 12 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
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
js切换div css注意的细节
2012/12/10 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
管理学专业个人求职信范文
2013/09/21 职场文书
辞职信的写法
2015/02/27 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书