X-Git-Url: http://git.roojs.org/?p=Pman.Core;a=blobdiff_plain;f=GnumericToExcel.php;h=5ce821deb6d17a0e23a68e9ff6c2bcebb6472a85;hp=3f4f31b203d3f9922b2bbe85fd147eb677921626;hb=HEAD;hpb=d1cb3a26d217d23d66ddda9bde224a615ddfabe6 diff --git a/GnumericToExcel.php b/GnumericToExcel.php index 3f4f31b2..feb940c3 100644 --- a/GnumericToExcel.php +++ b/GnumericToExcel.php @@ -28,13 +28,13 @@ class Pman_Core_GnumericToExcel extends Pman return true; } - function get() + function get($v, $opts=array()) { - + } function post($fname) { - $ml = (int) ini_get('suhosin.post.max_value_length'); + $ml = (int) ini_get('suhosin.post.max_value_length'); if (empty($_POST['xml'])) { header("HTTP/1.0 400 Internal Server Error"); die( $ml ? "Suhosin Patch enabled - try and disable it!!!" : 'no XML sent'); @@ -48,9 +48,9 @@ class Pman_Core_GnumericToExcel extends Pman $xml = iconv("UTF-8", "UTF-8//IGNORE", $xml); - //$xml = str_replace('é', 'e', $xml); + //$xml = str_replace('�', 'e', $xml); //$xml = str_replace("\xA0", ' ', $xml); - //$xml = str_replace("Ø", 'dia.',$xml); + //$xml = str_replace("�", 'dia.',$xml); //$this->addEvent("DOWNLOAD", false, isset($_REQUEST['title']) ? $_REQUEST['title'] : '???'); @@ -58,14 +58,31 @@ class Pman_Core_GnumericToExcel extends Pman if (!empty($_POST['format']) && $_POST['format']=='gnumeric') { if (empty($_POST['debug'])) { header('Content-type: application/x-gnumeric'); + header('Content-Disposition: attachment; filename="' .addslashes($fname). '.gnumeric"'); } else { header('Content-type: text/xml'); } echo $xml; exit; } - $srcTmp = ini_get('session.save_path') . '/' .uniqid('gnumeric_').'.gnumeric'; - $targetTmp = ini_get('session.save_path') . '/' .uniqid('gnumeric_').'.xls'; + + $ext = 'xls'; + $outfmt = 'Gnumeric_Excel:excel_biff8'; + $mime = 'application/vnd.ms-excel'; + + /* + // ssconvert results in bad images + if (!empty($_POST['format']) && $_POST['format']=='xlsx') { + $outfmt = 'Gnumeric_Excel:xlsx'; + $ext = 'xlsx'; + $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; + } + */ + + + + $srcTmp = $this->tempName('gnumeric'); + $targetTmp = $this->tempName($ext); // write the gnumeric file... $fh = fopen($srcTmp,'w'); fwrite($fh, $xml); @@ -73,13 +90,15 @@ class Pman_Core_GnumericToExcel extends Pman require_once 'System.php'; + $xvfb = System::which('xvfb-run'); + $ss = System::which('ssconvert'); - $cmd = $ss. + $cmd = $xvfb . " -a " . $ss. " --import-encoding=Gnumeric_XmlIO:sax" . - " --export-type=Gnumeric_Excel:excel_biff8 " . + " --export-type={$outfmt} " . $srcTmp . ' ' . $targetTmp . ' 2>&1'; // echo $cmd; - //passthru($cmd);exit; + //passthru($cmd);exit; //exit; $out = `$cmd`; clearstatcache(); @@ -88,18 +107,51 @@ class Pman_Core_GnumericToExcel extends Pman header("HTTP/1.0 400 Internal Server Error - Convert error"); die("ERROR CONVERTING?:" . $cmd ."\n

OUTPUT:". htmlspecialchars($out)); } + + if (!empty($_POST['format']) && $_POST['format']=='xlsx') { + require_once 'File/Convert.php'; + $cc = new File_Convert($targetTmp,'application/vnd.ms-excel'); + $targetTmp = $cc->convert('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + if (empty($targetTmp)) { + $this->jerr("convert to xlsx failed"); + } + + $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; + $ext = "xlsx"; + } + if (empty($fname)) { + $fname = basename($targetTmp); + } + $fname .= preg_match('/\.' . $ext . '/i', $fname) ? '' : ('.' . $ext); // make sure it ends in xls.. + + + DB_DataObject::factory('Events')->addFile(array( + 'tmp_name' => $targetTmp, + 'name' => $fname, + 'type' => $mime, + 'size' => filesize($targetTmp) + )); + + $this->addEvent("DOWNLOAD", false, $fname ); + // unlink($srcTmp); - $fname .= preg_match('/\.xls/i', $fname) ? '' : '.xls'; // make sure it ends in xls.. - $fh = fopen($targetTmp, 'r'); - header('Content-type: application/vnd.ms-excel'); + + header('Content-type: ' . $mime); header('Content-Disposition: attachment; filename="' .addslashes($fname). '"'); - - // will not work on IE... - needs while/fget.. - fpassthru($fh); + header('Content-length: '. filesize($targetTmp)); + header("Content-Transfer-Encoding: binary"); + if ($file = fopen($targetTmp, 'rb')) { + while(!feof($file) and (connection_status()==0)) { + print(fread($file, 1024*8)); + flush(); + } + fclose($file); + } + unlink($targetTmp); exit; } - + }