yzms/show/include/getxlsx.php

304 lines
20 KiB
PHP
Raw Permalink Normal View History

2024-04-01 15:54:27 +08:00
<?
ini_set("display_errors", "off");
function xlsx_filter_chr($s, $conv = false) {
if($conv) {
$s = iconv("gbk", "utf-8//ignore", $s);
}
if(strlen($s) > 30000) $s = substr($s, 0, 30000);
$s2 = '';
$len = strlen($s);
for($i = 0; $i < $len; $i++) {
$n = ord($s[$i]);
if($n == 9 || $n == 10 || $n == 13 || ($n >= 32 && $n <= 126)) {
$s2 .= $s[$i];
} else if($n >= 0xE0 && $n <= 0xEF) {
if($i+2 < $len) {
$t1 = ord($s[$i+1]);
$t2 = ord($s[$i+2]);
if($t1 >= 128 && $t1 <= 191 && $t2 >= 128 && $t2 <= 191) {
$s2 .= $s[$i].$s[$i+1].$s[$i+2];
$i += 2;
}
}
}
}
return htmlspecialchars($s2);
}
//function getXlsx($titles, $widths, $list, $fn) {
function getXlsxByList($titles, $widths, $list, $fn, $conv = false) {
$sheets = array(array(
'titles' => $titles,
'widths' => $widths,
'list' => $list,
'sheet_name' => 'Sheet1',
));
return getXlsx($sheets, $fn, $conv);
}
function getXlsxBySQL($titles, $widths, $sql, $fn, $conv = false) {
$sheets = array(array(
'titles' => $titles,
'widths' => $widths,
'sql' => $sql,
'sheet_name' => 'Sheet1',
));
return getXlsx($sheets, $fn, $conv);
}
function getXlsx($sheets, $fn, $conv = false) {
if($sheets['list'] || $sheets['listfunc'] || $sheets['sql']) $sheets = array($sheets);
$xlschars = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ',
'BA','BB','BC','BD','BE','BF','BG','BH','BI','BJ','BK','BL','BM','BN','BO','BP','BQ','BR','BS','BT','BU','BV','BW','BX','BY','BZ',
'CA','CB','CC','CD','CE','CF','CG','CH','CI','CJ','CK','CL','CM','CN','CO','CP','CQ','CR','CS','CT','CU','CV','CW','CX','CY','CZ',
'DA','DB','DC','DD','DE','DF','DG','DH','DI','DJ','DK','DL','DM','DN','DO','DP','DQ','DR','DS','DT','DU','DV','DW','DX','DY','DZ'
);
$xmlstr_1 = '<?xml version="1.0" encoding="utf-8"?>'."\n".'<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac"><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection sqref="A1:A1"/></sheetView></sheetViews><sheetFormatPr defaultRowHeight="13.5" x14ac:dyDescent="0.15"/><cols>';
$xmlstr_2 = '</sheetData><phoneticPr fontId="1" type="noConversion"/><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/><pageSetup paperSize="9" orientation="portrait" r:id="rId1"/></worksheet>';
$xmlstr_3 = '<?xml version="1.0" encoding="utf-8"?>'."\n".'<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"';
$xmlstr_5 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'."\n".'<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x15" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"><fileVersion appName="xl" lastEdited="6" lowestEdited="6" rupBuild="14420"/><workbookPr defaultThemeVersion="153222"/><mc:AlternateContent xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"><mc:Choice Requires="x15"><x15ac:absPath url="C:\" xmlns:x15ac="http://schemas.microsoft.com/office/spreadsheetml/2010/11/ac"/></mc:Choice></mc:AlternateContent><bookViews><workbookView xWindow="0" yWindow="0" windowWidth="28800" windowHeight="12450"/></bookViews><sheets>';
$xmlstr_6 = '</sheets><calcPr calcId="152511"/><extLst><ext uri="{140A7094-0E35-4892-8432-C4D2E57EDEB5}" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"><x15:workbookPr chartTrackingRefBase="1"/></ext></extLst></workbook>';
$xmlstr_7 = '<?xml version="1.0" encoding="utf-8"?>'."\n".'<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>';
$sourceZip = "UEsDBAoAAAAAANWJUU0AAAAAAAAAAAAAAAAJAAAAZG9jUHJvcHMvUEsDBBQAAAAIAAAAIQCFVevYjAEAABADAAAQAAAAZG9jUHJvcHMvYXBwLnhtbJ1SQW7bMBC8F8gfBN5jSklbFAbFoHBS5NCiBuzkvqVWFhGKJMiNYPctvfRQoD/oqb9JgT6jlAwrcpJTb7Ozg9FoluJi25qswxC1syUrZjnL0CpXabsp2c36w+k7lkUCW4FxFku2w8gu5MkrsQzOYyCNMUsWNpasIfJzzqNqsIU4S2ubNrULLVAaw4a7utYKL526b9ESP8vztxy3hLbC6tSPhmzvOO/of00rp/p88Xa988lPivfeG62A0l/KT1oFF11N2dVWoRF8uhTJaIXqPmjayVzw6ShWCgwukrGswUQU/JEQ1wh9aUvQIUrR0bxDRS5kUX9NtZ2x7AtE7OOUrIOgwRLby/bDgI2PFOSfXz8efn/7+/2n4CM3wKl0ivVrWQyCBI6FfMyR8HHCtSaD8XO9hEAvBC6mgYcMbBJx1SBS8Szf4UtPvBeu9WBTf3xEH7W9izd+7S6B8NDmMSlWDQSs0gHGtkdCXKdcwfT6RQN2g9VB83zR3/52/8Bl8WaWn+f5cPIDJ/jjU5b/AFBLAwQUAAAACAAAACEATtETSTEBAABXAgAAEQAAAGRvY1Byb3BzL2NvcmUueG1sjZJRS8MwFIXfBf9DyXubZB06Q9uByp4cCE4mvoXkrgs2aUiiXf+9bbd1G+7Bx5tz7nfPvSSb73QV/YDzqjY5oglBERhRS2XKHL2vFvEMRT5wI3lVG8hRCx7Ni9ubTFgmagevrrbgggIfdSTjmbA52oZgGcZebEFzn3QO04mb2mkeutKV2HLxxUvAE0LusIbAJQ8c98DYjkR0QEoxIu23qwaAFBgq0GCCxzSh+OQN4LS/2jAoZ06tQmvhqvUoju6dV6OxaZqkSQdrl5/ij+XL27BqrEx/KwGoyKRgwgEPtSvKdpvhs7q/XcV9WHZn3iiQj+3e8vc5O6yzbwUZdTHYPvRRWadPz6sFKiaEzmJKYnq/Ig+MEDZNP/upF/0noD4M+TeRTll6TjwCiiH35VcofgFQSwMECgAAAAAA74lRTQAAAAAAAAAAAAAAAAMAAAB4bC9QSwMECgAAAAAA1YlRTQAAAAAAAAAAAAAAABMAAAB4bC9wcmludGVyU2V0dGluZ3MvUEsDBBQAAAAIAAAAIQA+m4sQzwcAABAhAAAnAAAAeGwvcHJpbnRlclNldHRpbmdzL3ByaW50ZXJTZXR0aW5nczEuYmlu7VZ/jBx1Ff/egYWeQFtbUwk2Xo6CWm25vd4tbfS87O7M3u6yszM3M3tXDLiZm/ne7tzNzHeYH3e3kNSWH+FESTSVEFuKUWqK1hYkHFKwqC0aSkIQriYttjQWKrXJ2SInRWpT33dmd++4K9VEI/6x73I7833vfd973/c+730nhQTUjLJIQS7CyEEZ+PWAI8A7gSeH2lAriqCVlbe2QJaAHc2IUsOlaN5h1N6cOL/hsgY0H23+ePvlGmpAC9C6xkZ4rmu8BLRiqB3996hhxrMR/hfDy3mg2XpMOpdvQQubslecWLxk61VDF7PZcxE/8+ZwwveGWZyZOg0X5fwraqj81el/STPzvbAJIYmTM8E7Qk2p/6BPomAjbdm+F9ctlORFTuLzYoJFIisx2SzKW7qDXfqWEhii5tNSPo1kx8eIlQQxLUu+bRPHw1rITAlCgpg2cXUP56V4N/Yk7OiKkfPNfuygkm1rw7e1RlZphlEoYo/Bw7qKZ6r0URNpy/UUw5B1EyeINaAXP2SjIHCMbxt4tLJvpuukbuB/w98FjSERu8TwPZ1YKNraqtk6SiquB9zwlKEeyvE5FvGOji1PCXQFXpTFWFqGWEK2SECCI2taYb/hYiQoNnYk/XaMYu2Iw5quyGUbFnmZRyyXlGxCDN0qDhBHyEojhCO2DtEEPhPEMMAW4pNJMF/bKzsYoscjArF9u6ZJHI5oGLW199s2YlViEZOuwyBkPOrF3LihqENVjgxr3TMV25Ww50EEwKIWeN+DeDDKCGw3ayn9kNKY7xEIIFx1O8qA7tG0A0hcmoIKCkR8m49dj+8fxKonK0XGN+2Ks5ow5xuG5Dm6DftNxdJq8lS539E1EVsaJGtE99RSjRl4Fxzd8np8xdC9crdD4NxCT/AstIUoFRxi0xL6jooZxVMAB2rJiEQ7VqlKP6hMZ4jjc3wiJfIcW+B4hqUgYrJBTeBZEBLZKGVlsqylEo3mJS8n1wArQ/pjqkp8K0gWrPl4LJGQC8EzJxe6RT4v5GIctRgnjsVbDC0eLHgm3B4vww8/jB04FSQ4nuGBv47LUtzmXegniNlsa41EV42aBoiyti5hA7JJswyIMgCU1TLU0lwMSlctARh3saQqVhZq6CaJU8FtMpaV2NpmQSli2mlOLf8hv1Yet2ox5LMDA7pKwc0BrGbZSptgDLKvUjRYRUHxSjUNqq6WHGLioH4U12KeChK01UmfA31bkVCAwNjRqhocNolT5hQLrDvVaGC2zACeSDuwVzFAFLkRccpoEHoK68WSh6LtoX687OGYoRctrAWqkJI+XYMY2zqioQaDDU8RyUhKMQZkYuGKRRqDYgHiwgwyMD5IMe1h00V0Vjl+UJY0U2iNFJKxBMvwfbmVOV7k5ZgcgKra9+F+GGqwSYGzuohdxybycrqXndnVc9VSbKz35mDGZaOC4royZNIvlqrJkEzF8cJdEiQ+rCoA7AJyXtNmCcOjJTHWZg6z6jnoMPO98IL4EPnc3NDmMlDwC/WZpULd8w40N2KHsUVXblJ3XC9Qs6ejkYnsKOXIB8OcNhEOV8Q4OgC9soAEUQjxVpx4JQk6yw13GeUaunPQXYw+MBC4pHYSJQLjv4o1ymFHVWzTQ7rBLQIQFViYHnOkWTLCwty6MLsXzjdbkqboHlDAm1QiIx+UzVGGQQ4HA3xhJ0g4yGlLua43s/aCFCDahLpUg81KYbBB0VN+f6FyScOM9WAn9KlbIiQc8+Gha5rQuxqA2QyS5s4RJ0pYHYLbSQty7tsa5LyiJUhwrdJ71C2E9yl4o34NHbsS1Mafo8fb4aVZY8AlYZYr3Gmn0GHYK0jQXG3R1YU4PDsi7YVUsO6oTR4x1le9Pat4oe3jw1xL+K5HzKAFax8pDo5ZilF29enhprjl4F5APPXOpeCbJ6eYVJRMV6pfYNJxyaMXUkEGlMlwiSFGd6l/7aP5KgzpxGL4hssLqRb4Shx9aPLQy6suiX36stOnBlue37it+8Hk3vsZcf4Kzdy+s7k3LdsL72va/GjiyGt3jfWdvnTvTVMnGm75Tf7LGze9z5lDE13v3vnq+q4th763tevZTcZft0xOHVpw9wPLrtmw8Ymr0t/v2/ByPvrmwZXj768451ktl99w5Om/zB9uYJd2PjfhbrvxkRXkTe7hH7+DovadT25b/tRzf/z71C9Pn1s8fsOerx7K7f7FwJKmezLrT+xYNjE5dWSnvv+l0c7HXnnmwKNfe+z+np9e+ydfHVSk0f1Hn9++pfPKwbXJu5yOZffeft2ZL209fPyH76yc3DXy82f/fGr91rGxsRdP7uw67mufeWvNe5PzFy3quXLPmR+88bcW8eCvP//qC6nX9l3dKLyQufUT3S89vHzRKwsmzt9xsnPhA48f2DuW+dz219+7R95z9Nj4efE7m/bt7v7UpoN333rfsbPO67/9GfP2GPPutd84drW+Y+nxB5cf/cLvP/uje88OLlHFR7694bq3Pvat77548pv7f3f0V4WbJyffOLfgpi8+vrnzky2Dz6z9w5N73x4/nTlwy3j2jl1d3tLdV3xlxz/2TTz99bXthdXN/rnRyNRPds0rXG+dfeLMU53XrM4f3uUOtVSIP7VkeHDPRwmhOtWpTnWqU53qVKc61alOdapTnepUpzr9H9A/AVBLAwQUAAAACAAAACEA/TUTxw8DAAC8CAAADQAAAHhsL3N0eWxlcy54bWy9Vr1u2zAQ3gv0HQTtCiVZcmxDVhDHERAgLQokBboVtETZ
if(strtolower(substr($fn, -5)) != '.xlsx') {
return false;
}
if(substr($fn, 0, 1) != '/' && !preg_match("/^[A-Za-z]\:/", $fn)) {
$fn = getcwd()."/".$fn;
}
if(file_exists($fn)) {
@unlink($fn);
if(file_exists($fn)) return false;
}
$root = dirname($fn);
$dir = opendir($root);
while($t_fn = readdir($dir)) {
if($t_fn == '.' || $t_fn == '..') continue;
$tmpfn = $root."/".$t_fn;
if(stristr($t_fn, '.xlsxtmp')) {
if(time() - filemtime($tmpfn) > 600) @unlink($tmpfn);
}
}
closedir($dir);
file_put_contents($fn, base64_decode($sourceZip));
$zip = new ZipArchive;
$r = $zip->open($fn);
if(!$r) {
@unlink($fn);
return false;
}
//exit;
/*$cls = new ReflectionClass('REST_Controller');
foreach($cls->getProperties() as $property) {
if($property->getName() == 'rest') {
$property->setAccessible(true);
$rest = $property->getValue($GLOBALS['CI']);
die("ds");
}
}*/
//exit;
foreach($sheets as $sitem) {
if($sitem['sql']) {
/*$dbtype = '';
if($GLOBALS['CI']) {//print_r($GLOBALS['CI']);exit;
try {
$property = new ReflectionProperty('REST_Controller', 'rest');
$property->setAccessible(true);
$rest = $property->getValue($GLOBALS['CI']);
$conn_id = $rest->db->conn_id;
$dbtype = 'mysqli';
} catch(Exception $e) {
if($GLOBALS['CI']->db) {
$conn_id = $GLOBALS['CI']->db->conn_id;
$dbtype = 'mysqli';
}
}
}
if(!$dbtype) {
if(is_file("/home/www/ftdcdb.inc.php")) require("/home/www/ftdcdb.inc.php");
else require("d:/web/ftdcdb.inc.php");
$dbtype = 'mysql';
$hinfo = @mysql_get_host_info();
if($hinfo && stristr($hinfo, $ftdcdb_host)) {
$conn_id = '';
} else {
$conn_id = mysql_connect($ftdcdb_host, $ftdcdb_username, $ftdcdb_password);
mysql_select_db($ftdcdb_database);
mysql_query("set names utf8");
}
}*/
$dbtype = 'mysql';
require("/home/www/ftdcdb.inc.php");
$conn_id = mysql_connect($ftdcdb_host, $ftdcdb_username, $ftdcdb_password);
mysql_select_db($ftdcdb_database);
mysql_query("set names utf8");
break;
}
}
$workbook = '';
$rels = '';
foreach($sheets as $n => $sitem) {
$n1 = $n + 1;
$sheet_name = $sitem['sheet_name'];
if(!$sheet_name) $sheet_name = 'Sheet'.$n1;
$workbook .= '<sheet name="'.xlsx_filter_chr($sheet_name, $conv).'" sheetId="'.$n1.'" r:id="rIdx'.$n1.'"/>';
$rels .= '<Relationship Id="rIdx'.$n1.'" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet'.$n1.'.xml"/>';
}
$workbook = $xmlstr_5.$workbook.$xmlstr_6;
$rels = $xmlstr_7.$rels.'</Relationships>';
$zip->addFromString('xl/workbook.xml', $workbook);
$zip->addFromString('xl/_rels/workbook.xml.rels', $rels);
$strN = 1;
$xmlstr2 = $xmlstr_3.'><si><t></t><phoneticPr fontId="1" type="noConversion"/></si>';
$fn2 = $root."/".md5(microtime()."xml2").".xlsxtmp";
$fileList = array($fn2);
foreach($sheets as $sn => $sitem) {
$titles = $sitem['titles'];
$widths = $sitem['widths'];
$list = $sitem['list'];
$listfunc = $sitem['listfunc'];
$sql = $sitem['sql'];
$issql = false;
$func = $sitem['func'];
if($sql) $issql = true;
else {
if($listfunc) $list = $listfunc();
}
$fn1 = $root."/".md5(microtime().$fn1).".xlsxtmp";
$fileList[] = $fn1;
if($issql) {
if($dbtype == 'mysqli') {
$rs = mysqli_query($conn_id, $sql);
} else {
if($conn_id) $rs = mysql_unbuffered_query($sql, $conn_id);
else $rs = mysql_unbuffered_query($sql);
}
if(!$rs) {
return false;
}
$fields = array();
$funcname = ($dbtype == 'mysqli'?"mysqli_fetch_field":"mysql_fetch_field");
while($row = $funcname($rs)) {
$fields[] = $row->name;
}
if(!$titles) {
$titles = $fields;
}
}
$colnum = count($titles);
$colstr = '';
foreach($titles as $n => $title) {
$width = 15;
if($widths && $widths[$n]) $width = $widths[$n];
$colstr .= '<col min="'.($n+1).'" max="'.($n+1).'" width="'.$width.'" customWidth="1"/> ';
}
$xmlstr = $xmlstr_1.$colstr.'</cols><sheetData>';
$xmlstr .= '<row r="1" spans="1:2" x14ac:dyDescent="0.15">';
foreach($titles as $n => $title) {
$idx = $strN;
$strN++;
$xmlstr2 .= '<si><t>'.xlsx_filter_chr($title, $conv).'</t><phoneticPr fontId="1" type="noConversion"/></si>';
$xmlstr .= '<c r="'.$xlschars[$n].'1" s="1" t="s"><v>'.$idx.'</v></c>';
}
$xmlstr .= '</row>';
$n1 = -1;
while(1) {
$n1++;
if($issql) {
$funcname = ($dbtype == 'mysqli'?"mysqli_fetch_row":"mysql_fetch_row");
$item = $funcname($rs);
if(!$item) break;
} else {
if($n1 >= count($list)) break;
$item = $list[$n1];
}
if($func) {
$row2 = array();
if($fields) {
foreach($item as $k => $v) {
$row2[$fields[$k]] = $v;
}
}
$item = $func($item, $row2);
}
$xmlstr .= '<row r="'.($n1+2).'" spans="1:'.$colnum.'" x14ac:dyDescent="0.15">';
foreach($item as $n2 => $value) {
$value = $value.'';
if($value == '') {
$xmlstr .= '<c r="'.$xlschars[$n2].($n1+2).'" t="s"><v>0</v></c>';
continue;
}
if(is_numeric($value)) {
if(strstr($value, ".")) {
if(substr($value, 0, 1) == '.') $value = "0".$value;
$xmlstr .= '<c r="'.$xlschars[$n2].($n1+2).'"><v>'.$value.'</v></c>';
continue;
} else {
if(substr($value, 0, 1) != '0' && strlen($value) <= 10) {
$xmlstr .= '<c r="'.$xlschars[$n2].($n1+2).'"><v>'.$value.'</v></c>';
continue;
}
}
}
$idx = $strN;
$strN++;
$xmlstr2 .= '<si><t>'.xlsx_filter_chr($value, $conv).'</t><phoneticPr fontId="1" type="noConversion"/></si>'."\n";
$xmlstr .= '<c r="'.$xlschars[$n2].($n1+2).'" t="s" s="2"><v>'.$idx.'</v></c>';
}
$xmlstr .= '</row>';
if(strlen($xmlstr) > 50000) {
file_put_contents($fn1, $xmlstr, FILE_APPEND);
$xmlstr = '';
}
if(strlen($xmlstr2) > 50000) {
file_put_contents($fn2, $xmlstr2, FILE_APPEND);
$xmlstr2 = '';
}
}
$xmlstr .= $xmlstr_2;
file_put_contents($fn1, $xmlstr, FILE_APPEND);
$zip->addFile($fn1, 'xl/worksheets/sheet'.($sn+1).'.xml');
}
$xmlstr2 .= '</sst>';
file_put_contents($fn2, $xmlstr2, FILE_APPEND);
$zip->addFile($fn2, 'xl/sharedStrings.xml');
$zip->close();
foreach($fileList as $fn) @unlink($fn);
return true;
}