|
  
- 帖子
- 62
- 积分
- 653
- 阅读权限
- 100
- 来自
- 宁波
- 最后登录
- 2008-12-29
  
|
楼主
发表于 2008-11-17 15:28
| 只看该作者
最近因项目需要,需要开发一个模块,把系统中的一些数据导出成Excel,修改后再导回系统。就趁机对这个研究了一番,下面进行一些总结。" S& z/ k' |) Q: k$ B7 f
基本上导出的文件分为两种:
0 @1 Q/ W; j2 H1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存,通常会提示你是否要转换成Excel文件。; l6 j4 g' |2 Y8 S0 x3 ?
优点:简单。
& @! q8 I$ X0 u& u7 l缺点:难以生成格式,如果用来导入需要自己分别编写相应的程序。
; G; i8 X% J8 j2:Excel格式,与类Excel相对应,这种方法生成的文件更接近于真正的Excel格式。
% C1 f' H5 S0 V+ J# K' Q5 H# ?& A4 N0 ^
如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$yourStr从utf-8转换成了gb2312:
# ^$ x- l8 a8 \: J ?( _1 y7 _1 v$yourStr = mb_convert_encoding("gb2312", "UTF-8", $yourStr);: P* w6 D; |3 H+ r/ p8 N8 z/ y0 q
5 z; K2 |" i, j: C) O* U* g6 W
下面详细列举几种方法。6 n1 E! w5 B6 H* e
一、PHP导出Excel
" }4 s! g) G A0 {" z) F2 e6 [1 O6 ? O: E
1:第一推荐无比风骚的PHPExcel,官方网站: http://www.codeplex.com/PHPExcel
8 ?" e. p6 i6 t* s" Q+ z; c$ [9 k5 U导入导出都成,可以导出office2007格式,同时兼容2003。
" N) w* |: a0 C$ k) f下载下来的包中有文档和例子,大家可以自行研究。
( x; F% U; J/ M3 Q: Y抄段例子出来:
! u* ^% S( Q* S& R0 {5 ]<?php" b+ j! H# e4 @, n; p' Q
/**6 S. S0 E8 o1 Q& m$ S
* PHPExcel
) z+ p& H D% }6 A *
8 ?1 h/ G2 c3 t) f * Copyright (C) 2006 - 2007 PHPExcel* U$ L: t9 d+ t( [0 s; Z1 u
*
& e! C+ }6 L5 }3 e. r& ^( p * This library is free software; you can redistribute it and/or/ V T4 i) R- E7 u+ u
* modify it under the terms of the GNU Lesser General Public
9 w6 P5 }5 ]) Q/ [ * License as published by the Free Software Foundation; either5 l! R; I* R! x8 Z+ H' p6 {
* version 2.1 of the License, or (at your option) any later version.
9 a1 T: ^$ A" W" W+ v" S! D8 h *" t8 O/ j4 ?4 P
* This library is distributed in the hope that it will be useful,) \: E+ H% {3 L; Q6 ^# O1 U; D
* but WITHOUT ANY WARRANTY; without even the implied warranty of# O+ h% q) w: g, Q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
F! e/ B$ m& Q- k$ h * Lesser General Public License for more details.: T# e1 O$ H: p$ l* @/ G
*7 V8 \( T# D1 J; F; J
* You should have received a copy of the GNU Lesser General Public( j' X" r" |$ d
* License along with this library; if not, write to the Free Software
9 U& m2 ^* B7 t+ `1 t' Y * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA# h) G' E. E- s0 P
*% i7 j( \, @3 @+ d- Q
* @category PHPExcel
+ F j+ s$ c1 S% m( I& N9 _ * @package PHPExcel) ^' x% w2 n5 M) ^3 Q. N* _+ ^' L
* @copyright Copyright (c) 2006 - 2007 PHPExcel ( http://www.codeplex.com/PHPExcel)
/ U* ?: m8 p* A * @license http://www.gnu.org/licenses/lgpl.txt LGPL
, V% ^# m" y% }) G W6 M$ G2 K * @version 1.5.0, 2007-10-23
! R0 y: U1 C: Y { */
" R K; B. ~6 D4 Q2 U2 n& q+ _
# `8 f, E5 D9 v% _& l _! m/** Error reporting */
) d* G: x; d7 B1 M6 ierror_reporting(E_ALL);7 W- d& w7 B; b2 w+ U* g
) X; _& ]& w0 `/** Include path **/
$ X8 |% J6 {; }# Fset_include_path(get_include_path() . PATH_SEPARATOR . '../Classes/');
) R) a- I) `( C" P/ e
# [' M! G1 ^2 @1 }* n: g+ O/** PHPExcel */7 E M v2 w0 e: W
include 'PHPExcel.php';
6 ]: c( [+ T- ?. ]. K3 N3 N8 Q9 k5 l& D( g" s8 e# C/ O
/** PHPExcel_Writer_Excel2007 */
. o' Q! L; k5 R* i' ainclude 'PHPExcel/Writer/Excel2007.php';
; C) _& y( D8 ~& j
9 b7 d2 _) P, N$ T) f3 O// Create new PHPExcel object
* A4 X4 D2 j" \. n- necho date('H:i:s') . " Create new PHPExcel object\n";
. |3 z3 s1 n! p0 E: y7 i) S6 W3 Y& H$objPHPExcel = new PHPExcel();
$ t# y* \6 {9 @" V- l2 u$ P4 W# v( x
// Set properties, x4 Y) H9 S, M0 G
echo date('H:i:s') . " Set properties\n";
E5 m m; D7 j' H$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
5 R9 X$ w n+ Y$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");9 T. t- t K+ b+ B
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");% c0 m; A7 p. z% t' }' r) I
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
$ O( `4 X4 S* g1 d$ {6 l$objPHPExcel->getProperties()->setDescrīption("Test document for Office 2007 XLSX, generated using PHP classes.");$ I# a: B: m' A5 @) t! S
$objPHPExcel->getProperties()->setKeywords("office 2007 openxml php");
3 ]- S5 N1 b0 ^; u, s+ x3 a$objPHPExcel->getProperties()->setCategory("Test result file");
7 i! ^& ]5 [7 R# u) m/ S, l
% U1 ^! a% E. d/ x! I5 f$ g% b0 `- l" {
// Add some data
& S' Y" b% g! Y8 S9 K5 Fecho date('H:i:s') . " Add some data\n";
" E6 L+ w2 M4 T$objPHPExcel->setActiveSheetIndex(0);
# O. l4 Z$ `1 |: o$ t$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Hello');3 S0 X+ ~. A1 _8 {
$objPHPExcel->getActiveSheet()->setCellValue('B2', 'world!');$ |6 A9 {$ P. \: U( }
$objPHPExcel->getActiveSheet()->setCellValue('C1', 'Hello');$ a2 x g$ [9 ]" h2 a$ h* K# O
$objPHPExcel->getActiveSheet()->setCellValue('D2', 'world!');, `& z0 d8 c1 ?% s" \4 P
* s- w( g1 D) P
// Rename sheet% Y- S( |# A+ o; m( z) n
echo date('H:i:s') . " Rename sheet\n";0 \) s7 ~+ d6 b8 D- J
$objPHPExcel->getActiveSheet()->setTitle('Simple');3 M+ e0 y' r8 d8 I+ u4 q
% J% e, O- p E# l+ Y- w: ?$ [" e* a6 n+ R# I( j
// Set active sheet index to the first sheet, so Excel opens this as the first sheet$ V3 D+ M4 O: u: y
$objPHPExcel->setActiveSheetIndex(0);
# ?* o, F* L: ^ b6 T# ~ `& @& B6 Q! J; Y$ n
, D/ \* m" v0 z* h4 d, B, v9 A- P// Save Excel 2007 file
3 Z# _2 J) A ?$ p2 c- necho date('H:i:s') . " Write to Excel2007 format\n"; p9 c( @% V2 _6 s6 B+ t
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);+ M# D+ u% m# j- j
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
F ]+ E2 l9 V8 L7 w& f" o5 |3 E% u* H! g3 z3 s
// Echo done4 n% D# g% D# U- |8 L* y4 S& o
echo date('H:i:s') . " Done writing file.\r\n";
& r1 W( }, p. j
, w. U- y0 Z. V1 d3 S4 K
6 M5 U" F3 p$ ~# b1 {& s2 ~: u2、使用pear的Spreadsheet_Excel_Writer类3 ^5 Y- z. W) M' S/ g$ _& H1 I
下载地址: http://pear.php.net/package/Spreadsheet_Excel_Writer
; E- M: K" t8 R! o* \) j此类依赖于OLE,下载地址:http://pear.php.net/package/OLE
9 F' q( A; X6 [/ I& f( n" o需要注意的是导出的Excel文件格式比较老,修改后保存会提示是否转换成更新的格式。; B) O# E {4 O; A: i% x A
不过可以设定格式,很强大。
7 g3 s. B# f4 t. m<?php
# w7 x! r F: Yrequire_once 'Spreadsheet/Excel/Writer.php';
& m8 S9 t' x1 Y& G& A 9 _4 z! n4 v. l) {
// Creating a workbook
6 O. f/ x6 g" b' H @ b0 i$workbook = new Spreadsheet_Excel_Writer();
) `4 t% B# Y4 i5 B ) y1 j0 s, c* d! b. |& ?4 {% u* N
// sending HTTP headers
9 |" Z- U. D1 L2 D' ]* G$workbook->send('test.xls');
! q1 J! H m4 R4 P . d+ U8 ~4 s& U- ?! b9 Y; n8 d
// Creating a worksheet
9 j0 T6 |' A6 t/ H1 D/ e4 Q9 {: F$worksheet =& $workbook->addWorksheet('My first worksheet');
7 t) I7 w& \4 k. P2 s8 K; j- e 2 d, e7 W* x! B1 _ z2 a! z4 f4 D
// The actual data
* \: s& \ l+ o: j8 c$worksheet->write(0, 0, 'Name');
2 q5 l& d9 O7 S+ G1 |+ l0 ~$worksheet->write(0, 1, 'Age');1 M1 ~. I+ G4 b, E
$worksheet->write(1, 0, 'John Smith');
3 o6 t6 I5 F. e5 t, o* b) h$worksheet->write(1, 1, 30);
# k/ R! v" s( }7 d$worksheet->write(2, 0, 'Johann Schmidt');
|4 H8 ^$ Q S0 [$worksheet->write(2, 1, 31);
9 A% h( l# l# c5 ]7 F }$worksheet->write(3, 0, 'Juan Herrera');
9 Z) w$ A: x8 i$worksheet->write(3, 1, 32);
$ E" Q# M% O& a! l , Z1 W) }2 f! H" T% ^/ V+ P
// Let's send the file
% K$ ?# L2 F5 Z+ z2 ~/ U$workbook->close();
N& B5 O% Z% z/ {8 X?>, K C* e+ k6 _9 L) P
; Q! A2 X% p* t/ x& R9 @5 g4 u, Y
3:利用smarty,生成符合Excel规范的XML或HTML文件
6 {! x1 S3 i) R7 N支持格式,非常完美的导出方案。不过导出来的的本质上还是XML文件,如果用来导入就需要另外处理了。
( t" m c0 F% \2 O0 c) H: F q详细内容请见rardge大侠的帖子:http://bbs.chinaunix.net/viewthread.php?tid=745757
! |: N q; h5 ]; Q
6 Q* H6 j2 y# Z# K0 Q3 j( B需要注意的是如果导出的表格行数不确定时,最好在模板中把"ss:ExpandedColumnCount="5" ss:ExpandedRowCount="21""之类的东西删掉。' d% Y1 F8 q! r- \
' d" U1 f# c- D* I3 Q P# ^4 u% `4、利用pack函数打印出模拟Excel格式的断句符号,这种更接近于Excel标准格式,用office2003修改后保存,还不会弹出提示,推荐用这种方法。
4 @& a! `" `/ g' Q& R5 @2 x- e缺点是无格式。
+ o) D8 M n5 R e<?php$ A0 o4 b& G9 v' b N( _" j e; \) |
// Send Header) K N. H. h' i9 n! d" T, y' I# W
header("Pragma: public");
: r+ h5 H. G& U, F& ^2 eheader("Expires: 0");8 p' w! { I* E8 ~1 [
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");; `$ _. ^. c- j6 s# f2 t
header("Content-Type: application/force-download");* K: O4 b/ k- @3 J8 _! h# l
header("Content-Type: application/octet-stream");
) B; _7 ?6 _; I7 R2 i/ s; r4 R* Mheader("Content-Type: application/download");;
: K: H7 Y, H6 n( nheader("Content-Disposition: attachment;filename=test.xls ");
& @- G# X( ?, R, J1 m; q! iheader("Content-Transfer-Encoding: binary ");) p4 ^! h/ I; P& D
// XLS Data Cell. F) d j) L1 j
0 R8 S; g& a: S/ dxlsBOF();
$ ^# ?/ C; M% K0 HxlsWriteLabel(1,0,"My excel line one");( j8 `; p# {3 w
xlsWriteLabel(2,0,"My excel line two : ");
7 F O- r7 ?5 l1 k6 X: lxlsWriteLabel(2,1,"Hello everybody");* ^' D" {# o- }; G
1 p/ U. U' {7 Y3 N
xlsEOF();
1 K6 x S) `# j ` {$ c4 o) G
" p6 ?1 ^& Q. n; a3 I1 l6 M* Kfunction xlsBOF() {
# i, o) }4 U0 O echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
9 D$ _8 s# b `: r2 A return;
, X. N" i; n; b0 X, X0 @}
: C, ^; G& l# X) W pfunction xlsEOF() {
. U3 B8 B- ~* [- r7 i- s# e& k# d/ { echo pack("ss", 0x0A, 0x00);: j7 |& r3 F- }( C7 y( y
return;
, h+ g$ o/ a- ?* L/ [+ x}$ b! p3 g* [5 O( t C1 J2 Z* W- U
function xlsWriteNumber($Row, $Col, $Value) {. U) L4 H. Y m$ c! J6 @* d
echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);& |2 M1 a5 `! ^- H
echo pack("d", $Value);
& k3 u' K) f" j' k! h& A return;3 U. c1 O% p1 _
}" u9 c0 }7 o* J
function xlsWriteLabel($Row, $Col, $Value ) {
! v B8 D( q' l- r" X $L = strlen($Value);
7 H% b, b) n1 U V echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);# |6 X+ p/ f c
echo $Value;7 ]# V9 ^, `& q' m. M! W# r7 V% r
return;1 S% K# F" H6 D' c8 @
}$ z' X) J) Y7 z
?>
9 ~8 I! u3 @, R不过笔者在64位linux系统中使用时失败了,断句符号全部变成了乱码。2 m. K% w' O7 Y g% \( T+ s
`9 h% k& C, i/ `' h: Y& C5、使用制表符、换行符的方法
0 T; ?* ~0 k- D3 R制表符"\t"用户分割同一行中的列,换行符"\t\n"可以开启下一行。9 J$ o/ N& Y. d$ a- M+ }% b
<?php% Z& }/ C2 V& N& Z' U* ^; [! q. x
header("Content-Type: application/vnd.ms-execl");
2 Q2 c" {6 r* ^. F5 ~$ hheader("Content-Disposition: attachment; filename=myExcel.xls");
( U, `3 r+ B' L" K8 Kheader("Pragma: no-cache");/ U9 B% e8 |# U, y5 p
header("Expires: 0");
+ W+ @) Q6 v. K( p/*first line*/ B) R. I5 ]: |% S$ M4 C3 y3 Q
echo "hello"."\t";9 c. H: x3 ?# g) z) P, Z$ G
echo "world"."\t";5 W) p5 X7 T5 w \
echo "\t\n";
7 K& Y' D0 P) T! _/ m& A! g
3 R- `( @# w! ]9 Y4 A/*start of second line*/
: z" M( t5 P& I- ^5 O1 \' X5 x( `echo "this is second line"."\t";
g& S' V0 L4 B1 }- o7 E7 x7 S4 Cecho "Hi,pretty girl"."\t";. A. M; t% e, @- V3 r
echo "\t\n";% C% x* G! w9 F( y3 X" ^# e
?>- Q3 P# N4 ~; i ?* C
: ~) j% `' d3 C# ~, I" t* Q6、使用com8 K, N& E- K! X' }
如果你的PHP可以开启com模块,就可以用它来导出Excel文件# {0 w3 j% X& t
<?PHP8 X( j) q" M7 S
$filename = "c:/spreadhseet/test.xls";
6 P! q! `5 S g s4 p8 A$sheet1 = 1;. H( W9 Y: C! `, k( G
$sheet2 = "sheet2";+ z& ]) s2 J9 h0 E7 N: N6 N7 E
$excel_app = new COM("Excel.application") or Die ("Did not connect");. ~. C/ A$ L/ h, {0 n5 |
print "Application name: {$excel_app->Application->value}\n" ;
( {* Z" V. Q0 c% _5 iprint "Loaded version: {$excel_app->Application->version}\n";
: c, S! H! q* [& } l$Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook"); `2 ~ g8 F/ \5 t
$Worksheet = $Workbook->Worksheets($sheet1);
8 u2 W O7 r/ }" y |$Worksheet->activate;
2 ]. i( B$ L$ H; e$excel_cell = $Worksheet->Range("C4");6 ]- {: O* p3 t B
$excel_cell->activate; P# Y8 i$ S% \- p3 E" _6 |
$excel_result = $excel_cell->value;, g) _1 S/ H# E" i+ o2 k" j2 i
print "$excel_result\n";
1 [* H' ]" |! p( Q5 W* s8 ?$Worksheet = $Workbook->Worksheets($sheet2);
5 K8 I+ {! G+ O$Worksheet->activate;, e6 X L0 o4 s7 n, i6 V. A
$excel_cell = $Worksheet->Range("C4");) g( \8 d6 j+ h9 k; B- {
$excel_cell->activate;8 x1 t) ~) A; h* G& [& N/ x' p
$excel_result = $excel_cell->value;
; Y. @% a& u7 z; }8 Gprint "$excel_result\n";' E. {7 }' p/ n5 a7 U
#To close all instances of excel:
- b# n: L% _8 p, _% d$Workbook->Close;0 i) C' Q7 C5 ^% b$ f0 g1 f% I
unset($Worksheet);$ Y" @4 D5 j! g% R' L" K4 v
unset($Workbook);
4 Z c+ o6 U9 r p/ W' j$ w$excel_app->Workbooks->Close();
9 x+ c& D) R$ ~$excel_app->Quit();' d- a4 ~( D1 I. ?
unset($excel_app);
0 b' `3 v+ Y b: K3 @7 d?>+ y) K' H$ Y4 S( R( b, ~
一个更好的例子: http://blog.chinaunix.net/u/16928/showart_387171.html
/ O/ a1 r* g. H' U x) Q( l
5 u7 y& k z8 B一、PHP导入Excel
2 t$ v* T5 o$ m" \8 R. C" P6 \) `
1:还是用PHPExcel,官方网站: http://www.codeplex.com/PHPExcel。* c# ]8 D" \& {# Q E% f
$ W0 b. L- {; ^& C) E2 D& x; \
2:使用PHP-ExcelReader,下载地址: http://sourceforge.net/projects/phpexcelreader* `* e7 @8 O, T. E! q8 m
举例:0 `5 m: ^( @( X& A3 }9 x
<?php; `, D, A! L5 b6 Y( N, V8 U
require_once 'Excel/reader.php';
. M$ F7 R* O. B# Y6 n5 B, i4 [2 N' I
& O. u/ l# _% s2 `% ? _// ExcelFile($filename, $encoding);8 r9 b4 M* l5 y% X/ G* r
$data = new Spreadsheet_Excel_Reader();4 \ X5 m# Q7 D2 r
i1 G( ~$ n# q" J/ ? ~# Q
// Set output Encoding.
" f, D+ M+ _4 t$data->setOutputEncoding('utf8');
# w* c. M6 |) o5 N; Q: j
- `% v8 G- ]- Q3 o9 f3 l* O! N; i$data->read(' jxlrwtest.xls');
* j" P: X+ \ j) }7 K7 ]# n" A" |9 T4 F V, f" S& C4 y" _ z
$ D1 L; p" O" `7 m7 Perror_reporting(E_ALL ^ E_NOTICE);
+ w! c' | W4 e5 c% {* i" G6 T
& S0 k2 Z1 |: P9 M) I# l; cfor ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
# e3 h; h/ c J& h R; i% }# h/ f; [ for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {7 L% E! Q2 H, t$ I
echo "\"".$data->sheets[0]['cells'][$i][$j]."\",";( A: ~& w& C0 e- B. k8 h0 f
}
0 i7 o$ M8 q' l( M$ h8 I echo "\n";
2 |0 h9 P, V7 E& G}$ g5 A9 O) o, V4 h$ I
: n7 S5 C' [* x2 ` T1 i7 W
?> |
|