浏览代码

Merge pull request #156 from viest/dev

Fix(file): multiple export
viest 5 年之前
父节点
当前提交
c59c44f671
共有 6 个文件被更改,包括 138 次插入45 次删除
  1. 5 4
      include/excel.h
  2. 68 15
      kernel/chart.c
  3. 1 4
      kernel/excel.c
  4. 10 10
      kernel/format.c
  5. 10 12
      kernel/write.c
  6. 44 0
      tests/multiple_file.phpt

+ 5 - 4
include/excel.h

@@ -18,10 +18,11 @@
 #define V_XLS_COF    "config"
 #define V_XLS_PAT    "path"
 
-#define GET_CONFIG_PATH(dir_path_res, class_name, object)                                             \
-    do {                                                                                              \
-        zval *_config  = zend_read_property(class_name, object, ZEND_STRL(V_XLS_COF), 0, NULL);     \
-        (dir_path_res) = zend_hash_str_find(Z_ARRVAL_P(_config), ZEND_STRL(V_XLS_PAT));             \
+#define GET_CONFIG_PATH(dir_path_res, class_name, object)                                          \
+    do {                                                                                           \
+        zval rv;                                                                                   \
+        zval *_config  = zend_read_property(class_name, object, ZEND_STRL(V_XLS_COF), 0, &rv);     \
+        (dir_path_res) = zend_hash_str_find(Z_ARRVAL_P(_config), ZEND_STRL(V_XLS_PAT));            \
     } while(0)
 
 extern zend_class_entry *vtiful_xls_ce;

+ 68 - 15
kernel/chart.c

@@ -86,6 +86,10 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_INFO_EX(chart_title_name_arginfo, 0, 0, 1)
                 ZEND_ARG_INFO(0, title)
 ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(chart_legend_set_position_arginfo, 0, 0, 1)
+                ZEND_ARG_INFO(0, type)
+ZEND_END_ARG_INFO()
 /* }}} */
 
 /** {{{ \Vtiful\Kernel\Chart::__construct(resource $handle, int $type)
@@ -93,8 +97,8 @@ ZEND_END_ARG_INFO()
 PHP_METHOD(vtiful_chart, __construct)
 {
     zval *handle;
-    zend_long type;
     chart_object *obj;
+    zend_long type = 0;
     xls_resource_write_t *xls_res;
 
     ZEND_PARSE_PARAMETERS_START(2, 2)
@@ -108,7 +112,7 @@ PHP_METHOD(vtiful_chart, __construct)
     obj     = Z_CHART_P(getThis());
 
     if (obj->ptr.chart == NULL) {
-        obj->ptr.chart = workbook_add_chart(xls_res->workbook, type);
+        obj->ptr.chart = workbook_add_chart(xls_res->workbook, (uint8_t)type);
     }
 }
 /* }}} */
@@ -164,7 +168,7 @@ PHP_METHOD(vtiful_chart, seriesName)
 PHP_METHOD(vtiful_chart, style)
 {
     chart_object *obj;
-    zend_long style;
+    zend_long style = 0;
 
     ZEND_PARSE_PARAMETERS_START(1, 1)
             Z_PARAM_LONG(style)
@@ -174,7 +178,7 @@ PHP_METHOD(vtiful_chart, style)
 
     obj = Z_CHART_P(getThis());
 
-    chart_set_style(obj->ptr.chart, style);
+    chart_set_style(obj->ptr.chart, (uint8_t)style);
 }
 /* }}} */
 
@@ -235,6 +239,25 @@ PHP_METHOD(vtiful_chart, title)
 }
 /* }}} */
 
+/** {{{ \Vtiful\Kernel\Chart::legendSetPosition(int $type)
+ */
+PHP_METHOD(vtiful_chart, legendSetPosition)
+{
+    zend_long type = 0;
+    chart_object *obj;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_LONG(type)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    obj = Z_CHART_P(getThis());
+
+    chart_legend_set_position(obj->ptr.chart, (uint8_t)type);
+}
+/* }}} */
+
 /** {{{ \Vtiful\Kernel\Chart::toResource()
  */
 PHP_METHOD(vtiful_chart, toResource)
@@ -248,14 +271,15 @@ PHP_METHOD(vtiful_chart, toResource)
 /** {{{ chart_methods
 */
 zend_function_entry chart_methods[] = {
-        PHP_ME(vtiful_chart, __construct, chart_construct_arginfo,   ZEND_ACC_PUBLIC)
-        PHP_ME(vtiful_chart, series,      chart_series_arginfo,      ZEND_ACC_PUBLIC)
-        PHP_ME(vtiful_chart, seriesName,  chart_series_name_arginfo, ZEND_ACC_PUBLIC)
-        PHP_ME(vtiful_chart, style,       chart_style_arginfo,       ZEND_ACC_PUBLIC)
-        PHP_ME(vtiful_chart, axisNameY,   chart_axis_name_arginfo,   ZEND_ACC_PUBLIC)
-        PHP_ME(vtiful_chart, axisNameX,   chart_axis_name_arginfo,   ZEND_ACC_PUBLIC)
-        PHP_ME(vtiful_chart, title,       chart_title_name_arginfo,   ZEND_ACC_PUBLIC)
-        PHP_ME(vtiful_chart, toResource,  NULL,                      ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, __construct,       chart_construct_arginfo,           ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, series,            chart_series_arginfo,              ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, seriesName,        chart_series_name_arginfo,         ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, style,             chart_style_arginfo,               ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, axisNameY,         chart_axis_name_arginfo,           ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, axisNameX,         chart_axis_name_arginfo,           ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, title,             chart_title_name_arginfo,          ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, legendSetPosition, chart_legend_set_position_arginfo, ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_chart, toResource,        NULL,                              ZEND_ACC_PUBLIC)
         PHP_FE_END
 };
 /* }}} */
@@ -273,9 +297,38 @@ VTIFUL_STARTUP_FUNCTION(chart)
     chart_handlers.offset   = XtOffsetOf(chart_object, zo);
     chart_handlers.free_obj = chart_objects_free;
 
-    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LINE",   LXW_CHART_LINE)
-    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN", LXW_CHART_COLUMN)
-    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_AREA",  LXW_CHART_AREA)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_BAR",                           LXW_CHART_BAR)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_BAR_STACKED",                   LXW_CHART_BAR_STACKED)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_BAR_STACKED_PERCENT",           LXW_CHART_BAR_STACKED_PERCENT)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_AREA",                          LXW_CHART_AREA)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_AREA_STACKED",                  LXW_CHART_AREA_STACKED)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_AREA_STACKED_PERCENT",          LXW_CHART_AREA_STACKED_PERCENT)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LINE",                          LXW_CHART_LINE)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN",                        LXW_CHART_COLUMN)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN_STACKED",                LXW_CHART_COLUMN_STACKED)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN_STACKED_PERCENT",        LXW_CHART_COLUMN_STACKED_PERCENT)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_DOUGHNUT",                      LXW_CHART_DOUGHNUT)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_PIE",                           LXW_CHART_PIE)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER",                       LXW_CHART_SCATTER)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_STRAIGHT",              LXW_CHART_SCATTER_STRAIGHT)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_STRAIGHT_WITH_MARKERS", LXW_CHART_SCATTER_STRAIGHT_WITH_MARKERS)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_SMOOTH",                LXW_CHART_SCATTER_SMOOTH)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_SMOOTH_WITH_MARKERS",   LXW_CHART_SCATTER_SMOOTH_WITH_MARKERS)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_RADAR",                         LXW_CHART_RADAR)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_RADAR_WITH_MARKERS",            LXW_CHART_RADAR_WITH_MARKERS)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_RADAR_FILLED",                  LXW_CHART_RADAR_FILLED)
+
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_NONE",                   LXW_CHART_LEGEND_NONE)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_RIGHT",                  LXW_CHART_LEGEND_RIGHT)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_LEFT",                   LXW_CHART_LEGEND_LEFT)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_TOP",                    LXW_CHART_LEGEND_TOP)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_BOTTOM",                 LXW_CHART_LEGEND_BOTTOM)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_RIGHT",          LXW_CHART_LEGEND_OVERLAY_RIGHT)
+    REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_LEFT",           LXW_CHART_LEGEND_OVERLAY_LEFT)
+
+    // PECL Windows version is 0.7.7, but define in 0.7.8
+    //REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_TOP_RIGHT",              LXW_CHART_LEGEND_TOP_RIGHT)
+    //REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_TOP_RIGHT",      LXW_CHART_LEGEND_OVERLAY_TOP_RIGHT)
 
     return SUCCESS;
 }

+ 1 - 4
kernel/excel.c

@@ -170,7 +170,7 @@ PHP_METHOD(vtiful_xls, __construct)
         return;
     }
 
-    add_property_zval(getThis(), V_XLS_COF, config);
+    add_property_zval_ex(getThis(), ZEND_STRL(V_XLS_COF), config);
 }
 /* }}} */
 
@@ -377,9 +377,6 @@ PHP_METHOD(vtiful_xls, output)
 
     workbook_file(&obj->write_ptr);
 
-    add_property_null(getThis(), V_XLS_HANDLE);
-    add_property_null(getThis(), V_XLS_PAT);
-
     ZVAL_COPY(return_value, file_path);
 }
 /* }}} */

+ 10 - 10
kernel/format.c

@@ -144,7 +144,7 @@ PHP_METHOD(vtiful_format, italic)
  */
 PHP_METHOD(vtiful_format, underline)
 {
-    zend_long style;
+    zend_long style = 0;
 
     ZEND_PARSE_PARAMETERS_START(1, 1)
             Z_PARAM_LONG(style)
@@ -155,7 +155,7 @@ PHP_METHOD(vtiful_format, underline)
     format_object *obj = Z_FORMAT_P(getThis());
 
     if (obj->ptr.format) {
-        format_set_underline(obj->ptr.format, style);
+        format_set_underline(obj->ptr.format, (uint8_t)style);
     }
 }
 /* }}} */
@@ -183,7 +183,7 @@ PHP_METHOD(vtiful_format, align)
         }
 
         if (obj->ptr.format) {
-            format_set_align(obj->ptr.format, Z_LVAL_P(arg));
+            format_set_align(obj->ptr.format, (uint8_t)Z_LVAL_P(arg));
         }
     }
 }
@@ -193,7 +193,7 @@ PHP_METHOD(vtiful_format, align)
  */
 PHP_METHOD(vtiful_format, fontColor)
 {
-    zend_long color;
+    zend_long color = 0;
 
     ZEND_PARSE_PARAMETERS_START(1, 1)
             Z_PARAM_LONG(color)
@@ -204,7 +204,7 @@ PHP_METHOD(vtiful_format, fontColor)
     format_object *obj = Z_FORMAT_P(getThis());
 
     if (obj->ptr.format) {
-        format_set_font_color(obj->ptr.format, color);
+        format_set_font_color(obj->ptr.format, (uint8_t)color);
     }
 }
 /* }}} */
@@ -233,7 +233,7 @@ PHP_METHOD(vtiful_format, number)
  */
 PHP_METHOD(vtiful_format, background)
 {
-    zend_long pattern, color;
+    zend_long pattern = 0, color = 0;
 
     ZEND_PARSE_PARAMETERS_START(2, 2)
             Z_PARAM_LONG(pattern)
@@ -245,8 +245,8 @@ PHP_METHOD(vtiful_format, background)
     format_object *obj = Z_FORMAT_P(getThis());
 
     if (obj->ptr.format) {
-        format_set_pattern(obj->ptr.format, pattern);
-        format_set_bg_color(obj->ptr.format, color);
+        format_set_pattern(obj->ptr.format, (uint8_t)pattern);
+        format_set_bg_color(obj->ptr.format, (uint8_t)color);
     }
 }
 /* }}} */
@@ -303,7 +303,7 @@ PHP_METHOD(vtiful_format, wrap)
  */
 PHP_METHOD(vtiful_format, border)
 {
-    zend_long style;
+    zend_long style = 0;
 
     ZEND_PARSE_PARAMETERS_START(1, 1)
             Z_PARAM_LONG(style)
@@ -314,7 +314,7 @@ PHP_METHOD(vtiful_format, border)
     format_object *obj = Z_FORMAT_P(getThis());
 
     if (obj->ptr.format) {
-        format_set_border(obj->ptr.format, style);
+        format_set_border(obj->ptr.format, (uint8_t)style);
     }
 }
 /* }}} */

+ 10 - 12
kernel/write.c

@@ -25,9 +25,7 @@ void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_wri
     zend_uchar value_type = Z_TYPE_P(value);
 
     if (value_type == IS_STRING) {
-        zend_string *_zstr_val = zval_get_string(value);
-        worksheet_write_string(res->worksheet, lxw_row, lxw_col, ZSTR_VAL(_zstr_val), format_handle);
-        zend_string_release(_zstr_val);
+        worksheet_write_string(res->worksheet, lxw_row, lxw_col, ZSTR_VAL(zval_get_string(value)), format_handle);
         return;
     }
 
@@ -37,12 +35,12 @@ void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_wri
 
             format_set_num_format(value_format, ZSTR_VAL(format));
 
-            worksheet_write_number(res->worksheet, lxw_row, lxw_col, zval_get_long(value), value_format);
+            worksheet_write_number(res->worksheet, lxw_row, lxw_col, (double)zval_get_long(value), value_format);
             return;
         }
 
         if (format == NULL && format_handle != NULL) {
-            worksheet_write_number(res->worksheet, lxw_row, lxw_col, zval_get_long(value), format_handle);
+            worksheet_write_number(res->worksheet, lxw_row, lxw_col, (double)zval_get_long(value), format_handle);
             return;
         }
 
@@ -52,11 +50,11 @@ void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_wri
             format_copy(value_format, format_handle);
             format_set_num_format(value_format, ZSTR_VAL(format));
 
-            worksheet_write_number(res->worksheet, lxw_row, lxw_col, zval_get_long(value), value_format);
+            worksheet_write_number(res->worksheet, lxw_row, lxw_col, (double)zval_get_long(value), value_format);
             return;
         }
 
-        worksheet_write_number(res->worksheet, lxw_row, lxw_col, zval_get_long(value), NULL);
+        worksheet_write_number(res->worksheet, lxw_row, lxw_col, (double)zval_get_long(value), NULL);
     }
 
     if (value_type == IS_DOUBLE) {
@@ -84,7 +82,7 @@ void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_wri
             return;
         }
 
-        worksheet_write_number(res->worksheet, row, columns, zval_get_double(value), NULL);
+        worksheet_write_number(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, zval_get_double(value), NULL);
         return;
     }
 }
@@ -162,7 +160,7 @@ void format_copy(lxw_format *new_format, lxw_format *other_format)
 
 void url_writer(zend_long row, zend_long columns, xls_resource_write_t *res, zend_string *url, lxw_format *format)
 {
-    worksheet_write_url(res->worksheet, row, columns, ZSTR_VAL(url), format);
+    worksheet_write_url(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, ZSTR_VAL(url), format);
 }
 
 /*
@@ -172,7 +170,7 @@ void image_writer(zval *value, zend_long row, zend_long columns, double width, d
 {
     lxw_image_options options = {.x_scale = width, .y_scale = height};
 
-    worksheet_insert_image_opt(res->worksheet, row, columns, ZSTR_VAL(zval_get_string(value)), &options);
+    worksheet_insert_image_opt(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, ZSTR_VAL(zval_get_string(value)), &options);
 }
 
 /*
@@ -180,12 +178,12 @@ void image_writer(zval *value, zend_long row, zend_long columns, double width, d
  */
 void formula_writer(zval *value, zend_long row, zend_long columns, xls_resource_write_t *res)
 {
-    worksheet_write_formula(res->worksheet, row, columns, ZSTR_VAL(zval_get_string(value)), NULL);
+    worksheet_write_formula(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, ZSTR_VAL(zval_get_string(value)), NULL);
 }
 
 void chart_writer(zend_long row, zend_long columns, xls_resource_chart_t *chart_resource, xls_resource_write_t *res)
 {
-    worksheet_insert_chart(res->worksheet, row, columns, chart_resource->chart);
+    worksheet_insert_chart(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, chart_resource->chart);
 }
 
 /*

+ 44 - 0
tests/multiple_file.phpt

@@ -0,0 +1,44 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
+--FILE--
+<?php
+$config = [
+    'path' => './tests',
+];
+
+$lastFilePath = NULL;
+
+for ($index = 0; $index < 100; $index++) {
+    $fileObject = new \Vtiful\Kernel\Excel($config);
+
+    $fileObject = $fileObject->fileName('tutorial' . $index . '.xlsx');
+    $fileHandle = $fileObject->getHandle();
+
+    $format     = new \Vtiful\Kernel\Format($fileHandle);
+    $alignStyle = $format->align(
+        \Vtiful\Kernel\Format::FORMAT_ALIGN_CENTER,
+        \Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_CENTER
+    )->toResource();
+
+    $lastFilePath = $fileObject->header(['name', 'age'])
+        ->data([
+            ['viest', 21],
+            ['wjx', 21],
+        ])
+        ->setRow('A1', 50, $alignStyle)
+        ->setRow('A2:A3', 50, $alignStyle)
+        ->output();
+}
+
+var_dump($lastFilePath);
+?>
+--CLEAN--
+<?php
+for ($index = 0; $index < 100; $index++) {
+    @unlink(__DIR__ . '/tutorial' . $index . '.xlsx');
+}
+?>
+--EXPECT--
+string(23) "./tests/tutorial99.xlsx"