Skip to content

Commit c90da75

Browse files
committed
Feat: insertDate and read data type
1 parent 8b47d5a commit c90da75

File tree

4 files changed

+123
-14
lines changed

4 files changed

+123
-14
lines changed

include/excel.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@
1818
#define V_XLS_COF "config"
1919
#define V_XLS_PAT "path"
2020

21+
#define V_XLS_CONST_READ_TYPE_INT "TYPE_INT"
22+
#define V_XLS_CONST_READ_TYPE_DOUBLE "TYPE_DOUBLE"
23+
#define V_XLS_CONST_READ_TYPE_STRING "TYPE_STRING"
24+
#define V_XLS_CONST_READ_TYPE_DATETIME "TYPE_TIMESTAMP"
25+
26+
#define READ_TYPE_EMPTY 0x00
27+
#define READ_TYPE_STRING 0x01
28+
#define READ_TYPE_INT 0x02
29+
#define READ_TYPE_DOUBLE 0x04
30+
#define READ_TYPE_DATETIME 0x08
31+
2132
#define GET_CONFIG_PATH(dir_path_res, class_name, object) \
2233
do { \
2334
zval rv; \

include/read.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@
1717
#define READ_ROW 0x01
1818

1919
int sheet_read_row(xlsxioreadersheet sheet);
20-
char* sheet_read_column(xlsxioreadersheet sheet);
2120
xlsxioreader file_open(const char *directory, const char *file_name);
2221
void load_sheet_all_data(xlsxioreadersheet sheet_t, zval *zv_result_t);
2322
xlsxioreadersheet sheet_open(xlsxioreader file, const zend_string *zs_sheet_name_t);
24-
unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, unsigned int flag);
23+
unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, zval *zv_type, unsigned int flag);
2524

2625
#endif //PHP_READ_INCLUDE_H

kernel/excel.c

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ ZEND_BEGIN_ARG_INFO_EX(xls_insert_text_arginfo, 0, 0, 5)
9999
ZEND_ARG_INFO(0, format_handle)
100100
ZEND_END_ARG_INFO()
101101

102+
ZEND_BEGIN_ARG_INFO_EX(xls_insert_date_arginfo, 0, 0, 5)
103+
ZEND_ARG_INFO(0, row)
104+
ZEND_ARG_INFO(0, column)
105+
ZEND_ARG_INFO(0, timestamp)
106+
ZEND_ARG_INFO(0, format)
107+
ZEND_ARG_INFO(0, format_handle)
108+
ZEND_END_ARG_INFO()
109+
102110
ZEND_BEGIN_ARG_INFO_EX(xls_insert_url_arginfo, 0, 0, 4)
103111
ZEND_ARG_INFO(0, row)
104112
ZEND_ARG_INFO(0, column)
@@ -427,7 +435,51 @@ PHP_METHOD(vtiful_xls, insertText)
427435
} else {
428436
type_writer(data, row, column, &obj->write_ptr, format, NULL);
429437
}
438+
}
439+
/* }}} */
440+
441+
/** {{{ \Vtiful\Kernel\xls::insertDate(int $row, int $column, int $timestamp[, string $format, resource $formatHandle])
442+
*/
443+
PHP_METHOD(vtiful_xls, insertDate)
444+
{
445+
zval *data = NULL, *format_handle = NULL;
446+
zend_long row, column;
447+
zend_string *format = NULL;
448+
449+
ZEND_PARSE_PARAMETERS_START(3, 5)
450+
Z_PARAM_LONG(row)
451+
Z_PARAM_LONG(column)
452+
Z_PARAM_ZVAL(data)
453+
Z_PARAM_OPTIONAL
454+
Z_PARAM_STR(format)
455+
Z_PARAM_RESOURCE(format_handle)
456+
ZEND_PARSE_PARAMETERS_END();
457+
458+
ZVAL_COPY(return_value, getThis());
459+
460+
xls_object *obj = Z_XLS_P(getThis());
461+
462+
SHEET_LINE_SET(obj, row);
463+
464+
if (Z_TYPE_P(data) != IS_LONG) {
465+
// throw
466+
}
467+
468+
// Default datetime format
469+
if (format == NULL) {
470+
format = zend_string_init(ZEND_STRL("yyyy-mm-dd hh:mm:ss"), 0);
471+
}
472+
473+
zval _zv_double_time;
474+
ZVAL_DOUBLE(&_zv_double_time, ((double)data->value.lval / 86400 + 25569))
475+
476+
if (format_handle) {
477+
type_writer(&_zv_double_time, row, column, &obj->write_ptr, format, zval_get_format(format_handle));
478+
} else {
479+
type_writer(&_zv_double_time, row, column, &obj->write_ptr, format, NULL);
480+
}
430481

482+
zval_ptr_dtor(&_zv_double_time);
431483
}
432484
/* }}} */
433485

@@ -693,13 +745,20 @@ PHP_METHOD(vtiful_xls, getSheetData)
693745
*/
694746
PHP_METHOD(vtiful_xls, nextRow)
695747
{
696-
xls_object *obj = Z_XLS_P(getThis());
748+
zval *zv_type = NULL;
749+
750+
ZEND_PARSE_PARAMETERS_START(0, 1)
751+
Z_PARAM_OPTIONAL
752+
Z_PARAM_ARRAY(zv_type)
753+
ZEND_PARSE_PARAMETERS_END();
754+
755+
xls_object *obj = Z_XLS_P(getThis());
697756

698757
if (!obj->read_ptr.sheet_t) {
699758
RETURN_FALSE;
700759
}
701760

702-
load_sheet_current_row_data(obj->read_ptr.sheet_t, return_value, READ_ROW);
761+
load_sheet_current_row_data(obj->read_ptr.sheet_t, return_value, zv_type, READ_ROW);
703762
}
704763
/* }}} */
705764

@@ -719,6 +778,7 @@ zend_function_entry xls_methods[] = {
719778
PHP_ME(vtiful_xls, getHandle, NULL, ZEND_ACC_PUBLIC)
720779
PHP_ME(vtiful_xls, autoFilter, xls_auto_filter_arginfo, ZEND_ACC_PUBLIC)
721780
PHP_ME(vtiful_xls, insertText, xls_insert_text_arginfo, ZEND_ACC_PUBLIC)
781+
PHP_ME(vtiful_xls, insertDate, xls_insert_date_arginfo, ZEND_ACC_PUBLIC)
722782
PHP_ME(vtiful_xls, insertChart, xls_insert_chart_arginfo, ZEND_ACC_PUBLIC)
723783
PHP_ME(vtiful_xls, insertUrl, xls_insert_url_arginfo, ZEND_ACC_PUBLIC)
724784
PHP_ME(vtiful_xls, insertImage, xls_insert_image_arginfo, ZEND_ACC_PUBLIC)
@@ -754,6 +814,11 @@ VTIFUL_STARTUP_FUNCTION(excel) {
754814
REGISTER_CLASS_PROPERTY_NULL(vtiful_xls_ce, V_XLS_COF, ZEND_ACC_PRIVATE);
755815
REGISTER_CLASS_PROPERTY_NULL(vtiful_xls_ce, V_XLS_FIL, ZEND_ACC_PRIVATE);
756816

817+
REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_TYPE_INT, READ_TYPE_INT);
818+
REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_TYPE_DOUBLE, READ_TYPE_DOUBLE);
819+
REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_TYPE_STRING, READ_TYPE_STRING);
820+
REGISTER_CLASS_CONST_LONG(vtiful_xls_ce, V_XLS_CONST_READ_TYPE_DATETIME, READ_TYPE_DATETIME);
821+
757822
return SUCCESS;
758823
}
759824
/* }}} */

kernel/read.c

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,11 @@ int sheet_read_row(xlsxioreadersheet sheet)
4949
/* }}} */
5050

5151
/* {{{ */
52-
char* sheet_read_column(xlsxioreadersheet sheet)
53-
{
54-
return xlsxioread_sheet_next_cell(sheet);
55-
}
56-
/* }}} */
57-
58-
/* {{{ */
59-
unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, unsigned int flag)
52+
unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_result_t, zval *zv_type_arr_t, unsigned int flag)
6053
{
54+
zend_long _type = READ_TYPE_EMPTY;
6155
char *_string_value = NULL;
56+
Bucket *_start = NULL, *_end = NULL;
6257

6358
if (flag && !sheet_read_row(sheet_t)) {
6459
return XLSWRITER_FALSE;
@@ -68,8 +63,47 @@ unsigned int load_sheet_current_row_data(xlsxioreadersheet sheet_t, zval *zv_res
6863
array_init(zv_result_t);
6964
}
7065

71-
while ((_string_value = sheet_read_column(sheet_t)) != NULL)
66+
if (zv_type_arr_t != NULL && Z_TYPE_P(zv_type_arr_t) == IS_ARRAY) {
67+
_start = zv_type_arr_t->value.arr->arData;
68+
_end = _start + zv_type_arr_t->value.arr->nNumUsed;
69+
}
70+
71+
while ((_string_value = xlsxioread_sheet_next_cell(sheet_t)) != NULL)
7272
{
73+
if (_start != _end) {
74+
zval *_zv_type = &_start->val;
75+
76+
if (Z_TYPE_P(_zv_type) == IS_LONG) {
77+
_type = Z_LVAL_P(_zv_type);
78+
}
79+
80+
_start++;
81+
}
82+
83+
if (_type & READ_TYPE_DATETIME) {
84+
double value = strtod(_string_value, NULL);
85+
86+
if (value != 0) {
87+
value = (value - 25569) * 86400;
88+
}
89+
90+
add_next_index_double(zv_result_t, value);
91+
continue;
92+
}
93+
94+
if (_type & READ_TYPE_DOUBLE) {
95+
add_next_index_double(zv_result_t, strtod(_string_value, NULL));
96+
continue;
97+
}
98+
99+
if (_type & READ_TYPE_INT) {
100+
zend_long _long_value;
101+
102+
sscanf(_string_value, "%" PRIi64, &_long_value);
103+
add_next_index_long(zv_result_t, _long_value);
104+
continue;
105+
}
106+
73107
add_next_index_stringl(zv_result_t, _string_value, strlen(_string_value));
74108
}
75109

@@ -89,7 +123,7 @@ void load_sheet_all_data(xlsxioreadersheet sheet_t, zval *zv_result_t)
89123
zval _zv_tmp_row;
90124
ZVAL_NULL(&_zv_tmp_row);
91125

92-
load_sheet_current_row_data(sheet_t, &_zv_tmp_row, READ_SKIP_ROW);
126+
load_sheet_current_row_data(sheet_t, &_zv_tmp_row, NULL, READ_SKIP_ROW);
93127
add_next_index_zval(zv_result_t, &_zv_tmp_row);
94128
}
95129
}

0 commit comments

Comments
 (0)