Browse Source

Feat: custom skip hidden rows

viest 4 years ago
parent
commit
4bf4374be9

+ 1 - 0
include/excel.h

@@ -26,6 +26,7 @@
 
 #define V_XLS_CONST_READ_SKIP_NONE        "SKIP_NONE"
 #define V_XLS_CONST_READ_SKIP_EMPTY_ROW   "SKIP_EMPTY_ROW"
+#define V_XLS_CONST_READ_SKIP_HIDDEN_ROW  "SKIP_HIDDEN_ROW"
 #define V_XLS_CONST_READ_SKIP_EMPTY_CELLS "SKIP_EMPTY_CELLS"
 #define V_XLS_CONST_READ_SKIP_EMPTY_VALUE "SKIP_EMPTY_VALUE"
 

+ 1 - 0
kernel/excel.c

@@ -1549,6 +1549,7 @@ VTIFUL_STARTUP_FUNCTION(excel) {
 #ifdef ENABLE_READER
     REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_SKIP_NONE,        XLSXIOREAD_SKIP_NONE);
     REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_SKIP_EMPTY_ROW,   XLSXIOREAD_SKIP_EMPTY_ROWS);
+    REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_SKIP_HIDDEN_ROW,  XLSXIOREAD_SKIP_HIDDEN_ROWS);
     REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_SKIP_EMPTY_CELLS, XLSXIOREAD_SKIP_EMPTY_CELLS);
     REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_SKIP_EMPTY_VALUE, SKIP_EMPTY_VALUE);
 #endif

+ 2 - 0
library/libxlsxio/include/xlsxio_read.h

@@ -158,6 +158,8 @@ DLL_EXPORT_XLSXIO void xlsxioread_list_sheets (xlsxioreader handle, xlsxioread_l
 #define XLSXIOREAD_SKIP_ALL_EMPTY       (XLSXIOREAD_SKIP_EMPTY_ROWS | XLSXIOREAD_SKIP_EMPTY_CELLS)
 /*! \brief skip extra cells to the right of the rightmost header cell \hideinitializer */
 #define XLSXIOREAD_SKIP_EXTRA_CELLS     0x04
+/*! \brief skip hidden rows \hideinitializer */
+#define XLSXIOREAD_SKIP_HIDDEN_ROWS     0x08
 /*! @} */
 
 /*! \brief type of pointer to callback function for processing a worksheet cell value

+ 5 - 4
library/libxlsxio/lib/xlsxio_read.c

@@ -1022,10 +1022,11 @@ void data_sheet_expat_callback_find_row_start (void* callbackdata, const XML_Cha
   struct data_sheet_callback_data* data = (struct data_sheet_callback_data*)callbackdata;
   if (XML_Char_icmp_ins(name, X("row")) == 0) {
     const XML_Char* hidden = get_expat_attr_by_name(atts, X("hidden"));
-    if (!hidden || XML_Char_tol(hidden) == 0) {//nesting level for current tag to skip
-//start handler to set after skipping
-//end handler to set after skipping
-//data handler to set after skipping
+    if (!hidden || XML_Char_tol(hidden) == 0 || !(data->flags & XLSXIOREAD_SKIP_HIDDEN_ROWS)) {
+      //nesting level for current tag to skip
+      //start handler to set after skipping
+      //end handler to set after skipping
+      //data handler to set after skipping
 
       data->rownr++;
       data->colnr = 0;

+ 63 - 0
tests/open_xlsx_get_data_skip_hidden_rows.phpt

@@ -0,0 +1,63 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php
+require __DIR__ . '/include/skipif.inc';
+skip_disable_reader();
+?>
+--FILE--
+<?php
+$config = ['path' => './tests/xlsx'];
+$excel  = new \Vtiful\Kernel\Excel($config);
+
+$data = $excel->openFile('hidden_row.xlsx')
+    ->openSheet('Sheet1')
+    ->getSheetData();
+
+var_dump($data);
+
+$data = $excel->openFile('hidden_row.xlsx')
+    ->openSheet('Sheet1', \Vtiful\Kernel\Excel::SKIP_HIDDEN_ROW|\Vtiful\Kernel\Excel::SKIP_EMPTY_ROW)
+    ->getSheetData();
+
+var_dump($data);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+array(4) {
+  [0]=>
+  array(1) {
+    [0]=>
+    string(4) "name"
+  }
+  [1]=>
+  array(1) {
+    [0]=>
+    string(8) "ZhangSan"
+  }
+  [2]=>
+  array(1) {
+    [0]=>
+    string(4) "LiSi"
+  }
+  [3]=>
+  array(1) {
+    [0]=>
+    string(6) "WangWu"
+  }
+}
+array(2) {
+  [0]=>
+  array(1) {
+    [0]=>
+    string(4) "name"
+  }
+  [1]=>
+  array(1) {
+    [0]=>
+    string(6) "WangWu"
+  }
+}

BIN
tests/xlsx/hidden_row.xlsx