Browse Source

Feat(worksheet): font color, insert chart

viest 6 years ago
parent
commit
6fc89871ad
14 changed files with 412 additions and 5 deletions
  1. 6 0
      README_zh.md
  2. 1 0
      config.m4
  3. 154 0
      kernel/chart.c
  4. 20 0
      kernel/chart.h
  5. 28 0
      kernel/excel.c
  6. 41 1
      kernel/format.c
  7. 20 2
      kernel/include.h
  8. 13 2
      kernel/resource.c
  9. 5 0
      kernel/write.c
  10. 25 0
      test.php
  11. 38 0
      tests/chart_line.phpt
  12. 26 0
      tests/chart_resource.phpt
  13. 34 0
      tests/format_color.phpt
  14. 1 0
      xls_writer.c

+ 6 - 0
README_zh.md

@@ -365,6 +365,12 @@ $fileObject->header(['name', 'age'])
     ->output();
 ```
 
+### 设置文字颜色
+
+#### 函数原型
+
+
+
 ### 固定内存导出
 
 #### 内存

+ 1 - 0
config.m4

@@ -13,6 +13,7 @@ if test "$PHP_XLSWRITER" != "no"; then
     kernel/excel.c \
     kernel/write.c \
     kernel/format.c \
+    kernel/chart.c \
     "
     libxlsxwriter_sources="
     library/third_party/minizip/ioapi.c \

+ 154 - 0
kernel/chart.c

@@ -0,0 +1,154 @@
+/*
+  +----------------------------------------------------------------------+
+  | XlsWriter Extension                                                  |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 2017-2018 The Viest                                    |
+  +----------------------------------------------------------------------+
+  | http://www.viest.me                                                  |
+  +----------------------------------------------------------------------+
+  | Author: viest <[email protected]>                                 |
+  +----------------------------------------------------------------------+
+*/
+
+#include "include.h"
+#include "chart.h"
+
+zend_class_entry *vtiful_chart_ce;
+
+/* {{{ format_objects_new
+ */
+static zend_object_handlers chart_handlers;
+
+static zend_always_inline void *vtiful_char_object_alloc(size_t obj_size, zend_class_entry *ce) {
+    void *obj = emalloc(obj_size);
+    memset(obj, 0, obj_size);
+    return obj;
+}
+
+PHP_VTIFUL_API zend_object *chart_objects_new(zend_class_entry *ce)
+{
+    chart_object *format = (chart_object *)vtiful_char_object_alloc(sizeof(chart_object), ce);
+
+    zend_object_std_init(&format->zo, ce);
+    object_properties_init(&format->zo, ce);
+
+    format->ptr.chart   = NULL;
+    format->ptr.series  = NULL;
+    format->zo.handlers = &chart_handlers;
+
+    return &format->zo;
+}
+/* }}} */
+
+/* {{{ chart_objects_free
+ */
+static void chart_objects_free(zend_object *object)
+{
+    chart_object *intern = php_vtiful_chart_fetch_object(object);
+
+    if (intern->ptr.series != NULL) {
+        // free by workbook
+        intern->ptr.series = NULL;
+    }
+
+    if (intern->ptr.chart != NULL) {
+        // free by workbook
+        intern->ptr.chart = NULL;
+    }
+
+    zend_object_std_dtor(&intern->zo);
+}
+/* }}} */
+
+/* {{{ ARG_INFO
+ */
+ZEND_BEGIN_ARG_INFO_EX(chart_construct_arginfo, 0, 0, 2)
+                ZEND_ARG_INFO(0, handle)
+                ZEND_ARG_INFO(0, type)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(chart_series_arginfo, 0, 0, 1)
+                ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Chart::__construct(resource $handle, int $type)
+ */
+PHP_METHOD(vtiful_chart, __construct)
+{
+    zval *handle;
+    zend_long type;
+    chart_object *obj;
+    xls_resource_t *xls_res;
+
+    ZEND_PARSE_PARAMETERS_START(2, 2)
+            Z_PARAM_RESOURCE(handle)
+            Z_PARAM_LONG(type)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    xls_res = zval_get_resource(handle);
+    obj     = Z_CHART_P(getThis());
+
+    if (obj->ptr.chart == NULL) {
+        obj->ptr.chart = workbook_add_chart(xls_res->workbook, LXW_CHART_LINE);
+    }
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Chart::series()
+ */
+PHP_METHOD(vtiful_chart, series)
+{
+    chart_object *obj;
+    zend_string *value;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_STR(value)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    obj = Z_CHART_P(getThis());
+
+    chart_add_series(obj->ptr.chart, NULL, ZSTR_VAL(value));
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Chart::toResource()
+ */
+PHP_METHOD(vtiful_chart, toResource)
+{
+    chart_object *obj = Z_CHART_P(getThis());
+
+    RETURN_RES(zend_register_resource(&obj->ptr, le_xls_writer));
+}
+/* }}} */
+
+/** {{{ 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, toResource,  NULL,                    ZEND_ACC_PUBLIC)
+        PHP_FE_END
+};
+/* }}} */
+
+VTIFUL_STARTUP_FUNCTION(chart)
+{
+    zend_class_entry ce;
+
+    INIT_NS_CLASS_ENTRY(ce, "Vtiful\\Kernel", "Chart", chart_methods);
+    ce.create_object = chart_objects_new;
+    vtiful_chart_ce  = zend_register_internal_class(&ce);
+
+    memcpy(&chart_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+    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)
+
+    return SUCCESS;
+}

+ 20 - 0
kernel/chart.h

@@ -0,0 +1,20 @@
+/*
+  +----------------------------------------------------------------------+
+  | XlsWriter Extension                                                  |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 2017-2018 The Viest                                    |
+  +----------------------------------------------------------------------+
+  | http://www.viest.me                                                  |
+  +----------------------------------------------------------------------+
+  | Author: viest <[email protected]>                                 |
+  +----------------------------------------------------------------------+
+*/
+
+#ifndef PHP_EXT_EXCEL_EXPORT_CHART_H
+#define PHP_EXT_EXCEL_EXPORT_CHART_H
+
+extern zend_class_entry *vtiful_chart_ce;
+
+VTIFUL_STARTUP_FUNCTION(chart);
+
+#endif

+ 28 - 0
kernel/excel.c

@@ -86,6 +86,12 @@ ZEND_BEGIN_ARG_INFO_EX(xls_insert_text_arginfo, 0, 0, 4)
                 ZEND_ARG_INFO(0, format)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(xls_insert_chart_arginfo, 0, 0, 3)
+                ZEND_ARG_INFO(0, row)
+                ZEND_ARG_INFO(0, column)
+                ZEND_ARG_INFO(0, chart_resource)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(xls_insert_image_arginfo, 0, 0, 3)
                 ZEND_ARG_INFO(0, row)
                 ZEND_ARG_INFO(0, column)
@@ -358,6 +364,27 @@ PHP_METHOD(vtiful_xls, insertText)
 }
 /* }}} */
 
+/** {{{ \Vtiful\Kernel\xls::insertChart(int $row, int $column, resource $chartResource)
+ */
+PHP_METHOD(vtiful_xls, insertChart)
+{
+    zval *chart_resource;
+    zend_long row, column;
+
+    ZEND_PARSE_PARAMETERS_START(3, 3)
+            Z_PARAM_LONG(row)
+            Z_PARAM_LONG(column)
+            Z_PARAM_ZVAL(chart_resource)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    xls_object *obj = Z_XLS_P(getThis());
+
+    chart_writer(row, column, zval_get_chart(chart_resource), &obj->ptr);
+}
+/* }}} */
+
 /** {{{ \Vtiful\Kernel\xls::insertImage(int $row, int $column, string $imagePath)
  */
 PHP_METHOD(vtiful_xls, insertImage)
@@ -516,6 +543,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, insertChart,   xls_insert_chart_arginfo,   ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, insertImage,   xls_insert_image_arginfo,   ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, insertFormula, xls_insert_formula_arginfo, ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, mergeCells,    xls_merge_cells_arginfo,    ZEND_ACC_PUBLIC)

+ 41 - 1
kernel/format.c

@@ -66,6 +66,10 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_INFO_EX(format_align_arginfo, 0, 0, 1)
                 ZEND_ARG_INFO(0, style)
 ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(format_color_arginfo, 0, 0, 1)
+                ZEND_ARG_INFO(0, color)
+ZEND_END_ARG_INFO()
 /* }}} */
 
 /** {{{ \Vtiful\Kernel\Format::__construct()
@@ -157,6 +161,24 @@ PHP_METHOD(vtiful_format, align)
 }
 /* }}} */
 
+/** {{{ \Vtiful\Kernel\Format::color(int $color)
+ */
+PHP_METHOD(vtiful_format, color)
+{
+    zend_long color;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_LONG(color)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    format_object *obj = Z_FORMAT_P(getThis());
+
+    format_set_font_color(obj->ptr.format, color);
+}
+/* }}} */
+
 /** {{{ \Vtiful\Kernel\Format::toResource()
  */
 PHP_METHOD(vtiful_format, toResource)
@@ -168,7 +190,7 @@ PHP_METHOD(vtiful_format, toResource)
 /* }}} */
 
 
-/** {{{ xls_methods
+/** {{{ format_methods
 */
 zend_function_entry format_methods[] = {
         PHP_ME(vtiful_format, __construct, format_construct_arginfo, ZEND_ACC_PUBLIC)
@@ -176,6 +198,7 @@ zend_function_entry format_methods[] = {
         PHP_ME(vtiful_format, italic,      NULL,                     ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_format, underline,   format_underline_arginfo, ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_format, align,       format_align_arginfo,     ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_format, color,       format_color_arginfo,     ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_format, toResource,  NULL,                     ZEND_ACC_PUBLIC)
         PHP_FE_END
 };
@@ -212,6 +235,23 @@ VTIFUL_STARTUP_FUNCTION(format) {
     REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "FORMAT_ALIGN_VERTICAL_JUSTIFY",     LXW_ALIGN_VERTICAL_JUSTIFY)
     REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "FORMAT_ALIGN_VERTICAL_DISTRIBUTED", LXW_ALIGN_VERTICAL_DISTRIBUTED)
 
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_BLACK",   LXW_COLOR_BLACK)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_BLUE",    LXW_COLOR_BLUE)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_BROWN",   LXW_COLOR_BROWN)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_CYAN",    LXW_COLOR_CYAN)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_GRAY",    LXW_COLOR_GRAY)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_GREEN",   LXW_COLOR_GREEN)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_LIME",    LXW_COLOR_LIME)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_MAGENTA", LXW_COLOR_MAGENTA)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_NAVY",    LXW_COLOR_NAVY)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_ORANGE",  LXW_COLOR_ORANGE)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_PINK",    LXW_COLOR_PINK)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_PURPLE",  LXW_COLOR_PURPLE)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_RED",     LXW_COLOR_RED)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_SILVER",  LXW_COLOR_SILVER)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_WHITE",   LXW_COLOR_WHITE)
+    REGISTER_CLASS_CONST_LONG(vtiful_format_ce, "COLOR_YELLOW",  LXW_COLOR_YELLOW)
+
     return SUCCESS;
 }
 /* }}} */

+ 20 - 2
kernel/include.h

@@ -32,6 +32,7 @@
 #include "excel.h"
 #include "exception.h"
 #include "format.h"
+#include "chart.h"
 
 typedef struct {
     lxw_workbook  *workbook;
@@ -42,6 +43,11 @@ typedef struct {
     lxw_format  *format;
 } xls_resource_format_t;
 
+typedef struct {
+    lxw_chart *chart;
+    lxw_chart_series *series;
+} xls_resource_chart_t;
+
 typedef struct _vtiful_xls_object {
     xls_resource_t ptr;
     zend_long      line;
@@ -53,6 +59,11 @@ typedef struct _vtiful_format_object {
     zend_object zo;
 } format_object;
 
+typedef struct _vtiful_chart_object {
+    xls_resource_chart_t ptr;
+    zend_object zo;
+} chart_object;
+
 static inline xls_object *php_vtiful_xls_fetch_object(zend_object *obj) {
     return (xls_object *)((char *)(obj) - XtOffsetOf(xls_object, zo));
 }
@@ -61,6 +72,10 @@ static inline format_object *php_vtiful_format_fetch_object(zend_object *obj) {
     return (format_object *)((char *)(obj) - XtOffsetOf(format_object, zo));
 }
 
+static inline chart_object *php_vtiful_chart_fetch_object(zend_object *obj) {
+    return (chart_object *)((char *)(obj) - XtOffsetOf(chart_object, zo));
+}
+
 #define REGISTER_CLASS_CONST_LONG(class_name, const_name, value) \
     zend_declare_class_constant_long(class_name, const_name, sizeof(const_name)-1, (zend_long)value);
 
@@ -68,6 +83,7 @@ static inline format_object *php_vtiful_format_fetch_object(zend_object *obj) {
     zend_declare_property_null(class_name, ZEND_STRL(property_name), acc);
 
 #define Z_XLS_P(zv)    php_vtiful_xls_fetch_object(Z_OBJ_P(zv));
+#define Z_CHART_P(zv)  php_vtiful_chart_fetch_object(Z_OBJ_P(zv));
 #define Z_FORMAT_P(zv) php_vtiful_format_fetch_object(Z_OBJ_P(zv));
 
 #define ROW(range) \
@@ -84,8 +100,9 @@ static inline format_object *php_vtiful_format_fetch_object(zend_object *obj) {
 
 #define SHEET_CURRENT_LINE(obj_p) obj_p->line
 
-xls_resource_t * zval_get_resource(zval *handle);
-lxw_format       * zval_get_format(zval *handle);
+lxw_format           * zval_get_format(zval *handle);
+xls_resource_t       * zval_get_resource(zval *handle);
+xls_resource_chart_t *zval_get_chart(zval *resource);
 
 STATIC lxw_error _store_defined_name(lxw_workbook *self, const char *name, const char *app_name, const char *formula, int16_t index, uint8_t hidden);
 
@@ -97,6 +114,7 @@ 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, xls_resource_t *res, zend_string *format);
+void chart_writer(zend_long row, zend_long columns, xls_resource_chart_t *chart_resource, xls_resource_t *res);
 void image_writer(zval *value, zend_long row, zend_long columns, double width, double height, xls_resource_t *res);
 void formula_writer(zval *value, zend_long row, zend_long columns, xls_resource_t *res);
 void auto_filter(zend_string *range, xls_resource_t *res);

+ 13 - 2
kernel/resource.c

@@ -31,9 +31,20 @@ lxw_format * zval_get_format(zval *handle)
     lxw_format *res;
 
     if((res = (lxw_format *)zend_fetch_resource(Z_RES_P(handle), VTIFUL_RESOURCE_NAME, le_xls_writer)) == NULL) {
-        zend_throw_exception(vtiful_exception_ce, "XLS resources resolution fail", 210);
+        zend_throw_exception(vtiful_exception_ce, "format resources resolution fail", 210);
     }
 
     return res;
 }
-/* }}} */
+/* }}} */
+
+xls_resource_chart_t *zval_get_chart(zval *resource)
+{
+    xls_resource_chart_t *res;
+
+    if((res = (xls_resource_chart_t *)zend_fetch_resource(Z_RES_P(resource), VTIFUL_RESOURCE_NAME, le_xls_writer)) == NULL) {
+        zend_throw_exception(vtiful_exception_ce, "chart resources resolution fail", 210);
+    }
+
+    return res;
+}

+ 5 - 0
kernel/write.c

@@ -62,6 +62,11 @@ void formula_writer(zval *value, zend_long row, zend_long columns, xls_resource_
     worksheet_write_formula(res->worksheet, row, 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_t *res)
+{
+    worksheet_insert_chart(res->worksheet, row, columns, chart_resource->chart);
+}
+
 /*
  * Add the autofilter.
  */

+ 25 - 0
test.php

@@ -0,0 +1,25 @@
+<?php
+
+$config = [
+    'path' => './tests'
+];
+
+$fileObject  = new \Vtiful\Kernel\Excel($config);
+
+$fileObject = $fileObject->fileName('tutorial.xlsx');
+$fileHandle = $fileObject->getHandle();
+
+$chart         = new \Vtiful\Kernel\Chart($fileHandle, \Vtiful\Kernel\Chart::CHART_LINE);
+$chartResource = $chart->series('Sheet1!$A$2:$A$7')->toResource();
+
+$filePath = $fileObject->header(['number'])
+    ->data([
+        [10],
+        [40],
+        [50],
+        [20],
+        [10],
+        [50],
+    ])
+    ->insertChart(0, 3, $chartResource)
+    ->output();

+ 38 - 0
tests/chart_line.phpt

@@ -0,0 +1,38 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
+--FILE--
+<?php
+$config = [
+    'path' => './tests'
+];
+
+$fileObject  = new \Vtiful\Kernel\Excel($config);
+
+$fileObject = $fileObject->fileName('tutorial.xlsx');
+$fileHandle = $fileObject->getHandle();
+
+$chart         = new \Vtiful\Kernel\Chart($fileHandle, \Vtiful\Kernel\Chart::CHART_LINE);
+$chartResource = $chart->series('Sheet1!$A$2:$A$7')->toResource();
+
+$filePath = $fileObject->header(['number'])
+    ->data([
+        [10],
+        [40],
+        [50],
+        [20],
+        [10],
+        [50],
+    ])
+    ->insertChart(0, 3, $chartResource)
+    ->output();
+
+var_dump($filePath);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+string(21) "./tests/tutorial.xlsx"

+ 26 - 0
tests/chart_resource.phpt

@@ -0,0 +1,26 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
+--FILE--
+<?php
+$config = [
+    'path' => './tests'
+];
+
+$fileObject  = new \Vtiful\Kernel\Excel($config);
+
+$fileObject = $fileObject->fileName('tutorial.xlsx');
+$fileHandle = $fileObject->getHandle();
+
+$chart         = new \Vtiful\Kernel\Chart($fileHandle, \Vtiful\Kernel\Chart::CHART_LINE);
+$chartResource = $chart->toResource();
+
+var_dump($chartResource);
+?>
+--CLEAN--
+<?php
+//
+?>
+--EXPECT--
+resource(5) of type (xlsx)

+ 34 - 0
tests/format_color.phpt

@@ -0,0 +1,34 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
+--FILE--
+<?php
+$config = [
+    'path' => './tests'
+];
+
+$fileObject  = new \Vtiful\Kernel\Excel($config);
+
+$fileObject = $fileObject->fileName('tutorial.xlsx');
+$fileHandle = $fileObject->getHandle();
+
+$format     = new \Vtiful\Kernel\Format($fileHandle);
+$colorStyle = $format->color(\Vtiful\Kernel\Format::COLOR_ORANGE)->toResource();
+
+$filePath = $fileObject->header(['name', 'age'])
+    ->data([
+        ['viest', 21],
+        ['wjx',   21]
+    ])
+    ->setRow('A1', 50, $colorStyle)
+    ->output();
+
+var_dump($filePath);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+string(21) "./tests/tutorial.xlsx"

+ 1 - 0
xls_writer.c

@@ -27,6 +27,7 @@ PHP_MINIT_FUNCTION(xlswriter)
     VTIFUL_STARTUP_MODULE(exception);
 	VTIFUL_STARTUP_MODULE(excel);
 	VTIFUL_STARTUP_MODULE(format);
+	VTIFUL_STARTUP_MODULE(chart);
 
 	le_xls_writer = zend_register_list_destructors_ex(_php_vtiful_xls_close, NULL, VTIFUL_RESOURCE_NAME, module_number);