Bläddra i källkod

writing data with number formatting

viest 7 år sedan
förälder
incheckning
8f2e949729
3 ändrade filer med 27 tillägg och 9 borttagningar
  1. 9 5
      kernel/excel.c
  2. 17 3
      kernel/write.c
  3. 1 1
      kernel/write.h

+ 9 - 5
kernel/excel.c

@@ -44,10 +44,11 @@ ZEND_BEGIN_ARG_INFO_EX(excel_data_arginfo, 0, 0, 1)
                 ZEND_ARG_INFO(0, data)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_INFO_EX(excel_insert_text_arginfo, 0, 0, 3)
+ZEND_BEGIN_ARG_INFO_EX(excel_insert_text_arginfo, 0, 0, 4)
                 ZEND_ARG_INFO(0, row)
                 ZEND_ARG_INFO(0, column)
                 ZEND_ARG_INFO(0, data)
+                ZEND_ARG_INFO(0, format)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(excel_insert_image_arginfo, 0, 0, 3)
@@ -169,7 +170,7 @@ PHP_METHOD(vtiful_excel, header)
     res = zval_get_resource(attr_handle);
 
     ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(header), header_l_key, header_value) {
-         type_writer(header_value, 0, header_l_key, res);
+         type_writer(header_value, 0, header_l_key, res, NULL);
          zval_ptr_dtor(header_value);
     } ZEND_HASH_FOREACH_END();
 
@@ -198,7 +199,7 @@ PHP_METHOD(vtiful_excel, data)
     ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(data), data_r_key, data_r_value) {
         if(Z_TYPE_P(data_r_value) == IS_ARRAY) {
             ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(data_r_value), data_l_key, data_l_value) {
-                type_writer(data_l_value, data_r_key+1, data_l_key, res);
+                type_writer(data_l_value, data_r_key+1, data_l_key, res, NULL);
                 zval_ptr_dtor(data_l_value);
             } ZEND_HASH_FOREACH_END();
         }
@@ -251,12 +252,15 @@ PHP_METHOD(vtiful_excel, insertText)
     zval rv, res_handle;
     zval *attr_handle, *data;
     zend_long row, column;
+    zend_string *format = NULL;
     excel_resource_t *res;
 
-    ZEND_PARSE_PARAMETERS_START(3, 3)
+    ZEND_PARSE_PARAMETERS_START(3, 4)
             Z_PARAM_LONG(row)
             Z_PARAM_LONG(column)
             Z_PARAM_ZVAL(data)
+            Z_PARAM_OPTIONAL
+            Z_PARAM_STR(format)
     ZEND_PARSE_PARAMETERS_END();
 
     ZVAL_COPY(return_value, getThis());
@@ -264,7 +268,7 @@ PHP_METHOD(vtiful_excel, insertText)
     attr_handle = zend_read_property(vtiful_excel_ce, return_value, ZEND_STRL(V_EXCEL_HANDLE), 0, &rv TSRMLS_DC);
     res = zval_get_resource(attr_handle);
 
-    type_writer(data, row, column, res);
+    type_writer(data, row, column, res, format);
 
     ZVAL_RES(&res_handle, zend_register_resource(res, le_excel_writer));
     zend_update_property(vtiful_excel_ce, return_value, ZEND_STRL(V_EXCEL_HANDLE), &res_handle);

+ 17 - 3
kernel/write.c

@@ -19,17 +19,31 @@
 /*
  * According to the zval type written to the file
  */
-void type_writer(zval *value, zend_long row, zend_long columns, excel_resource_t *res)
+void type_writer(zval *value, zend_long row, zend_long columns, excel_resource_t *res, zend_string *format)
 {
+    lxw_format *value_format = NULL;
+
     switch (Z_TYPE_P(value)) {
         case IS_STRING:
             worksheet_write_string(res->worksheet, row, columns, ZSTR_VAL(zval_get_string(value)), NULL);
             break;
         case IS_LONG:
-            worksheet_write_number(res->worksheet, row, columns, zval_get_long(value), NULL);
+            if(format) {
+                value_format = workbook_add_format(res->workbook);
+                format_set_num_format(value_format, ZSTR_VAL(format));
+                worksheet_write_number(res->worksheet, row, columns, zval_get_long(value), value_format);
+            } else {
+                worksheet_write_number(res->worksheet, row, columns, zval_get_double(value), NULL);
+            }
             break;
         case IS_DOUBLE:
-            worksheet_write_number(res->worksheet, row, columns, zval_get_double(value), NULL);
+            if(format) {
+                value_format = workbook_add_format(res->workbook);
+                format_set_num_format(value_format, ZSTR_VAL(format));
+                worksheet_write_number(res->worksheet, row, columns, zval_get_double(value), value_format);
+            } else {
+                worksheet_write_number(res->worksheet, row, columns, zval_get_double(value), NULL);
+            }
             break;
     }
 }

+ 1 - 1
kernel/write.h

@@ -22,7 +22,7 @@ STATIC int  _compare_defined_names(lxw_defined_name *a, lxw_defined_name *b);
 STATIC void _populate_range(lxw_workbook *self, lxw_series_range *range);
 STATIC void _populate_range_dimensions(lxw_workbook *self, lxw_series_range *range);
 
-void type_writer(zval *value, zend_long row, zend_long columns, excel_resource_t *res);
+void type_writer(zval *value, zend_long row, zend_long columns, excel_resource_t *res, zend_string *format);
 void image_writer(zval *value, zend_long row, zend_long columns, excel_resource_t *res);
 void formula_writer(zval *value, zend_long row, zend_long columns, excel_resource_t *res);
 void auto_filter(zend_string *range, excel_resource_t *res);