123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- <?php
- namespace excel;
- /**
- * 生成Excel文件类
- *
- */
- class Excel
- {
- /**
- * excel文档头(返回的行)
- *
- * 依照excel xml规范。
- * @access private
- * @var string
- */
- private $header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?\>
- <Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"
- xmlns:x=\"urn:schemas-microsoft-com:office:excel\"
- xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"
- xmlns:html=\"http://www.w3.org/TR/REC-html40\">";
- /**
- * excel页脚
- * 依照excel xml规范。
- *
- * @access private
- * @var string
- */
- private $footer = "</Workbook>";
- /**
- * 文档行(行数组中)
- *
- * @access private
- * @var array
- */
- private $lines = array();
- /**
- * 工作表(数组)
- *
- * @access private
- * @var array
- */
- private $worksheets = array();
- /**
- * 单元格样式
- * @access private
- * @var string
- */
- private $cellstyle = array();
- /**
- * 默认单元格数据格式
- * @access private
- * @var string
- */
- private $default_cellformat = "String";
- public function __construct()
- {
- //设置默认样式
- $this->cellstyle['Default'] = '<Style ss:ID="Default" ss:Name="Normal">
- <Alignment ss:Vertical="Center"/>
- <Borders/>
- <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
- <Interior/>
- <NumberFormat/>
- <Protection/>
- </Style>';
- }
- /**
- * 添加单行数据
- *
- * @access private
- * @param array 1维数组
- * @todo 行创建
- */
- private function addRow($array)
- {
- //初始化单元格
- $cells = "";
- //构建单元格
- foreach ($array as $k => $v) {
- $style_str = '';
- if (!empty($v['styleid'])) {
- $style_str = 'ss:StyleID="' . $v['styleid'] . '"';
- }
- $format_str = $this->default_cellformat;
- if (!empty($v['format'])) {
- $format_str = $v['format'];
- }
- $cells .= "<Cell {$style_str} ><Data ss:Type=\"{$format_str}\">{$v['data']}</Data></Cell>\n";
- }
- //构建行数据
- $this->lines[] = "<Row>\n" . $cells . "</Row>\n";
- }
- /**
- * 添加多行数据
- * @access public
- * @param array 2维数组
- * @todo 构造多行
- */
- public function addArray($array)
- {
- $this->lines = array();
- //构建行数据
- foreach ((array)$array as $k => $v) {
- $this->addRow($v);
- }
- }
- /**
- * 添加工作表
- * @access public
- * @param string $sheettitle 工作表名
- * @todo 构造工作表XML
- */
- public function addWorksheet($sheettitle)
- {
- //剔除特殊字符
- $sheettitle = preg_replace("/[\\\|:|\/|\?|\*|\[|\]]/", "", $sheettitle);
- //现在,将其减少到允许的长度
- //$sheettitle = substr ($sheettitle, 0, 50);
- $this->worksheets[] = "\n<Worksheet ss:Name=\"$sheettitle\">\n<Table ss:DefaultRowHeight=\"20\">\n" . "<Column ss:Index=\"1\" ss:AutoFitWidth=\"0\"/>\n" . implode("\n", $this->lines) . "</Table>\n</Worksheet>\n";
- }
- /**
- * 设置单元格样式
- *
- * @access public
- * @param array 样式数组例如: array('id'=>'s_title','Font'=>array('FontName'=>'宋体','Size'=>'12','Bold'=>'1'));
- * 当id为Default时,为表格的默认样式
- */
- public function setStyle($style_arr)
- {
- if (empty($style_arr)) {
- return false;
- }
- $id = $style_arr['id'];
- unset($style_arr['id']);
- $style_str = "<Style ss:ID=\"$id\">";
- foreach ($style_arr as $k => $v) {
- $tmp = '';
- foreach ((array)$v as $k_item => $v_item) {
- $tmp .= (" ss:$k_item=\"$v_item\"");
- }
- $style_str .= "<$k " . $tmp . '/>';
- }
- $this->cellstyle[$id] = $style_str . '</Style>';
- }
- /**
- * 设置默认单元格格式
- *
- * @access public
- * @param string
- */
- public function setDefaultFormat($format_str)
- {
- if (empty($style_arr)) {
- return false;
- }
- $this->default_cellformat = $format_str;
- }
- /**
- * 生成excel文件
- * 最后生成excel文件,并使用header()函数来将它交付给浏览器。
- * @access public
- * @param string $filename 文件名称
- */
- public function generateXML($filename)
- {
- $encoded_filename = urlencode($filename);
- $encoded_filename = str_replace("+", "%20", $encoded_filename);
- //头
- $ua = $_SERVER["HTTP_USER_AGENT"];
- header("Content-Type: application/vnd.ms-excel");
- if (preg_match("/MSIE/", $ua)) {
- header('Content-Disposition: attachment; filename="' . $encoded_filename . '.xls"');
- }
- else if (preg_match("/Firefox/", $ua)) {
- header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '.xls"');
- }
- else {
- header('Content-Disposition: attachment; filename="' . $filename . '.xls"');
- }
- header('Cache-Control: max-age=0');
- echo stripslashes($this->header);
- //样式
- echo "\n<Styles>";
- foreach ((array)$this->cellstyle as $k => $v) {
- echo "\n" . $v;
- }
- echo "\n</Styles>";
- //工作表
- echo implode("\n", $this->worksheets);
- echo $this->footer;
- }
- /**
- * 转码函数
- *
- * @param mixed $content
- * @param string $from
- * @param string $to
- * @return mixed
- */
- public function charset($content, $from = 'gbk', $to = 'utf-8')
- {
- $from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;
- $to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to;
- if (strtoupper($from) === strtoupper($to) || empty($content)) {
- //如果编码相同则不转换
- return $content;
- }
- if (function_exists('mb_convert_encoding')) {
- if (is_array($content)) {
- $content = var_export($content, true);
- $content = mb_convert_encoding($content, $to, $from);
- eval("\$content = $content;");
- return $content;
- }
- else {
- return mb_convert_encoding($content, $to, $from);
- }
- }
- elseif (function_exists('iconv')) {
- if (is_array($content)) {
- $content = var_export($content, true);
- $content = iconv($from, $to, $content);
- eval("\$content = $content;");
- return $content;
- }
- else {
- return iconv($from, $to, $content);
- }
- }
- else {
- return $content;
- }
- }
- }
- ?>
|