PHP导入读取Excel类 – phpExcelReader

5

XLS2PHP

之前帮客户开发一个小项目,需要实现的一个功能就是,上传一个软件导出的Excel文件到服务端上,然后再读取Excel里面的内容并且写入到数据库。

GOOGLE了半天找了了传说中的phpExcelReader – 一个可以用PHP读取Excel中的数据到数组中的类。

不过作者发布的时候有几处小问题,修改并且简单汉化了一下,扔到博客上来,以备不时之需。

使用的时候最好把reader.php中头部的require_once写成真实路径。

附上下载地址:

下载地址:phpExcelReader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 测试文档
require_once 'Excel/reader.php';
 
// Excel文件($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();
 
// 设置输入编码 UTF-8/GB2312/CP936等等
$data->setOutputEncoding('UTF-8'); 
 
/***
* 如果服务器不支持 iconv 添加下面的代码使用 mb_convert_encoding 编码
* $data->setUTFEncoder('mb');
*
**/
 
/***
* 默认情况下行和列的技术从1开始
* 如果要修改起始数值,添加:
* $data->setRowColOffset(0);
*
**/
 
/***
*  设置工作模式
* $data->setDefaultFormat('%.2f');
* setDefaultFormat - 最大兼容模式
*
* $data->setColumnFormat(4, '%.3f');
* setColumnFormat - 列的格式设置(仅适用于数字字段)
*
**/
 
$data->read('jxlrwtest.xls');
 
/*
 $data->sheets[0]['numRows'] - 行数
 $data->sheets[0]['numCols'] - 列数
 $data->sheets[0]['cells'][$i][$j] - 行$i 列$j里的数据
 
 $data->sheets[0]['cellsInfo'][$i][$j] - 文件的拓展信息
 
    $data->sheets[0]['cellsInfo'][$i][$j]['type'] = "date" | "number" | "unknown"
    	当type为unknown时使用raw值,因为元素中包含'0.00'的格式。
    $data->sheets[0]['cellsInfo'][$i][$j]['raw'] = 未被格式化的值
    $data->sheets[0]['cellsInfo'][$i][$j]['colspan'] 
    $data->sheets[0]['cellsInfo'][$i][$j]['rowspan'] 
*/
 
error_reporting(E_ALL ^ E_NOTICE);
 
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
	for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
		echo "\"".$data->sheets[0]['cells'][$i][$j]."\",";
	}
	echo "\n";
 
}
 
//print_r($data);
//print_r($data->formatRecords);

另附一段网上传的导出 csv 的代码

<?php
// 输出Excel文件头,可把user.csv换成你要的文件名
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="user.csv"');
header('Cache-Control: max-age=0');
include './Mysql.class.php';//mysql 用你自己的操作类就可以
$db = new mysql();
// 从数据库中获取数据,为了节省内存,不要把数据一次性读到内存,从句柄中一行一行读即可
$sql = 'select id,user_login from wp_users';
$stmt = $db->getAll($sql);
 
// 打开PHP文件句柄,php://output 表示直接输出到浏览器
$fp = fopen('php://output', 'a');
 
// 输出Excel列名信息
$head = array("id", "姓名");
foreach ($head as $i => $v) {
    // CSV的Excel支持GBK编码,一定要转换,否则乱码
    $head[$i] = iconv('utf-8', 'gbk', $v);
}
 
// 将数据通过fputcsv写到文件句柄
fputcsv($fp, $head);
 
// 计数器
$cnt = 0;
// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit = 100000;
 
// 逐行取出数据,不浪费内存
$count = count($stmt);
for($t=0;$t<$count;$t++) {
 
    $cnt ++;
    if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题
        ob_flush();
        flush();
        $cnt = 0;
    }
    $row = $stmt[$t];
    foreach ($row as $i => $v) {
        $row[$i] = iconv('utf-8', 'gbk', $v);
    }
    fputcsv($fp, $row);
}

共 5 条评论

  1. 回复

    http://www.9958.pw/post/php_excel 可以参考参考

  2. 回复

    你好,我朋友参考这个做了一个应用,是读取查询excel的内容的,可是有个问题
    放虚拟主机里可以运行,放本地phpnow里却不行(其他程序没问题)
    能帮我看看吗,源码链接在http://www.kuaipan.cn/file/id_1242173261480274.html
    有结果邮件告诉我[email protected]或QQ联系我719264310

    • 回复

      虚拟主机可以运行说明代码没有问题,PHPNOW没配置好吧。

  3. 回复

    嗯?做好友链了?

    • 回复

      做好了。欢迎常来。

朽木进行回复 X

您的邮箱不会公开,当您的评论有新的回复时,会通过您填写的邮箱向您发送评论内容。 必填字段 *

为何看不到我发布的评论?

正在提交, 请稍候...