Parcourir la source

Feat: insertDate and read data type

viest il y a 5 ans
Parent
commit
c90da7523b
4 fichiers modifiés avec 123 ajouts et 14 suppressions
  1. 11 0
      include/excel.h
  2. 1 2
      include/read.h
  3. 67 2
      kernel/excel.c
  4. 44 10
      kernel/read.c

+ 11 - 0
include/excel.h

@@ -18,6 +18,17 @@
 #define V_XLS_COF    "config"
 #define V_XLS_PAT    "path"
 
+#define V_XLS_CONST_READ_TYPE_INT      "TYPE_INT"
+#define V_XLS_CONST_READ_TYPE_DOUBLE   "TYPE_DOUBLE"
+#define V_XLS_CONST_READ_TYPE_STRING   "TYPE_STRING"
+#define V_XLS_CONST_READ_TYPE_DATETIME "TYPE_TIMESTAMP"
+
+#define READ_TYPE_EMPTY    0x00
+#define READ_TYPE_STRING   0x01
+#define READ_TYPE_INT      0x02
+#define READ_TYPE_DOUBLE   0x04
+#define READ_TYPE_DATETIME 0x08
+
 #define GET_CONFIG_PATH(dir_path_res, class_name, object)                                          \
     do {                                                                                           \
         zval rv;                                                                                   \

+ 1 - 2
include/read.h

@@ -17,10 +17,9 @@
 #define READ_ROW 0x01
 
 int sheet_read_row(xlsxioreadersheet sheet);
-char* sheet_read_column(xlsxioreadersheet sheet);
 xlsxioreader file_open(const char *directory, const char *file_name);
 void load_sheet_all_data(xlsxioreadersheet sheet_t, zval *zv_result_t);
 xlsxioreadersheet sheet_open(xlsxioreader file, const zend_string *zs_sheet_name_t);
-unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, unsigned int flag);
+unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, zval *zv_type, unsigned int flag);
 
 #endif //PHP_READ_INCLUDE_H

+ 67 - 2
kernel/excel.c

@@ -99,6 +99,14 @@ ZEND_BEGIN_ARG_INFO_EX(xls_insert_text_arginfo, 0, 0, 5)
                 ZEND_ARG_INFO(0, format_handle)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(xls_insert_date_arginfo, 0, 0, 5)
+                ZEND_ARG_INFO(0, row)
+                ZEND_ARG_INFO(0, column)
+                ZEND_ARG_INFO(0, timestamp)
+                ZEND_ARG_INFO(0, format)
+                ZEND_ARG_INFO(0, format_handle)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(xls_insert_url_arginfo, 0, 0, 4)
                 ZEND_ARG_INFO(0, row)
                 ZEND_ARG_INFO(0, column)
@@ -427,7 +435,51 @@ PHP_METHOD(vtiful_xls, insertText)
     } else {
         type_writer(data, row, column, &obj->write_ptr, format, NULL);
     }
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\xls::insertDate(int $row, int $column, int $timestamp[, string $format, resource $formatHandle])
+ */
+PHP_METHOD(vtiful_xls, insertDate)
+{
+    zval *data = NULL, *format_handle = NULL;
+    zend_long row, column;
+    zend_string *format = NULL;
+
+    ZEND_PARSE_PARAMETERS_START(3, 5)
+            Z_PARAM_LONG(row)
+            Z_PARAM_LONG(column)
+            Z_PARAM_ZVAL(data)
+            Z_PARAM_OPTIONAL
+            Z_PARAM_STR(format)
+            Z_PARAM_RESOURCE(format_handle)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    xls_object *obj = Z_XLS_P(getThis());
+
+    SHEET_LINE_SET(obj, row);
+
+    if (Z_TYPE_P(data) != IS_LONG) {
+        // throw
+    }
+
+    // Default datetime format
+    if (format == NULL) {
+        format = zend_string_init(ZEND_STRL("yyyy-mm-dd hh:mm:ss"), 0);
+    }
+
+    zval _zv_double_time;
+    ZVAL_DOUBLE(&_zv_double_time, ((double)data->value.lval / 86400 + 25569))
+
+    if (format_handle) {
+        type_writer(&_zv_double_time, row, column, &obj->write_ptr, format, zval_get_format(format_handle));
+    } else {
+        type_writer(&_zv_double_time, row, column, &obj->write_ptr, format, NULL);
+    }
 
+    zval_ptr_dtor(&_zv_double_time);
 }
 /* }}} */
 
@@ -693,13 +745,20 @@ PHP_METHOD(vtiful_xls, getSheetData)
  */
 PHP_METHOD(vtiful_xls, nextRow)
 {
-    xls_object *obj  = Z_XLS_P(getThis());
+    zval *zv_type = NULL;
+
+    ZEND_PARSE_PARAMETERS_START(0, 1)
+            Z_PARAM_OPTIONAL
+            Z_PARAM_ARRAY(zv_type)
+    ZEND_PARSE_PARAMETERS_END();
+
+    xls_object *obj = Z_XLS_P(getThis());
 
     if (!obj->read_ptr.sheet_t) {
         RETURN_FALSE;
     }
 
-    load_sheet_current_row_data(obj->read_ptr.sheet_t, return_value, READ_ROW);
+    load_sheet_current_row_data(obj->read_ptr.sheet_t, return_value, zv_type, READ_ROW);
 }
 /* }}} */
 
@@ -719,6 +778,7 @@ zend_function_entry xls_methods[] = {
         PHP_ME(vtiful_xls, getHandle,     NULL,                       ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, autoFilter,    xls_auto_filter_arginfo,    ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, insertText,    xls_insert_text_arginfo,    ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_xls, insertDate,    xls_insert_date_arginfo,    ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, insertChart,   xls_insert_chart_arginfo,   ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, insertUrl,     xls_insert_url_arginfo,     ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, insertImage,   xls_insert_image_arginfo,   ZEND_ACC_PUBLIC)
@@ -754,6 +814,11 @@ VTIFUL_STARTUP_FUNCTION(excel) {
     REGISTER_CLASS_PROPERTY_NULL(vtiful_xls_ce, V_XLS_COF, ZEND_ACC_PRIVATE);
     REGISTER_CLASS_PROPERTY_NULL(vtiful_xls_ce, V_XLS_FIL, ZEND_ACC_PRIVATE);
 
+    REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_TYPE_INT,      READ_TYPE_INT);
+    REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_TYPE_DOUBLE,   READ_TYPE_DOUBLE);
+    REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_TYPE_STRING,   READ_TYPE_STRING);
+    REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_TYPE_DATETIME, READ_TYPE_DATETIME);
+
     return SUCCESS;
 }
 /* }}} */

+ 44 - 10
kernel/read.c

@@ -49,16 +49,11 @@ int sheet_read_row(xlsxioreadersheet sheet)
 /* }}} */
 
 /* {{{ */
-char* sheet_read_column(xlsxioreadersheet sheet)
-{
-    return xlsxioread_sheet_next_cell(sheet);
-}
-/* }}} */
-
-/* {{{ */
-unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, unsigned int flag)
+unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, zval *zv_type_arr_t, unsigned int flag)
 {
+    zend_long _type = READ_TYPE_EMPTY;
     char *_string_value = NULL;
+    Bucket *_start = NULL, *_end = NULL;
 
     if (flag && !sheet_read_row(sheet_t)) {
         return XLSWRITER_FALSE;
@@ -68,8 +63,47 @@ unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_res
         array_init(zv_result_t);
     }
 
-    while ((_string_value = sheet_read_column(sheet_t)) != NULL)
+    if (zv_type_arr_t != NULL && Z_TYPE_P(zv_type_arr_t) == IS_ARRAY) {
+        _start = zv_type_arr_t->value.arr->arData;
+        _end   = _start + zv_type_arr_t->value.arr->nNumUsed;
+    }
+
+    while ((_string_value = xlsxioread_sheet_next_cell(sheet_t)) != NULL)
     {
+        if (_start != _end) {
+            zval *_zv_type = &_start->val;
+
+            if (Z_TYPE_P(_zv_type) == IS_LONG) {
+                _type = Z_LVAL_P(_zv_type);
+            }
+
+            _start++;
+        }
+
+        if (_type & READ_TYPE_DATETIME) {
+            double value = strtod(_string_value, NULL);
+
+            if (value != 0) {
+                value = (value - 25569) * 86400;
+            }
+
+            add_next_index_double(zv_result_t, value);
+            continue;
+        }
+
+        if (_type & READ_TYPE_DOUBLE) {
+            add_next_index_double(zv_result_t, strtod(_string_value, NULL));
+            continue;
+        }
+
+        if (_type & READ_TYPE_INT) {
+            zend_long _long_value;
+
+            sscanf(_string_value, "%" PRIi64, &_long_value);
+            add_next_index_long(zv_result_t, _long_value);
+            continue;
+        }
+
         add_next_index_stringl(zv_result_t, _string_value, strlen(_string_value));
     }
 
@@ -89,7 +123,7 @@ void load_sheet_all_data(xlsxioreadersheet sheet_t, zval *zv_result_t)
         zval _zv_tmp_row;
         ZVAL_NULL(&_zv_tmp_row);
 
-        load_sheet_current_row_data(sheet_t, &_zv_tmp_row, READ_SKIP_ROW);
+        load_sheet_current_row_data(sheet_t, &_zv_tmp_row, NULL, READ_SKIP_ROW);
         add_next_index_zval(zv_result_t, &_zv_tmp_row);
     }
 }