diff --git a/xlsxwriter.class.php b/xlsxwriter.class.php
index a987735f8..76868cf00 100644
--- a/xlsxwriter.class.php
+++ b/xlsxwriter.class.php
@@ -365,11 +365,25 @@ protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $col
} elseif (is_string($value) && $value{0}=='='){
$file->write(''.self::xmlspecialchars($value).'');
} elseif ($num_format_type=='n_date') {
- $file->write(''.intval(self::convert_date_time($value)).'');
+ $dateValue = self::convert_date_time($value);
+ if ($dateValue > 0 || preg_match("/(\d+):(\d{2}):(\d{2})/", $value)) {
+ $file->write(''.intval($dateValue).'');
+ } else { //not date, treat it as string
+ $file->write(''.self::xmlspecialchars($value).'');
+ }
} elseif ($num_format_type=='n_datetime') {
- $file->write(''.self::convert_date_time($value).'');
+ $dateValue = self::convert_date_time($value);
+ if ($dateValue > 0 || preg_match("/(\d+):(\d{2}):(\d{2})/", $value)) {
+ $file->write(''.$dateValue.'');
+ } else { //not datetime, treat it as string
+ $file->write(''.self::xmlspecialchars($value).'');
+ }
} elseif ($num_format_type=='n_numeric') {
- $file->write(''.self::xmlspecialchars($value).'');//int,float,currency
+ if (!is_string($value) || $value=='0' || ($value[0]!='0' && ctype_digit($value)) || preg_match("/^\-?(0|[1-9][0-9]*)?(\.[0-9]+)?$/", $value)){
+ $file->write(''.self::xmlspecialchars($value).'');//int,float,currency
+ } else { //not numeric, treat it as string
+ $file->write(''.self::xmlspecialchars($value).'');
+ }
} elseif ($num_format_type=='n_string') {
$file->write(''.self::xmlspecialchars($value).'');
} elseif ($num_format_type=='n_auto' || 1) { //auto-detect unknown column types
@@ -778,9 +792,9 @@ private static function determineNumberFormatType($num_format)
if (preg_match("/[Y]{2,4}/i", $num_format)) return 'n_date';
if (preg_match("/[D]{1,2}/i", $num_format)) return 'n_date';
if (preg_match("/[M]{1,2}/i", $num_format)) return 'n_date';
- if (preg_match("/$/", $num_format)) return 'n_numeric';
- if (preg_match("/%/", $num_format)) return 'n_numeric';
- if (preg_match("/0/", $num_format)) return 'n_numeric';
+ if (preg_match('/\$/', $num_format)) return 'n_numeric';
+ if (preg_match('/%/', $num_format)) return 'n_numeric';
+ if (preg_match('/[0#?]/', $num_format)) return 'n_numeric';
return 'n_auto';
}
//------------------------------------------------------------------