link_title; $extraParms['SQL2EXCEL_WB_DLCNT'] = $wbParms->count + 1; $colHeadRow=1; // Filename $fileName = trim($wbParms->filename); $fileName = writeExcel::replace_vars($fileName, $substParms, $extraParms, $cmpParms ); $fileName = trim($fileName); $fileName = str_replace('.xls','.csv',$fileName); $fileName = str_replace('.XLS','.csv',$fileName); if ( $fileName == '' || $fileName == null ) { $fileName = 'download.csv'; } // Compression? $usingCompression = false; if ( !$noComp && ($wbParms->compress_wb == 'Yes' || ($wbParms->compress_wb == 'Global' && Sql2excelParms::get($cmpParms,'compress_wb', 0) ) )) { // Load ZIP class require_once ( JPATH_SITE.DS.'components'.DS.'com_sql2excel'.DS.'helpers'.DS.'zip.lib.php'); $usingCompression = true; } // Check extension $path_info = pathinfo($fileName); if ( !isset($path_info['extension']) || ( isset($path_info['extension']) && strtolower($path_info['extension']) != 'csv' ) ) { $fileName .= '.csv'; } $extraParms['SQL2EXCEL_WB_FN'] = $fileName; // Write Header if ( ! $silent && !$usingCompression ) { writeCSV::CSVHeader($fileName); } ////////////////////////////////////////////////////////////////// // Use Cache? ////////////////////////////////////////////////////////////////// $cacheEnabled = Sql2excelParms::get($cmpParms,'cache_enabled', 0); $cacheDir = writeExcel::get_cache_dir($cmpParms); $cacheTime = Sql2excelParms::get($cmpParms,'cache_time', 30); $wbCache = $wbParms->cache; $usingCache = false; if ( ( $useCache && ($cacheEnabled && $wbCache == 'Global') ) || ( $useCache && $wbCache == 'Yes' ) ) { $usingCache = true; } if ( $usingCache || $usingCompression ) { // Cache or Compression if ( file_exists($cacheDir) ) { $cacheFileName = writeExcel::get_cache_filename($wbParms, $wsParms); $wbFN = $cacheDir . 'download_csv_' . $cacheFileName . '.cache'; if ( $usingCompression ) { $wbFN .= '_c'; } $cacheFN = $wbFN; if ( $silent && $usingCompression ) { // Write out original filename (.csv), will be zippped later into the cache file $wbFN = $wbParms->filename; if ( substr($wbFN,strlen($wbFN)-4,4) != '.csv' ) { $wbFN .= '.csv'; } $wbFN = $cacheDir . $wbFN; } if ( $usingCache && file_exists($wbFN) && !$silent ) { // Serve from Cache!? $fileModified = filemtime($wbFN); $age = time() - $fileModified; $minutesOld = $age / 60; if ( $cacheTime >= $minutesOld ) { // Server from cache if ( $usingCompression ) { $fsize = @filesize($wbFN); $fh = fopen($wbFN, 'rb', false); if ($fh == false) { die("Can't read cache file."); } $data = fread($fh, $fsize); fclose($fh); // Write the ZIP header writeExcel::ZipHeader(str_replace('.csv','.zip', $fileName),strlen($data)); // Output cached file echo $data; } else { $fh = fopen($wbFN, "rb"); if ($fh == false) { die("Can't read cache file."); } fpassthru($fh); } return; } } } } //////////////////////////////////////////////////////////////// // Write to file? (Cache or Compression) $fh = -1; if ( $wbFN != '-' && $wbFN != '' ) { $fh = fopen($wbFN, "w"); } // Get which Worksheet to output if ( is_array($wsParms) ) { // Get first sheet $sheetID = $wsParms[0]->ws_id; // Sheet specified through URL? if ( $sheet > 0 ) { // Yes, check that the sheet is accessible $sheetID = 0; foreach ( $wsParms as $ws ) { if ( $ws->ws_id == $sheet ) { $sheetID = $sheet; } } } if ( $sheetID > 0 ) { // OK We have a Sheet! // Get WS Object $ws = new stdClass; foreach ( $wsParms as $wsheet ) { if ( $wsheet->ws_id == $sheetID ) { $ws = $wsheet; } } $sheetName = $ws->sheetname; if ( trim($sheetName) == '' ) { $sheetName = 'Sheet 1'; } $extraParms['SQL2EXCEL_WS_SN'] = $sheetName; $extraParms['SQL2EXCEL_WS_DLCNT'] = $ws->count + 1; $query = $ws->query; $extraParms['SQL2EXCEL_WS_SQL_RAW'] = $query; // Substitute variables in SQL query? if ( Sql2excelParms::get($cmpParms,'subst_sql', '1') ) { $query = writeExcel::replace_vars($query, $substParms,0,$cmpParms); } $extraParms['SQL2EXCEL_WS_SQL'] = $query; // Forumla columns $formulas = explode(',', $ws->formulas ); // Get Database Connection $querydb = writeExcel::getDB($ws); // Run query! if ( $querydb ) { $rows = writeExcel::getResults($querydb, $query, $cmpParms, $ws->db_type); if ( is_array($rows) ) { $extraParms['SQL2EXCEL_WS_ROWS'] = count($rows); $maxdatarow = count($rows) + 1; // Rows + Column header $removeCR = Sql2excelParms::get($cmpParms,'removereturncsv', 1); // Get number of columns $colNames = writeExcel::getColumnNames($rows); //Number of Columns in user query (exclude JoomFish fields if any) $nrCols = writeExcel::getColumnCount($colNames, $query); // Add column header if ( $ws->show_colheader <> 0 ) { $str = ''; for ($i=0; $i<$nrCols; $i++) { $colUser = $i + 1; $str .= writeCSV::format_value($colNames[$i], 1, $colUser, 0, $maxdatarow) . ','; } if ( $fh != - 1 ) { fwrite($fh,$str ."\n"); } else { print $str ."\n"; } $rowUser = 2; } else { $rowUser = 1; } foreach ( $rows as $row ) { $str = ''; $colUser = 1; for ( $i=0; $i<$nrCols; $i++) { $str .= writeCSV::format_value($row->$colNames[$i], $rowUser, $colUser, $formulas, $maxdatarow, $removeCR) . ','; $colUser++; } $str = substr($str,0,strlen($str)-1); if ( $fh != - 1 ) { fwrite($fh,$str ."\n"); } else { print $str ."\n"; } $rowUser++; } // Close output file - if needed if ( $fh != - 1 ) { fclose($fh); $fh = -1; } // Compression or Cache? if ( !is_null($wbFN) && is_string($wbFN) && $wbFN != '-' ) { if ( $usingCompression ) { // Compress the file with ZIP $zip = new zipfile(); $fsize = @filesize($wbFN); $fh = fopen($wbFN, 'rb', false); $data = fread($fh, $fsize); fclose($fh); $zip->addFile($data,$fileName); $zipcontents = $zip->file(); if ( !$silent ) { // Write the ZIP header writeExcel::ZipHeader(str_replace('.csv','.zip', $fileName),strlen($zipcontents)); // Output ZIP data to browser echo $zipcontents; } // Cleanup or Save ZIP file to cache!? if ( !$usingCache ) { unlink($wbFN); } else { $fh = fopen($cacheFN, 'wb', false); fputs($fh,$zipcontents); fclose($fh); } } elseif ( !$silent ) { // Stream file from cache $fh = fopen($wbFN, "rb"); if ($fh == false) { die("Can't read cache file."); } fpassthru($fh); } if ( $usingCache && $silent ) { // Copy cache file to ./scheduler subfolder for email attachment writeExcel::copyCacheFile($cacheFN, $fileName, $cacheDir); // Compress the cache file? if ( $wbParms->compress_wb == 'Yes' || ($wbParms->compress_wb == 'Global' && Sql2excelParms::get($cmpParms,'compress_wb', 0) ) ) { $zip = new zipfile(); $fsize = @filesize($cacheFN); $fh = fopen($cacheFN, 'rb', false); $data = fread($fh, $fsize); fclose($fh); $zip->addFile($data,$fileName); $zipcontents = $zip->file(); $fh = fopen($cacheFN.'_c', 'wb', false); fputs($fh,$zipcontents); fclose($fh); unlink($cacheFN); } } } } } else { $rows = JText::_( 'DB_CONNECT_ERROR'); } } else { JError::raiseError( 500, JText::_( 'Worksheet not found or access denied' ) ); } } // Unset database handle unset($querydb); unset($GLOBALS['querydb']); // Close output file if still open if ( $fh != - 1 ) { fclose($fh); } } function format_value($str, $rowUser, $colUser, $formulas, $maxdatarow, $removeCR=1) { // Replace CRLF if ( $removeCR > 0 ) { $str = writeExcel::removeCR($str,$removeCR); } // Formula? if ( is_array($formulas) && in_array($colUser, $formulas) ) { // Formula! => Parse and replace Row and Col ID's $str = writeExcel::replace_row_col_ids($str, $rowUser, $colUser, 1, $maxdatarow); } if ( !is_numeric($str) ) { $str = '"' . str_replace('"','""',$str) . '"'; } return $str; } function CSVHeader($fileName) { header("Content-type: application/octet-stream"); header('Content-Disposition: attachment; filename="' . $fileName . '"'); header("Pragma: no-cache"); header("Expires: 0"); } } ?>