test main csv output as excel

This commit is contained in:
Nathan Coad
2018-07-16 17:22:42 +10:00
parent 9c8ff253e4
commit 939f336489

View File

@@ -701,33 +701,40 @@ function ucname($string) {
function booking_csv_report() {
global $event;
$name = 'bookings-' . format_date(time(), 'custom', 'Y-m-d-His');
$filename = file_directory_temp() . '/' . $name;
module_load_include('php', 'booking', 'libraries/xlsxwriter.class');
$filename = 'bookings-' . format_date(time(), 'custom', 'Y-m-d-His') . '.xlsx';
// List of style options at https://github.com/mk-j/PHP_XLSXWriter/issues/198
$header_style = array( 'border'=>'bottom','border-style'=>'thin', 'border-color'=>'#000000',
'valign'=>'top', 'font-style' => 'bold','font' => 'Calibri');
$row_style = array('font' => 'Calibri');
//$filename = file_directory_temp() . '/' . $name;
$csv = '';
$delimiter = ',';
$enclosure = '"';
$encloseAll = true;
$encloseAll = false;
$nullToMysqlNull = true;
$delimiter_esc = preg_quote($delimiter, '/');
$enclosure_esc = preg_quote($enclosure, '/');
$readinggroup_id = "";
module_load_include('php', 'booking', 'libraries/xlsxwriter.class');
//$readinggroup = "session" . variable_get('booking_readinggroup_id','7');
$studygroup_descriptions = array();
$header_array = array();
$rows = array();
//calculate fields to ignore in the output csv file
$builtin_fields_to_skip = array('booking_eventid');
$custom_fields_to_skip = explode(";", variable_get('booking_csv_exclude_fields', ''));
$fields_to_skip = array_merge($builtin_fields_to_skip, $custom_fields_to_skip);
//keep a list of any fields that we need to handle as dates
$date_fields = array('booking_dob');
$datetime_fields = array('booking_outflight_origin_ts', 'booking_outflight_destination_ts', 'booking_rtrnflight_origin_ts',
'booking_rtrnflight_destination_ts', 'booking_timestamp', 'booking_flight_datetime_inbound', 'booking_flight_datetime_outbound');
$number_only_fields = array('booking_postcode', 'booking_mobile', 'booking_phone', 'booking_guardian_phone', 'booking_guardian_phone_alt');
//look up the titles of the study groups and add to array for updating in the header
$studygroup_descriptions = array();
$studygroups_query = db_query("SELECT * FROM {booking_studygroup_list} WHERE booking_eventid = :eid",
array(':eid' => $event->eid));
$studygroups = $studygroups_query->fetchAllAssoc('sid');
@@ -753,35 +760,50 @@ function booking_csv_report() {
//watchdog('booking', "CSV raw data: @info", array('@info' => var_export($result, TRUE)));
//write the header based on the first result
$header_array = array();
foreach (reset($result) as $key => $value) {
if (in_array($key, $fields_to_skip)) {
continue;
}
//Replace headings for study group sessions and roles with the name of the study group rather than just sessionN and sessionN_role etc
// Replace headings for study group sessions and roles with the name of the study group rather than just sessionN and sessionN_role etc
if (variable_get('booking_friendly_csv_groupnames','0') == 1 && array_key_exists($key, $studygroup_descriptions)) {
$header_array[] = $studygroup_descriptions[$key];
//$header_array[] = $studygroup_descriptions[$key];
$heading = $studygroup_descriptions[$key];
$header_array[$heading] = 'string';
continue;
}
$header_array[] = $key;
//add in a special column for a processed version of the date of birth
if (strcmp($key,"booking_dob") == 0) {
$header_array[] = "booking_dob_processed";
// Apply data formatting as per https://github.com/mk-j/PHP_XLSXWriter
if (in_array($key, $datetime_fields)) {
$header_array[$key] = 'datetime';
}
elseif (in_array($key, $date_fields)) {
$header_array[$key] = 'date';
}
elseif (in_array($key, $number_only_fields)) {
$header_array[$key] = 'integer';
}
else {
$header_array[$key] = 'string';
}
//add in a special column for a processed version of the date of birth
if (strcmp($key,"booking_dob") == 0) {
$header_array["booking_dob_processed"] = 'string';
}
//add in a calculated field for amount owing
if (strcmp($key, "nid") == 0) {
$header_array[] = "booking_amount_owing_gross";
$header_array[] = "booking_amount_owing_net";
$header_array["booking_amount_owing_gross"] = 'dollar';
$header_array["booking_amount_owing_net"] = 'dollar';
}
}
watchdog('booking_debug', "<pre>CSV report headers\n@info</pre>", array('@info' => print_r($header_array, true)));
$header = implode( $delimiter, $header_array );
//$header = implode( $delimiter, $header_array );
//$csv .= $header . "\n";
//watchdog('booking', "CSV header: @info", array('@info' => var_export($header_array, TRUE)));
//@fwrite($handle, $header . "\n");
$csv .= $header . "\n";
//each record
foreach ($result as $record) {
//watchdog('booking', "CSV raw data entry: @info", array('@info' => var_export($record, TRUE)));
@@ -873,38 +895,47 @@ function booking_csv_report() {
}
// Enclose fields containing $delimiter, $enclosure or whitespace
if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $value ) ) {
$output[] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $value) . $enclosure;
}
else {
//if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $value ) ) {
// $output[] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $value) . $enclosure;
//}
//else {
$output[] = $field;
}
//}
} // End of record processing
$rows[] = $output;
}
$row = implode($delimiter, $output) . "\n";
//@fwrite($handle, $row);
$csv .= $row;
//$index++;
//$row = implode($delimiter, $output) . "\n";
//$csv .= $row;
}
//@fclose($handle);
watchdog('booking_debug', "<pre>CSV report spreadsheet rows\n@info</pre>", array('@info' => print_r( $rows, true)));
// Create headers for Excel spreadsheet
header('Content-disposition: attachment; filename="'.XLSXWriter::sanitize_filename($filename).'"');
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$sheetname = $event->booking_eventname;
$writer = new XLSXWriter();
$writer->setAuthor($event->booking_eventname);
//Add the header row
$writer->writeSheetHeader($sheetname, $column_headings, $header_style);
//Add the data
foreach($rows as $row) {
$writer->writeSheetRow($sheetname, $row, $row_style);
}
$writer->writeToStdOut();
exit(0);
//see http://stackoverflow.com/questions/4348802/how-can-i-output-a-utf-8-csv-in-php-that-excel-will-read-properly
// but none of these options seem to work
drupal_add_http_header("Content-type", "application/octet-stream; charset=utf-8");
//drupal_add_http_header("Content-type", "application/octet-stream; charset=UTF-16LE");
//drupal_add_http_header("Content-Type: application/vnd.ms-excel");
drupal_add_http_header("Content-Disposition", "attachment; filename=" . $name . ".csv");
// @readfile($filename);
//print chr(255) . chr(254);
//print 'sep=,' . "\n";
print $csv;
//print mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
//@unlink($filename);
exit(0);
//drupal_add_http_header("Content-type", "application/octet-stream; charset=utf-8");
//drupal_add_http_header("Content-Disposition", "attachment; filename=" . $name . ".csv");
//print $csv;
//exit(0);
}