Browse Source

Feat: skip empty rows

viest 4 years ago
parent
commit
148e978cae
7 changed files with 49 additions and 13 deletions
  1. 1 1
      README.md
  2. 1 1
      README_zh.md
  3. 2 1
      include/read.h
  4. 1 0
      include/xlswriter.h
  5. 9 8
      kernel/excel.c
  6. 34 1
      kernel/read.c
  7. 1 1
      tests/fix-207.phpt

+ 1 - 1
README.md

@@ -3,7 +3,7 @@
 </div>
 
 <div align=center>
-<a href="https://travis-ci.org/viest/php-ext-xlswriter"><img src="https://travis-ci.org/viest/php-ext-xlswriter.svg?branch=master"/></a>
+<a href="https://travis-ci.com/viest/php-ext-xlswriter"><img src="https://travis-ci.com/viest/php-ext-xlswriter.svg?branch=master"/></a>
 <a href="https://ci.appveyor.com/project/viest/php-ext-excel-export/branch/master"><img src="https://ci.appveyor.com/api/projects/status/w4cfjo9e4gsrs6rn/branch/master?svg=true"/></a>
 <a href="https://github.com/viest/php-ext-xlswriter/releases"><img src="https://img.shields.io/github/release/viest/php-ext-excel-export.svg"/></a>
 </div>

+ 1 - 1
README_zh.md

@@ -3,7 +3,7 @@
 </div>
 
 <div align=center>
-<a href="https://travis-ci.org/viest/php-ext-xlswriter"><img src="https://travis-ci.org/viest/php-ext-xlswriter.svg?branch=master"/></a>
+<a href="https://travis-ci.com/viest/php-ext-xlswriter"><img src="https://travis-ci.com/viest/php-ext-xlswriter.svg?branch=master"/></a>
 <a href="https://ci.appveyor.com/project/viest/php-ext-excel-export/branch/master"><img src="https://ci.appveyor.com/api/projects/status/w4cfjo9e4gsrs6rn/branch/master?svg=true"/></a>
 <a href="https://github.com/viest/php-ext-xlswriter/releases"><img src="https://img.shields.io/github/release/viest/php-ext-excel-export.svg"/></a>
 </div>

+ 2 - 1
include/read.h

@@ -23,7 +23,8 @@ int sheet_read_row(xlsxioreadersheet sheet_t);
 void sheet_list(xlsxioreader file_t, zval *zv_result_t);
 xlsxioreader file_open(const char *directory, const char *file_name);
 void skip_rows(xlsxioreadersheet sheet_t, zval *zv_type_t, zend_long data_type_default, zend_long zl_skip_row);
-void load_sheet_all_data(xlsxioreadersheet sheet_t, zval *zv_type_t, zend_long data_type_default, zval *zv_result_t);
+void load_sheet_all_data(xlsxioreadersheet sheet_t, zend_long sheet_flag, zval *zv_type_t, zend_long data_type_default, zval *zv_result_t);
+void load_sheet_row_data (xlsxioreadersheet sheet_t, zend_long sheet_flag, zval *zv_type_t, zend_long data_type_default, zval *zv_result_t);
 xlsxioreadersheet sheet_open(xlsxioreader file_t, const zend_string *zs_sheet_name_t, const zend_long zl_flag);
 unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, zval *zv_type, zend_long data_type_default, unsigned int flag);
 unsigned int load_sheet_current_row_data_callback(zend_string *zs_sheet_name_t, xlsxioreader file_t, void *callback_data);

+ 1 - 0
include/xlswriter.h

@@ -45,6 +45,7 @@ typedef struct {
     xlsxioreader      file_t;
     xlsxioreadersheet sheet_t;
     zend_long         data_type_default;
+    zend_long         sheet_flag;
 } xls_resource_read_t;
 
 typedef struct {

+ 9 - 8
kernel/excel.c

@@ -1121,16 +1121,16 @@ PHP_METHOD(vtiful_xls, openFile)
 
     xls_object* obj = Z_XLS_P(getThis());
 
-    if (obj->read_ptr.file_t != NULL) {
-        xlsxioread_close(obj->read_ptr.file_t);
-        obj->read_ptr.file_t = NULL;
-    }
-
     if (obj->read_ptr.sheet_t != NULL) {
         xlsxioread_sheet_close(obj->read_ptr.sheet_t);
         obj->read_ptr.sheet_t = NULL;
     }
 
+    if (obj->read_ptr.file_t != NULL) {
+        xlsxioread_close(obj->read_ptr.file_t);
+        obj->read_ptr.file_t = NULL;
+    }
+
     obj->read_ptr.file_t = file_open(Z_STRVAL_P(zv_config_path), ZSTR_VAL(zs_file_name));
 }
 /* }}} */
@@ -1160,6 +1160,7 @@ PHP_METHOD(vtiful_xls, openSheet)
         xlsxioread_sheet_close(obj->read_ptr.sheet_t);
     }
 
+    obj->read_ptr.sheet_flag = zl_flag;
     obj->read_ptr.sheet_t = sheet_open(obj->read_ptr.file_t, zs_sheet_name, zl_flag);
 }
 /* }}} */
@@ -1329,12 +1330,12 @@ PHP_METHOD(vtiful_xls, getSheetData)
     zval *zv_type = zend_read_property(vtiful_xls_ce, PROP_OBJ(getThis()), ZEND_STRL(V_XLS_TYPE), 0, NULL);
 
     if (zv_type != NULL && Z_TYPE_P(zv_type) == IS_ARRAY) {
-        load_sheet_all_data(obj->read_ptr.sheet_t, zv_type, obj->read_ptr.data_type_default, return_value);
+        load_sheet_all_data(obj->read_ptr.sheet_t, obj->read_ptr.sheet_flag, zv_type, obj->read_ptr.data_type_default, return_value);
 
         return;
     }
 
-    load_sheet_all_data(obj->read_ptr.sheet_t, NULL, obj->read_ptr.data_type_default, return_value);
+    load_sheet_all_data(obj->read_ptr.sheet_t, obj->read_ptr.sheet_flag, NULL, obj->read_ptr.data_type_default, return_value);
 }
 /* }}} */
 
@@ -1359,7 +1360,7 @@ PHP_METHOD(vtiful_xls, nextRow)
         zv_type_t = zend_read_property(vtiful_xls_ce, PROP_OBJ(getThis()), ZEND_STRL(V_XLS_TYPE), 0, NULL);
     }
 
-    load_sheet_current_row_data(obj->read_ptr.sheet_t, return_value, zv_type_t, obj->read_ptr.data_type_default, READ_ROW);
+    load_sheet_row_data(obj->read_ptr.sheet_t, obj->read_ptr.sheet_flag, zv_type_t, obj->read_ptr.data_type_default, return_value);
 }
 /* }}} */
 

+ 34 - 1
kernel/read.c

@@ -390,7 +390,32 @@ unsigned int load_sheet_current_row_data_callback (zend_string *zs_sheet_name_t,
 /* }}} */
 
 /* {{{ */
-void load_sheet_all_data (xlsxioreadersheet sheet_t, zval *zv_type_t, zend_long data_type_default, zval *zv_result_t)
+void load_sheet_row_data (xlsxioreadersheet sheet_t, zend_long sheet_flag, zval *zv_type_t, zend_long data_type_default, zval *zv_result_t)
+{
+    size_t row_index = 0;
+
+    do {
+        load_sheet_current_row_data(sheet_t, zv_result_t, zv_type_t, data_type_default, READ_ROW);
+
+        if (row_index == xlsxioread_sheet_last_row_index(sheet_t)) {
+            return;
+        }
+
+        row_index = xlsxioread_sheet_last_row_index(sheet_t);
+
+        if (sheet_flag & XLSXIOREAD_SKIP_EMPTY_ROWS
+            && Z_TYPE_P(zv_result_t) == IS_ARRAY
+            && zend_hash_num_elements(Z_ARR_P(zv_result_t)) == 0) {
+            continue;
+        }
+
+        return;
+    } while (1);
+}
+/* }}} */
+
+/* {{{ */
+void load_sheet_all_data (xlsxioreadersheet sheet_t, zend_long sheet_flag, zval *zv_type_t, zend_long data_type_default, zval *zv_result_t)
 {
     if (Z_TYPE_P(zv_result_t) != IS_ARRAY) {
         array_init(zv_result_t);
@@ -402,6 +427,14 @@ void load_sheet_all_data (xlsxioreadersheet sheet_t, zval *zv_type_t, zend_long
         ZVAL_NULL(&_zv_tmp_row);
 
         load_sheet_current_row_data(sheet_t, &_zv_tmp_row, zv_type_t, data_type_default, READ_SKIP_ROW);
+
+        if (sheet_flag & XLSXIOREAD_SKIP_EMPTY_ROWS
+            && Z_TYPE(_zv_tmp_row) == IS_ARRAY
+            && zend_hash_num_elements(Z_ARR(_zv_tmp_row)) == 0) {
+            zval_ptr_dtor(&_zv_tmp_row);
+            continue;
+        }
+
         add_next_index_zval(zv_result_t, &_zv_tmp_row);
     }
 }

+ 1 - 1
tests/fix-207.phpt

@@ -72,4 +72,4 @@ array(2) {
     [1]=>
     int(24)
   }
-}
+}