Browse Source

Merge pull request #188 from viest/dev

Feat: data method is written by default from the file header
viest 5 years ago
parent
commit
8471a841c8

+ 1 - 0
include/read.h

@@ -18,6 +18,7 @@
 
 int sheet_read_row(xlsxioreadersheet sheet_t);
 int is_number(const char *value);
+void data_to_null(zval *zv_result_t);
 void data_to_custom_type(const char *string_value, zend_ulong type, zval *zv_result_t);
 xlsxioreader file_open(const char *directory, const char *file_name);
 void load_sheet_all_data(xlsxioreadersheet sheet_t, zval *zv_type_t, zval *zv_result_t);

+ 2 - 2
kernel/excel.c

@@ -376,6 +376,8 @@ PHP_METHOD(vtiful_xls, header)
          type_writer(header_value, 0, header_l_key, &obj->write_ptr, NULL, NULL);
          zval_ptr_dtor(header_value);
     ZEND_HASH_FOREACH_END();
+
+    SHEET_LINE_ADD(obj)
 }
 /* }}} */
 
@@ -397,8 +399,6 @@ PHP_METHOD(vtiful_xls, data)
 
     ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(data), data_r_value)
         if(Z_TYPE_P(data_r_value) == IS_ARRAY) {
-            SHEET_LINE_ADD(obj)
-
             ZEND_HASH_FOREACH_BUCKET(Z_ARRVAL_P(data_r_value), Bucket *bucket)
                 type_writer(&bucket->val, SHEET_CURRENT_LINE(obj), bucket->h, &obj->write_ptr, NULL, NULL);
                 zval_ptr_dtor(&bucket->val);

+ 29 - 0
kernel/read.c

@@ -52,6 +52,17 @@ int is_number(const char *value)
 }
 /* }}} */
 
+/* {{{ */
+void data_to_null(zval *zv_result_t)
+{
+    if (Z_TYPE_P(zv_result_t) == IS_ARRAY) {
+        add_next_index_null(zv_result_t);
+    } else {
+        ZVAL_NULL(zv_result_t);
+    }
+}
+/* }}} */
+
 /* {{{ */
 void data_to_custom_type(const char *string_value, zend_ulong type, zval *zv_result_t)
 {
@@ -60,6 +71,12 @@ void data_to_custom_type(const char *string_value, zend_ulong type, zval *zv_res
             goto STRING;
         }
 
+        if (strlen(string_value) == 0) {
+            data_to_null(zv_result_t);
+
+            return;
+        }
+
         double value = strtod(string_value, NULL);
 
         if (value != 0) {
@@ -80,6 +97,12 @@ void data_to_custom_type(const char *string_value, zend_ulong type, zval *zv_res
             goto STRING;
         }
 
+        if (strlen(string_value) == 0) {
+            data_to_null(zv_result_t);
+
+            return;
+        }
+
         if (Z_TYPE_P(zv_result_t) == IS_ARRAY) {
             add_next_index_double(zv_result_t, strtod(string_value, NULL));
         } else {
@@ -94,6 +117,12 @@ void data_to_custom_type(const char *string_value, zend_ulong type, zval *zv_res
             goto STRING;
         }
 
+        if (strlen(string_value) == 0) {
+            data_to_null(zv_result_t);
+
+            return;
+        }
+
         zend_long _long_value;
 
         sscanf(string_value, ZEND_LONG_FMT, &_long_value);

+ 1 - 8
tests/open_xlsx_get_data_skip_empty.phpt

@@ -40,20 +40,13 @@ var_dump($data);
 @unlink(__DIR__ . '/tutorial.xlsx');
 ?>
 --EXPECT--
-array(3) {
+array(2) {
   [0]=>
   array(1) {
     [0]=>
     string(4) "Cost"
   }
   [1]=>
-  array(2) {
-    [0]=>
-    string(0) ""
-    [1]=>
-    string(0) ""
-  }
-  [2]=>
   array(1) {
     [0]=>
     string(5) "viest"

+ 0 - 6
tests/open_xlsx_next_row_skip_empty.phpt

@@ -54,12 +54,6 @@ array(1) {
   [0]=>
   string(4) "Cost"
 }
-array(2) {
-  [0]=>
-  string(0) ""
-  [1]=>
-  string(0) ""
-}
 array(1) {
   [0]=>
   string(5) "viest"

+ 2 - 2
tests/open_xlsx_next_row_with_data_type_date_array_index.phpt

@@ -38,13 +38,13 @@ array(2) {
 }
 array(2) {
   [0]=>
-  string(0) ""
+  string(5) "viest"
   [1]=>
   string(0) ""
 }
 array(5) {
   [0]=>
-  string(5) "viest"
+  string(0) ""
   [1]=>
   string(0) ""
   [2]=>

+ 7 - 3
tests/open_xlsx_next_row_with_set_type.phpt

@@ -35,13 +35,17 @@ var_dump($fileObject->nextRow());
 @unlink(__DIR__ . '/tutorial.xlsx');
 ?>
 --EXPECT--
-array(0) {
-}
-array(3) {
+array(2) {
   [0]=>
   int(1)
   [1]=>
   string(4) "Test"
+}
+array(3) {
+  [0]=>
+  NULL
+  [1]=>
+  string(0) ""
   [2]=>
   int(1568389354)
 }