Browse Source

Feat(Chart): series,style,title,axis name

viest 6 years ago
parent
commit
cad7caea54

+ 124 - 14
README_zh.md

@@ -10,20 +10,24 @@ Authon: viest [[email protected]](mailto:[email protected])
 ## 使用
 
 1. [创建一个简单的xlsx文件](#创建一个简单的xlsx文件)
-2. [单元格插入文字](#单元格插入文字)
-3. [单元格插入链接](#单元格插入链接)
-4. [单元格插入公式](#单元格插入公式)
-5. [单元格插入本地图片](#单元格插入本地图片)
-6. [数据过滤](#数据过滤)
-7. [合并单元格](#合并单元格)
-8. [设置列单元格样式](#设置列单元格格式)
-9. [设置行单元格样式](#设置行单元格格式)
-10. [设置文字颜色](#设置文字颜色)
-11. [固定内存导出](#固定内存导出)
-12. [创建工作表](#创建工作表)
-13. [组合样式](#组合样式)
-14. [样式列表](#样式列表)
-15. [颜色常量](#颜色常量)
+2. 图表
+   1. [图表添加数据](#图表添加数据)
+   2. [直方图](#直方图)
+   3. [面积图](#面积图)
+3. [单元格插入文字](#单元格插入文字)
+4. [单元格插入链接](#单元格插入链接)
+5. [单元格插入公式](#单元格插入公式)
+6. [单元格插入本地图片](#单元格插入本地图片)
+7. [数据过滤](#数据过滤)
+8. [合并单元格](#合并单元格)
+9. [设置列单元格样式](#设置列单元格格式)
+10. [设置行单元格样式](#设置行单元格格式)
+11. [设置文字颜色](#设置文字颜色)
+12. [固定内存导出](#固定内存导出)
+13. [创建工作表](#创建工作表)
+14. [组合样式](#组合样式)
+15. [样式列表](#样式列表)
+16. [颜色常量](#颜色常量)
 
 ## PECL
 
@@ -135,6 +139,112 @@ $filePath = $excel->fileName('tutorial01.xlsx', 'sheet1')
     ->output();
 ```
 
+### 图表添加数据
+
+##### 函数原型
+
+```php
+series(string $value,[ string $categories])
+```
+
+##### string $value
+
+> 图表单个类别数据所在的工作表及单元格跨度
+>
+> `Sheet1 !   $A$1   : $A$5`
+>
+> `工作表  ! 开始单元格 : 结束单元格`
+
+##### string $categories
+
+> 类别名称
+
+### 直方图
+
+##### 类型
+
+```php
+\Vtiful\Kernel\Chart::CHART_COLUMN
+```
+
+##### 图表
+
+![php-excel](https://github.com/viest/php-ext-excel-export/blob/master/resource/chart_simple.png)
+
+##### 实例
+
+```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_COLUMN);
+
+$chartResource = $chart->series('Sheet1!$A$1:$A$5')
+    ->series('Sheet1!$B$1:$B$5')
+    ->series('Sheet1!$C$1:$C$5')
+    ->toResource();
+
+$filePath = $fileObject->data([
+    [1, 2, 3],
+    [2, 4, 6],
+    [3, 6, 9],
+    [4, 8, 12],
+    [5, 10, 15],
+])->insertChart(0, 3, $chartResource)->output();
+```
+
+### 面积图
+
+##### 类型
+
+```php
+\Vtiful\Kernel\Chart::CHART_AREA
+```
+
+##### 图标
+
+![php-excel](https://github.com/viest/php-ext-excel-export/blob/master/resource/chart_area1.png)
+
+##### 实例
+
+```php
+<?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_AREA);
+
+$chartResource = $chart
+    ->series('=Sheet1!$B$2:$B$7', '=Sheet1!$A$2:$A$7')
+    ->seriesName('=Sheet1!$B$1')
+    ->series('=Sheet1!$C$2:$C$7', '=Sheet1!$A$2:$A$7')
+    ->seriesName('=Sheet1!$C$1')
+    ->style(11)// 值为 1 - 48,可参考 Excel 2007 "设计" 选项卡中的 48 种样式
+    ->axisNameX('Test number') // 设置 X 轴名称
+    ->axisNameY('Sample length (mm)') // 设置 Y 轴名称
+    ->title('Results of sample analysis') // 设置图表 Title
+    ->toResource();
+
+$filePath = $fileObject->header(['Number', 'Batch 1', 'Batch 2'])
+    ->data([
+        [2, 40, 30],
+        [3, 40, 25],
+        [4, 50, 30],
+        [5, 30, 10],
+        [6, 25, 5],
+        [7, 50, 10],
+    ])->insertChart(0, 3, $chartResource)->output();
+```
+
 ### 单元格插入文字
 
 #### 函数原型

+ 136 - 9
kernel/chart.c

@@ -69,6 +69,23 @@ ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(chart_series_arginfo, 0, 0, 1)
                 ZEND_ARG_INFO(0, value)
+                ZEND_ARG_INFO(0, categories)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(chart_series_name_arginfo, 0, 0, 1)
+                ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(chart_style_arginfo, 0, 0, 1)
+                ZEND_ARG_INFO(0, style)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(chart_axis_name_arginfo, 0, 0, 1)
+                ZEND_ARG_INFO(0, name)
+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()
 /* }}} */
 
@@ -92,27 +109,130 @@ PHP_METHOD(vtiful_chart, __construct)
     obj     = Z_CHART_P(getThis());
 
     if (obj->ptr.chart == NULL) {
-        obj->ptr.chart = workbook_add_chart(xls_res->workbook, LXW_CHART_LINE);
+        obj->ptr.chart = workbook_add_chart(xls_res->workbook, type);
     }
 }
 /* }}} */
 
-/** {{{ \Vtiful\Kernel\Chart::series()
+/** {{{ \Vtiful\Kernel\Chart::series(string $value, string $categories)
  */
 PHP_METHOD(vtiful_chart, series)
 {
     chart_object *obj;
-    zend_string *value;
+    zend_string *values, *categories = NULL;
+
+    ZEND_PARSE_PARAMETERS_START(1, 2)
+            Z_PARAM_STR(values)
+            Z_PARAM_OPTIONAL
+            Z_PARAM_STR(categories)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    obj = Z_CHART_P(getThis());
+
+    if (ZEND_NUM_ARGS() == 2) {
+        obj->ptr.series = chart_add_series(obj->ptr.chart, ZSTR_VAL(categories), ZSTR_VAL(values));
+    }
+
+    if (ZEND_NUM_ARGS() == 1) {
+        obj->ptr.series = chart_add_series(obj->ptr.chart, NULL, ZSTR_VAL(values));
+    }
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Chart::seriesName(string $value)
+ */
+PHP_METHOD(vtiful_chart, seriesName)
+{
+    chart_object *obj;
+    zend_string *values;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_STR(values)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    obj = Z_CHART_P(getThis());
+
+    chart_series_set_name(obj->ptr.series, ZSTR_VAL(values));
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Chart::seriesName(string $value)
+ */
+PHP_METHOD(vtiful_chart, style)
+{
+    chart_object *obj;
+    zend_long style;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_LONG(style)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    obj = Z_CHART_P(getThis());
+
+    chart_set_style(obj->ptr.chart, style);
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Chart::axisNameX(string $name)
+ */
+PHP_METHOD(vtiful_chart, axisNameX)
+{
+    chart_object *obj;
+    zend_string *name;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_STR(name)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    obj = Z_CHART_P(getThis());
+
+    chart_axis_set_name(obj->ptr.chart->x_axis, ZSTR_VAL(name));
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Chart::axisNameY(string $name)
+ */
+PHP_METHOD(vtiful_chart, axisNameY)
+{
+    chart_object *obj;
+    zend_string *name;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_STR(name)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    obj = Z_CHART_P(getThis());
+
+    chart_axis_set_name(obj->ptr.chart->y_axis, ZSTR_VAL(name));
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Chart::title(string $title)
+ */
+PHP_METHOD(vtiful_chart, title)
+{
+    chart_object *obj;
+    zend_string *title;
 
     ZEND_PARSE_PARAMETERS_START(1, 1)
-            Z_PARAM_STR(value)
+            Z_PARAM_STR(title)
     ZEND_PARSE_PARAMETERS_END();
 
     ZVAL_COPY(return_value, getThis());
 
     obj = Z_CHART_P(getThis());
 
-    chart_add_series(obj->ptr.chart, NULL, ZSTR_VAL(value));
+    chart_title_set_name(obj->ptr.chart, ZSTR_VAL(title));
 }
 /* }}} */
 
@@ -129,9 +249,14 @@ 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, 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, toResource,  NULL,                      ZEND_ACC_PUBLIC)
         PHP_FE_END
 };
 /* }}} */
@@ -148,7 +273,9 @@ 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_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)
 
     return SUCCESS;
 }

BIN
resource/chart_area1.png


BIN
resource/chart_simple.png


+ 0 - 25
test.php

@@ -1,25 +0,0 @@
-<?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();

+ 28 - 0
tests/chart_axis_name_x.phpt

@@ -0,0 +1,28 @@
+--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_AREA);
+
+$chartResource = $chart
+    ->series('=Sheet1!$B$2:$B$7', '=Sheet1!$A$2:$A$7')
+    ->axisNameX('Test number')
+    ->toResource();
+
+var_dump($chartResource);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+resource(5) of type (xlsx)

+ 28 - 0
tests/chart_axis_name_y.phpt

@@ -0,0 +1,28 @@
+--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_AREA);
+
+$chartResource = $chart
+    ->series('=Sheet1!$B$2:$B$7', '=Sheet1!$A$2:$A$7')
+    ->axisNameY('Sample length (mm)')
+    ->toResource();
+
+var_dump($chartResource);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+resource(5) of type (xlsx)

+ 28 - 0
tests/chart_series.phpt

@@ -0,0 +1,28 @@
+--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_COLUMN);
+
+$chartResource = $chart->series('Sheet1!$A$1:$A$5')
+    ->series('Sheet1!$B$1:$B$5')
+    ->series('Sheet1!$C$1:$C$5')
+    ->toResource();
+
+var_dump($chartResource);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+resource(5) of type (xlsx)

+ 28 - 0
tests/chart_series_name.phpt

@@ -0,0 +1,28 @@
+--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_AREA);
+
+$chartResource = $chart
+    ->series('=Sheet1!$B$2:$B$7', '=Sheet1!$A$2:$A$7')
+    ->seriesName('=Sheet1!$B$1')
+    ->toResource();
+
+var_dump($chartResource);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+resource(5) of type (xlsx)

+ 29 - 0
tests/chart_style.phpt

@@ -0,0 +1,29 @@
+--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_AREA);
+
+$chartResource = $chart
+    ->series('=Sheet1!$B$2:$B$7', '=Sheet1!$A$2:$A$7')
+    ->seriesName('=Sheet1!$B$1')
+    ->style(11)
+    ->toResource();
+
+var_dump($chartResource);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+resource(5) of type (xlsx)

+ 28 - 0
tests/chart_title.phpt

@@ -0,0 +1,28 @@
+--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_AREA);
+
+$chartResource = $chart
+    ->series('=Sheet1!$B$2:$B$7', '=Sheet1!$A$2:$A$7')
+    ->title('Results of sample analysis')
+    ->toResource();
+
+var_dump($chartResource);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+resource(5) of type (xlsx)