原生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实现jQuery扩展函数
Oct 30 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
Apr 17 PHP
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
php函数重载的替代方法--伪重载详解
May 08 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
PHP中for循环与foreach的区别
Mar 06 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
php 多线程上下文中安全写文件实现代码
2009/12/28 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
php常用数组函数实例小结
2016/12/29 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
js option删除代码集合
2008/11/12 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
python中split方法用法分析
2015/04/17 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
PageFactory设计模式基于python实现
2020/04/14 Python
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
欧尚俄罗斯网上超市:Auchan俄罗斯
2018/05/03 全球购物
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
暑期实习鉴定
2013/12/16 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书
2014年安全生产责任书
2014/07/22 职场文书
运动会演讲稿100字
2014/08/25 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
贷款担保书范本
2015/09/22 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
Python办公自动化之Excel(中)
2021/05/24 Python
详解Laravel制作API接口
2021/05/31 PHP