<?php
namespace lib;
/**
 * exportXml
 * @author HzqGhost admin@whiledo.com QQ:313143468
 * @version 1.2.0
 *
 */
class exportXml
{
    protected $fp; //流
    protected $br; //换行符
    private $isoutput; //是否输出到客户端
	public function __construct($fp)
    {
        $this->fp = $fp;
        $this->br = "\r\n";
        //UTF8 csv文件头前需添加BOM，不然会是乱码
        fwrite($this->fp, chr(0xEF).chr(0xBB).chr(0xBF));
    }
	public function header(string $filename='')
    {
        $this->isoutput = true;
        if($filename==''){
            $filename = time().'.xlsx';
        }
        ob_end_clean();
        header('Content-Description: File Transfer');
        header("Content-type:application/vnd.ms-excel");
        header('Content-Disposition: attachment; filename='.$filename);
        ob_start();
    }

	public function bookBegin()
    {
        fwrite($this->fp, '<?xml version="1.0"?>'.$this->br);
        fwrite($this->fp, '<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'.$this->br);
        fwrite($this->fp, '<ss:Styles>'.$this->br);
        fwrite($this->fp,   '<ss:Style ss:ID="1">'.$this->br);
        fwrite($this->fp,       '<ss:Font ss:Bold="1"/>'.$this->br);
        fwrite($this->fp,   '</ss:Style>'.$this->br);
        fwrite($this->fp, '</ss:Styles>'.$this->br);
    }
	public function bookEnd()
    {
        fwrite($this->fp, '</ss:Workbook>'.$this->br);
    }

	public function sheetBegin(string $sheetName,array $headerRow=[],array $headerRowWidths=[])
    {
        fwrite($this->fp, '<ss:Worksheet ss:Name="'.$sheetName.'">'.$this->br);
        fwrite($this->fp, '<ss:Table>'.$this->br);
        if(!empty($headerRowWidths)){
            foreach($headerRowWidths as $width){
                fwrite($this->fp, '<ss:Column ss:Width="'.$width.'"/>'.$this->br);
            }
        }
        if(!empty($headerRow)){
            fwrite($this->fp, '<ss:Row ss:StyleID="1"'.$this->br);
            foreach($headerRow as $cell){
                fwrite($this->fp, '<ss:Cell><ss:Data ss:Type="String">'.$cell.'</ss:Data></ss:Cell>'.$this->br);
            }
            fwrite($this->fp, '</ss:Row>'.$this->br);
        }
    }

	public function sheetEnd()
    {
        fwrite($this->fp, '</ss:Table>'.$this->br);
        fwrite($this->fp, '</ss:Worksheet>'.$this->br);
    }

	public function append(array $row=[])
    {
        fwrite($this->fp, '<ss:Row>'.$this->br);
        if($row){
            foreach($row as $cell){
                fwrite($this->fp, '<ss:Cell><ss:Data ss:Type="String">'.$this->specialchars($cell).'</ss:Data></ss:Cell>'.$this->br);
            }
        }
        fwrite($this->fp, '</ss:Row>'.$this->br);
        if($this->isoutput){
            ob_flush();
            flush();
        }
    }

    protected function specialchars($value){
        if(is_null($value)) $value = '';
        return str_replace('&amp;','&',htmlspecialchars($value));
    }
}