php excel文件在线预览(走过的坑)
php excel文件在线预览(走过的坑)
1.已经布好的服务如微软的Office365等平台服务
2.通过phpExcel扩展进行excel文件解析直接输出html
3通过openoffice进行文件解析转换->pdf->swf
4.读取excel文件数据返回给前端
首先感谢以往分享相关问题的小伙伴,从中收货很多部分内容也是引用了前人的内容,希望对后来的人有帮助。
1.已经布好的服务如微软的Office365等平台服务
实例:http://technet.microsoft.com/zh-cn/library/jj219456(v=office.15).aspx 只需要将自己文件地址传进去即可
这种处理方式虽然方便,但是对于公司的数据资源的保护不利,并且这些在线转换服务是收费的,如果这方面无所谓的话推荐使用。
1
2
2.通过phpExcel扩展进行excel文件解析直接输出html
不推荐:
通过文件后缀名switch case 方式创建createReader读取,这种方式不能准确的判断文件类型导致经常会读取错误,这一点很重要。
当excel中有图片解析报错未解决如果有同学解决了这个问题希望能分享出来
set_time_limit(0);
require dirname(dirname(__FILE__)) . '../../common/comp/excel/PHPExcel.php'; //更改为你的phpexcel文件地址
$sFileUrl=>''// 你文件的地址
$sFileType = PHPExcel_IOFactory::identify($sFileUrl);//获取文件类型
$objReader = PHPExcel_IOFactory::createReader($sFileType);//创建读取
$objWriteHtml=new PHPExcel_Writer_HTML($objReader->load($sFileUrl, 'UTF-8'));//加载内容
echo $objWriteHtml->save("php://output");//输出html文件到页面
1
2
3
4
5
6
7
3通过openoffice进行文件解析转换->pdf->swf
首先安装oppenoffice服务并且后台启用服务,windows平台需要安装完openOffice后,在开始–运行中输入Dcomcnfg打开组件服务。在组件服务—计算机—我的电脑—DCOMP配置中,选择openoffice service manager右键属性->安全 全部添加组或用户名Everyone,属性->标识 选择交互式用户,linux系统配置自行查找一下相对windows要简单很多(此步骤解决报错)
执行命令:
soffice -headless-accept=“socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard
成功后即在后台运行了该软件。
如果是php5.4.5以前版本,需要在php.ini里把com.allow_dcom = true打开,即去掉前面的分号。如果是以后版本,需要在php.ini 里增加一行扩展extension=php_com_dotnet.dll,然后检查php的ext目录中是否存在该dll文件,如果没有请自行下载对应版本的dll。然后重启apache
下面是通过php方式调用openoffice生成pdf swf,推荐单独建立java服务网上相关的资料也更多一些,输入输出文件路径使用绝对路径,但是有一个问题csv文件会出现转换乱码未解决。
<?php
/**
* office文档转换类
* 实现office任何格式文档网页浏览
* author hui
* 1,安装OpenOffice 4.1.3 (zh-CN)
*
* 2,安装 SWFTOOLS http://www.swftools.org/download.html
* 并把pdf2swf.exe文件移动到C盘根目录
*
* 3,php.ini 开启com.allow_dcom = true
* php.ini 添加extension=php_com_dotnet.dll
* 检查该文件
* php/ext/php_com_dotnet.dll
*/
class Convert{
private $osm;
// 构造函数,启用OpenOffice的COM组件
public function __construct(){
ini_set('magic_quotes_runtime', 0); // 设置运行时间
$this->osm = new COM("com.sun.star.ServiceManager") or die("Please be sure that OpenOffice.org is installed.n");
}
private function MakePropertyValue($name, $value) {
$oStruct = $this->osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
$oStruct->Name = $name;
$oStruct->Value = $value;
return $oStruct;
}
private function transform($input_url, $output_url) {
$args = array($this->MakePropertyValue('Hidden', true));
$oDesktop = $this->osm->createInstance("com.sun.star.frame.Desktop");
$oWriterDoc = $oDesktop->loadComponentFromURL($input_url, '_blank', 0, $args);
$export_args = array($this->MakePropertyValue('FilterName', 'writer_pdf_Export'));
$oWriterDoc->storeToURL($output_url, $export_args);
$oWriterDoc->close(true);
// return $this->getPdfPages($output_url);
}
/**
* getPdfPages 获取PDF文件页数的函数获取,文件应当对当前用户可读(linux下)
* @param string $path 文件路径
* @return int
*/
private function getPdfPages($path = '') {
if(!file_exists($path)) return 0;
if(!is_readable($path)) return 0;
$fp=@fopen($path, "r"); // 打开文件
if(!$fp){
return 0;
}else{
$max = 0;
while(!feof($fp)) {
$line = fgets($fp,255);
if(preg_match('//Count [0-9]+/', $line, $matches)){
preg_match('/[0-9]+/', $matches[0], $matches2);
if ($max<$matches2[0]) $max = $matches2[0];
}
}
fclose($fp);
return $max; // 返回页数
}
}
/**
* office文件转换pdf格式
* @param string $input 需要转换的文件
* @param string $output 转换后的pdf文件
* @return return string 页数
*/
public function run($input = '', $output = '') {
if(empty($input) || empty($output)) {
return ['error' => 1, 'msg' => '参数缺失', 'flag' => 'run'];
}
// if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
// $encoding = 'UCS-2LE';
// else
// $encoding = 'UCS-2BE';
$input = "file:///" . str_replace("\", "/", $input);
$output = "file:///" . str_replace("\", "/", $output);
// $oldEncoding = mb_detect_encoding($input);
// return $this->transform(iconv($encoding, $oldEncoding, $input), iconv($encoding, $oldEncoding, $output));
// $oObj = $this->transform($input, $output);
// var_dump($oObj);exit;
return $this->transform($input, $output);
}
/**
* pdf2swf pdf文件转换swf格式
* @param string $word_file 需要转换的文件路径
* @param string $attach_dir 保存文件地址
* @return array
*/
public function pdf2swf($word_file = '', $attach_dir = '') {
if(empty($word_file) || empty($attach_dir)){
return ['error' => 1, 'msg' => '参数缺失', 'flag' => 'pdf2swf'];
}
$file_name = uniqid();
$pdf_file = "{$attach_dir}{$file_name}.pdf"; // PDF文件绝对路径
$page = $this->run($word_file, $pdf_file); // 文件先转换为PDF格式
if(isset($page) && $page > 0){
$swf_file = "{$attach_dir}{$file_name}.swf"; // 转换后的swf文件
$pd = str_replace("/", "\", $pdf_file);
$sw = str_replace("/", "\", $swf_file);
$cmd = Config::get('websetup.swftools') . " -t {$pd} -s flashversion=9 -o {$sw}";
$phpwsh = new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");
$exec = $phpwsh->exec("cmd.exe /c" . $cmd); // cmd执行pdf2swf转换命令
$stdout = $exec->stdout();
$stdout->readall();
if(is_file($sw)){ // swf文件
if(is_file($pdf_file)){ // 删除pdf文件
unlink($pdf_file);
}
return ['error' => 0, 'page' => $page, 'swf_file' => $file_name];
}else{
return ['error' => 1, 'msg' => 'swf文件不存在', 'flag' => 'pdf2swf'];
}
}else{
return ['error' => 1, 'msg' => '转换pdf失败', 'flag' => 'pdf2swf'];
}
}
}
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
4.读取excel文件数据返回给前端
前端样式可控性强
$aReturnData = [
'title_name' => '',
'data_list' => []
];
$sFileType = PHPExcel_IOFactory::identify($sFileUrl);
$objReader = PHPExcel_IOFactory::createReader($sFileType);
$objPHPExcel = $objReader->load($sFileUrl, 'UTF-8');
$aSheetNames = $objPHPExcel->getSheetNames();
foreach ($aSheetNames as $iKey => $sSheetName) {
$oSheet = $objPHPExcel->getSheet($iKey);
$iColumn= $oSheet->getHighestColumn();
$iRow = $oSheet->getHighestRow();
for ($i = 1; $i <= $iRow; $i++) {
$aTmp = [];
for ($j = 'A'; $j <= $iColumn; $j++) {
$sTmp = $oSheet->getCell($j.$i)->getValue();
$aTmp[] = empty($sTmp)?'':$sTmp;
}
$aReturnData['data_list'][$sSheetName][] = $aTmp;
}
}