Files
2021-04-20 11:13:47 +05:30

314 lines
11 KiB
PHP

<?php
// +----------------------------------------------------------------------+
// | OpenConf |
// +----------------------------------------------------------------------+
// | Copyright (c) 2002-2020 Zakon Group LLC. All Rights Reserved. |
// +----------------------------------------------------------------------+
// | This source file is subject to the OpenConf License, available on |
// | the OpenConf web site: www.OpenConf.com |
// +----------------------------------------------------------------------+
$OC_exportCharLimit = 32767; // max number of characters to include in a XLS(X)/CSV/TXT cell - optional based on user checkbox selection
$OC_exportFormatAR = array(
'csv' => array('name'=>'CSV', 'mime'=>'text/plain'),
'xls' => array('name'=>'Microsoft Excel 2000', 'mime'=>'application/vnd.ms-excel'),
'xlsx' => array('name'=>'Microsoft Excel 2007', 'mime'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
'txt' => array('name'=>'Text (tab-delimited)', 'mime'=>'text/plain'),
'xml' => array('name'=>'XML', 'mime'=>'application/xml')
);
function oc_export_headers($filename, $format) {
oc_sendNoCacheHeaders();
header('Content-Type: ' . $GLOBALS['OC_exportFormatAR'][$format]['mime']);
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
function oc_export_err($e) {
if (isset($GLOBALS['hdr'])) {
$hdr = $GLOBALS['hdr'];
} else {
$hdr = 'Export Error';
}
if (isset($GLOBALS['hdrfn'])) {
$hdrfn = $GLOBALS['hdrfn'];
} else {
$hdrfn = 1;
}
err($e, $hdr, $hdrfn);
}
function oc_colID($cols) { // converts a column number to its alpha representation (e.g., 0=A, 25=Z, 26=AA)
for ($r=""; $cols>=0; ($cols = intval($cols/26)-1)) {
$r = chr($cols%26 + 0x41) . $r;
}
return $r;
}
function oc_export(&$scope, &$exportFieldsAR, &$fieldNameAR, &$dbR, &$extraAR=array(), &$fieldAR=array()) {
if (isset($_POST['format']) && isset($GLOBALS['OC_exportFormatAR'][$_POST['format']])) {
$format = $_POST['format'];
} else {
$format = 'csv';
}
// set filename
$fileName = 'openconf';
if (preg_match("/^\w+$/", $GLOBALS['OC_configAR']['OC_confName'])) {
$fileName .= '-' . $GLOBALS['OC_configAR']['OC_confName'];
}
$fileName .= '-' . oc_strtolower($scope) . '-' . date('YmdHi') . '.' . $format;
// field limit?
if (isset($_POST['charlimit']) && ($_POST['charlimit'] == 1)) {
$useCharLimit = $GLOBALS['OC_exportCharLimit'];
} else {
$useCharLimit = 0;
}
// export file
switch ($format) {
case 'xlsx': // *****************************************************************
$rows = ocsql_num_rows($dbR) + 1; // +1 = header
$cols = count($exportFieldsAR);
$celltotal = $rows * $cols;
if (!class_exists('ZipArchive')) {
oc_export_err('ZipArchive library missing');
}
$tempZip = tempnam('/tmp/', 'ocexport') or oc_export_err('could not generate Excel file (1)');
copy(OCC_LIB_DIR . 'xlsx-template.zip', $tempZip) or oc_export_err('could not generate Excel file (2)');
$zip = new ZipArchive;
if (($res = $zip->open($tempZip)) && ($res === true)) {
// Create/add sheet1.xml
$sheetFile = tempnam('/tmp/', 'ocexport') or oc_export_err('could not generate Excel file (3)');
$fp = fopen($sheetFile, 'w') or oc_export_err('could not generate Excel file (4)');
fputs($fp, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"><dimension ref="A1:' . oc_colID($cols) . $rows . '"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"/></sheetViews><sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/><sheetData>');
$v = 0;
for ($row=1; $row<=$rows; $row++) {
fputs($fp, '<row r="' . $row . '" spans="1:' . $cols . '" ' . (($row==1) ? 'customFormat="1" ' : '') . 'x14ac:dyDescent="0.25">');
for ($col=0; $col<$cols; $col++) {
fputs($fp, '<c r="' . oc_colID($col) . $row . '" ' . (($row==1) ? 's="1" ' : '') . 't="s"><v>' . $v++ . '</v></c>');
}
fputs($fp, '</row>');
}
fputs($fp, '</sheetData><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/></worksheet>');
fclose($fp);
if (($res = $zip->addFile($sheetFile, 'xl/worksheets/sheet1.xml')) && ($res === false)) {
$zip->close();
unlink($sheetFile);
unlink($tempZip);
oc_export_err('could not generate Excel file (5)');
}
// create/add shareStrings.xml
$sharedStringsFile = tempnam('/tmp/', 'ocexport') or oc_export_err('could not generate Excel file (6)');
$fp = fopen($sharedStringsFile, 'w') or oc_export_err('could not generate Excel file (7)');
fputs($fp, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="' . $celltotal . '" uniqueCount="' . $celltotal . '">');
foreach ($exportFieldsAR as $f) { // header
fputs($fp, '<si><t>' . htmlspecialchars(isset($fieldNameAR[$f]) ? $fieldNameAR[$f] : ucwords(preg_replace("/_/", " ", trim($f, "_")))) . '</t></si>');
}
while ($l = ocsql_fetch_array($dbR)) { // data
foreach ($exportFieldsAR as $f) {
if (preg_match("/^_/", $f)) {
if (isset($extraAR[$l['id']][$f])) {
$val = $extraAR[$l['id']][$f];
} else {
$val ='';
}
} else {
$val = oc_getFieldValue($fieldAR, $l, $f, '', $useCharLimit, false);
}
fputs($fp, '<si><t>' . htmlspecialchars($val) . '</t></si>');
}
}
fputs($fp, '</sst>');
fclose($fp);
if (($res = $zip->addFile($sharedStringsFile, 'xl/sharedStrings.xml')) && ($res === false)) {
$zip->close();
unlink($sheetFile);
unlink($sharedStringsFile);
unlink($tempZip);
oc_export_err('could not generate Excel file (8)');
}
// create/add core.xml
$coreFile = tempnam('/tmp/', 'ocexport') or die('could not generate Excel file (6)');
$fp = fopen($coreFile, 'w') or oc_export_err('could not generate Excel file (9)');
fputs($fp, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:creator>OpenConf</dc:creator><dcterms:created xsi:type="dcterms:W3CDTF">' . date("Y-m-d\TH:i:s.00\Z") . '</dcterms:created></cp:coreProperties>');
fclose($fp);
if (($res = $zip->addFile($coreFile, 'docProps/core.xml')) && ($res === false)) {
$zip->close();
unlink($sheetFile);
unlink($sharedStringsFile);
unlink($coreFile);
unlink($tempZip);
oc_export_err('could not generate Excel file (10)');
}
$zip->close();
unlink($sheetFile);
unlink($sharedStringsFile);
unlink($coreFile);
oc_export_headers($fileName, $format);
readfile($tempZip);
unlink($tempZip);
} else {
oc_export_err('could not generate Excel file (0)');
}
break;
case 'xls': // *****************************************************************
oc_export_headers($fileName, $format);
print '<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
<style id="Classeur1_16681_Styles">
</style>
</head>
<body>
<div id="Classeur1_16681" align=center x:publishsource="Excel">
<table x:str border=0 cellpadding=0 cellspacing=0 width=100% style="border-collapse: collapse">
';
// Title Row
print '<tr>';
foreach ($exportFieldsAR as $f) {
print '<td class=xl2216681 nowrap><strong>' . htmlspecialchars(isset($fieldNameAR[$f]) ? $fieldNameAR[$f] : ucwords(preg_replace("/_/", " ", trim($f, "_")))) . '</strong></td>';
}
print '</tr>';
// Iterate through records
while ($l = ocsql_fetch_array($dbR)) {
print '<tr>';
foreach ($exportFieldsAR as $f) {
if (preg_match("/^_/", $f)) {
if (isset($extraAR[$l['id']][$f])) {
$val = $extraAR[$l['id']][$f];
} else {
$val ='';
}
} else {
$val = oc_getFieldValue($fieldAR, $l, $f, '', $useCharLimit, false);
}
print '<td class=xl2216681 nowrap>' . htmlspecialchars($val) . '</td>';
}
print '</tr>';
}
print '
</table>
</div>
</body>
</html>
';
break;
case 'xml': // *****************************************************************
oc_export_headers($fileName, $format);
print '<?xml version="1.0" encoding="utf-8" ?>
<!--
-
- OpenConf Export: ' . $scope . '
-
- Version: ' . $GLOBALS['OC_configAR']['OC_version'] . '
- Created: ' . date('Y-m-d H:i:s') . '
-
-->
<openconf>
';
// Iterate through records
while ($l = ocsql_fetch_array($dbR)) {
print " <entry>\n";
foreach ($exportFieldsAR as $f) {
$tag = (isset($fieldNameAR[$f]) ? $fieldNameAR[$f] : ucwords(preg_replace("/_/", " ", trim($f, "_"))));
$tag = preg_replace("/[^\w]/", "", $tag);
if (preg_match("/^_/", $f)) {
if (isset($extraAR[$l['id']][$f])) {
$val = $extraAR[$l['id']][$f];
} else {
$val ='';
}
} else {
$val = oc_getFieldValue($fieldAR, $l, $f, '', $useCharLimit, false);
}
if ($val == '') {
print " <$tag />\n";
} else {
print " <$tag>" . htmlspecialchars($val) . "</$tag>\n";
}
}
print " </entry>\n";
}
print '</openconf>';
break;
default: // *****************************************************************
oc_export_headers($fileName, $format);
if ($format == 'txt') {
$delim = "\t";
} else {
$delim = ',';
}
// Title Row
$titlerow = '';
foreach ($exportFieldsAR as $f) {
$titlerow .= '"' . str_replace("\"", "\"\"", (isset($fieldNameAR[$f]) ? $fieldNameAR[$f] : preg_replace("/_/", " ", trim($f, "_")))) . '"' . $delim;
}
print oc_strtoupper(rtrim($titlerow, $delim)) . "\r\n";
// Iterate through records
while ($l = ocsql_fetch_array($dbR)) {
$row = '';
// Add non-author/extra fields to row
foreach ($exportFieldsAR as $f) {
if (preg_match("/^_/", $f)) {
$row .= '"' . (isset($extraAR[$l['id']][$f]) ? str_replace("\"", "\"\"", $extraAR[$l['id']][$f]) : '') . '"' . $delim;
} else {
$row .= '"' . str_replace("\"", "\"\"", oc_getFieldValue($fieldAR, $l, $f, '', $useCharLimit, false)) . '"' . $delim;
}
}
$row = preg_replace("/\015(\012)?/", "\012", $row);
print rtrim($row, $delim) . "\015\012";
}
break;
}
// exit so not additional code is executed
exit;
} // oc_export f'n