Skip to content

Commit c59c44f

Browse files
authored
Merge pull request #156 from viest/dev
Fix(file): multiple export
2 parents a6562e8 + 160b595 commit c59c44f

File tree

6 files changed

+138
-45
lines changed

6 files changed

+138
-45
lines changed

include/excel.h

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

21-
#define GET_CONFIG_PATH(dir_path_res, class_name, object) \
22-
do { \
23-
zval *_config = zend_read_property(class_name, object, ZEND_STRL(V_XLS_COF), 0, NULL); \
24-
(dir_path_res) = zend_hash_str_find(Z_ARRVAL_P(_config), ZEND_STRL(V_XLS_PAT)); \
21+
#define GET_CONFIG_PATH(dir_path_res, class_name, object) \
22+
do { \
23+
zval rv; \
24+
zval *_config = zend_read_property(class_name, object, ZEND_STRL(V_XLS_COF), 0, &rv); \
25+
(dir_path_res) = zend_hash_str_find(Z_ARRVAL_P(_config), ZEND_STRL(V_XLS_PAT)); \
2526
} while(0)
2627

2728
extern zend_class_entry *vtiful_xls_ce;

kernel/chart.c

Lines changed: 68 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,19 @@ ZEND_END_ARG_INFO()
8686
ZEND_BEGIN_ARG_INFO_EX(chart_title_name_arginfo, 0, 0, 1)
8787
ZEND_ARG_INFO(0, title)
8888
ZEND_END_ARG_INFO()
89+
90+
ZEND_BEGIN_ARG_INFO_EX(chart_legend_set_position_arginfo, 0, 0, 1)
91+
ZEND_ARG_INFO(0, type)
92+
ZEND_END_ARG_INFO()
8993
/* }}} */
9094

9195
/** {{{ \Vtiful\Kernel\Chart::__construct(resource $handle, int $type)
9296
*/
9397
PHP_METHOD(vtiful_chart, __construct)
9498
{
9599
zval *handle;
96-
zend_long type;
97100
chart_object *obj;
101+
zend_long type = 0;
98102
xls_resource_write_t *xls_res;
99103

100104
ZEND_PARSE_PARAMETERS_START(2, 2)
@@ -108,7 +112,7 @@ PHP_METHOD(vtiful_chart, __construct)
108112
obj = Z_CHART_P(getThis());
109113

110114
if (obj->ptr.chart == NULL) {
111-
obj->ptr.chart = workbook_add_chart(xls_res->workbook, type);
115+
obj->ptr.chart = workbook_add_chart(xls_res->workbook, (uint8_t)type);
112116
}
113117
}
114118
/* }}} */
@@ -164,7 +168,7 @@ PHP_METHOD(vtiful_chart, seriesName)
164168
PHP_METHOD(vtiful_chart, style)
165169
{
166170
chart_object *obj;
167-
zend_long style;
171+
zend_long style = 0;
168172

169173
ZEND_PARSE_PARAMETERS_START(1, 1)
170174
Z_PARAM_LONG(style)
@@ -174,7 +178,7 @@ PHP_METHOD(vtiful_chart, style)
174178

175179
obj = Z_CHART_P(getThis());
176180

177-
chart_set_style(obj->ptr.chart, style);
181+
chart_set_style(obj->ptr.chart, (uint8_t)style);
178182
}
179183
/* }}} */
180184

@@ -235,6 +239,25 @@ PHP_METHOD(vtiful_chart, title)
235239
}
236240
/* }}} */
237241

242+
/** {{{ \Vtiful\Kernel\Chart::legendSetPosition(int $type)
243+
*/
244+
PHP_METHOD(vtiful_chart, legendSetPosition)
245+
{
246+
zend_long type = 0;
247+
chart_object *obj;
248+
249+
ZEND_PARSE_PARAMETERS_START(1, 1)
250+
Z_PARAM_LONG(type)
251+
ZEND_PARSE_PARAMETERS_END();
252+
253+
ZVAL_COPY(return_value, getThis());
254+
255+
obj = Z_CHART_P(getThis());
256+
257+
chart_legend_set_position(obj->ptr.chart, (uint8_t)type);
258+
}
259+
/* }}} */
260+
238261
/** {{{ \Vtiful\Kernel\Chart::toResource()
239262
*/
240263
PHP_METHOD(vtiful_chart, toResource)
@@ -248,14 +271,15 @@ PHP_METHOD(vtiful_chart, toResource)
248271
/** {{{ chart_methods
249272
*/
250273
zend_function_entry chart_methods[] = {
251-
PHP_ME(vtiful_chart, __construct, chart_construct_arginfo, ZEND_ACC_PUBLIC)
252-
PHP_ME(vtiful_chart, series, chart_series_arginfo, ZEND_ACC_PUBLIC)
253-
PHP_ME(vtiful_chart, seriesName, chart_series_name_arginfo, ZEND_ACC_PUBLIC)
254-
PHP_ME(vtiful_chart, style, chart_style_arginfo, ZEND_ACC_PUBLIC)
255-
PHP_ME(vtiful_chart, axisNameY, chart_axis_name_arginfo, ZEND_ACC_PUBLIC)
256-
PHP_ME(vtiful_chart, axisNameX, chart_axis_name_arginfo, ZEND_ACC_PUBLIC)
257-
PHP_ME(vtiful_chart, title, chart_title_name_arginfo, ZEND_ACC_PUBLIC)
258-
PHP_ME(vtiful_chart, toResource, NULL, ZEND_ACC_PUBLIC)
274+
PHP_ME(vtiful_chart, __construct, chart_construct_arginfo, ZEND_ACC_PUBLIC)
275+
PHP_ME(vtiful_chart, series, chart_series_arginfo, ZEND_ACC_PUBLIC)
276+
PHP_ME(vtiful_chart, seriesName, chart_series_name_arginfo, ZEND_ACC_PUBLIC)
277+
PHP_ME(vtiful_chart, style, chart_style_arginfo, ZEND_ACC_PUBLIC)
278+
PHP_ME(vtiful_chart, axisNameY, chart_axis_name_arginfo, ZEND_ACC_PUBLIC)
279+
PHP_ME(vtiful_chart, axisNameX, chart_axis_name_arginfo, ZEND_ACC_PUBLIC)
280+
PHP_ME(vtiful_chart, title, chart_title_name_arginfo, ZEND_ACC_PUBLIC)
281+
PHP_ME(vtiful_chart, legendSetPosition, chart_legend_set_position_arginfo, ZEND_ACC_PUBLIC)
282+
PHP_ME(vtiful_chart, toResource, NULL, ZEND_ACC_PUBLIC)
259283
PHP_FE_END
260284
};
261285
/* }}} */
@@ -273,9 +297,38 @@ VTIFUL_STARTUP_FUNCTION(chart)
273297
chart_handlers.offset = XtOffsetOf(chart_object, zo);
274298
chart_handlers.free_obj = chart_objects_free;
275299

276-
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LINE", LXW_CHART_LINE)
277-
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN", LXW_CHART_COLUMN)
278-
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_AREA", LXW_CHART_AREA)
300+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_BAR", LXW_CHART_BAR)
301+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_BAR_STACKED", LXW_CHART_BAR_STACKED)
302+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_BAR_STACKED_PERCENT", LXW_CHART_BAR_STACKED_PERCENT)
303+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_AREA", LXW_CHART_AREA)
304+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_AREA_STACKED", LXW_CHART_AREA_STACKED)
305+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_AREA_STACKED_PERCENT", LXW_CHART_AREA_STACKED_PERCENT)
306+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LINE", LXW_CHART_LINE)
307+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN", LXW_CHART_COLUMN)
308+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN_STACKED", LXW_CHART_COLUMN_STACKED)
309+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN_STACKED_PERCENT", LXW_CHART_COLUMN_STACKED_PERCENT)
310+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_DOUGHNUT", LXW_CHART_DOUGHNUT)
311+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_PIE", LXW_CHART_PIE)
312+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER", LXW_CHART_SCATTER)
313+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_STRAIGHT", LXW_CHART_SCATTER_STRAIGHT)
314+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_STRAIGHT_WITH_MARKERS", LXW_CHART_SCATTER_STRAIGHT_WITH_MARKERS)
315+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_SMOOTH", LXW_CHART_SCATTER_SMOOTH)
316+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_SMOOTH_WITH_MARKERS", LXW_CHART_SCATTER_SMOOTH_WITH_MARKERS)
317+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_RADAR", LXW_CHART_RADAR)
318+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_RADAR_WITH_MARKERS", LXW_CHART_RADAR_WITH_MARKERS)
319+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_RADAR_FILLED", LXW_CHART_RADAR_FILLED)
320+
321+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_NONE", LXW_CHART_LEGEND_NONE)
322+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_RIGHT", LXW_CHART_LEGEND_RIGHT)
323+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_LEFT", LXW_CHART_LEGEND_LEFT)
324+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_TOP", LXW_CHART_LEGEND_TOP)
325+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_BOTTOM", LXW_CHART_LEGEND_BOTTOM)
326+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_RIGHT", LXW_CHART_LEGEND_OVERLAY_RIGHT)
327+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_LEFT", LXW_CHART_LEGEND_OVERLAY_LEFT)
328+
329+
// PECL Windows version is 0.7.7, but define in 0.7.8
330+
//REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_TOP_RIGHT", LXW_CHART_LEGEND_TOP_RIGHT)
331+
//REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_TOP_RIGHT", LXW_CHART_LEGEND_OVERLAY_TOP_RIGHT)
279332

280333
return SUCCESS;
281334
}

kernel/excel.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ PHP_METHOD(vtiful_xls, __construct)
170170
return;
171171
}
172172

173-
add_property_zval(getThis(), V_XLS_COF, config);
173+
add_property_zval_ex(getThis(), ZEND_STRL(V_XLS_COF), config);
174174
}
175175
/* }}} */
176176

@@ -377,9 +377,6 @@ PHP_METHOD(vtiful_xls, output)
377377

378378
workbook_file(&obj->write_ptr);
379379

380-
add_property_null(getThis(), V_XLS_HANDLE);
381-
add_property_null(getThis(), V_XLS_PAT);
382-
383380
ZVAL_COPY(return_value, file_path);
384381
}
385382
/* }}} */

kernel/format.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ PHP_METHOD(vtiful_format, italic)
144144
*/
145145
PHP_METHOD(vtiful_format, underline)
146146
{
147-
zend_long style;
147+
zend_long style = 0;
148148

149149
ZEND_PARSE_PARAMETERS_START(1, 1)
150150
Z_PARAM_LONG(style)
@@ -155,7 +155,7 @@ PHP_METHOD(vtiful_format, underline)
155155
format_object *obj = Z_FORMAT_P(getThis());
156156

157157
if (obj->ptr.format) {
158-
format_set_underline(obj->ptr.format, style);
158+
format_set_underline(obj->ptr.format, (uint8_t)style);
159159
}
160160
}
161161
/* }}} */
@@ -183,7 +183,7 @@ PHP_METHOD(vtiful_format, align)
183183
}
184184

185185
if (obj->ptr.format) {
186-
format_set_align(obj->ptr.format, Z_LVAL_P(arg));
186+
format_set_align(obj->ptr.format, (uint8_t)Z_LVAL_P(arg));
187187
}
188188
}
189189
}
@@ -193,7 +193,7 @@ PHP_METHOD(vtiful_format, align)
193193
*/
194194
PHP_METHOD(vtiful_format, fontColor)
195195
{
196-
zend_long color;
196+
zend_long color = 0;
197197

198198
ZEND_PARSE_PARAMETERS_START(1, 1)
199199
Z_PARAM_LONG(color)
@@ -204,7 +204,7 @@ PHP_METHOD(vtiful_format, fontColor)
204204
format_object *obj = Z_FORMAT_P(getThis());
205205

206206
if (obj->ptr.format) {
207-
format_set_font_color(obj->ptr.format, color);
207+
format_set_font_color(obj->ptr.format, (uint8_t)color);
208208
}
209209
}
210210
/* }}} */
@@ -233,7 +233,7 @@ PHP_METHOD(vtiful_format, number)
233233
*/
234234
PHP_METHOD(vtiful_format, background)
235235
{
236-
zend_long pattern, color;
236+
zend_long pattern = 0, color = 0;
237237

238238
ZEND_PARSE_PARAMETERS_START(2, 2)
239239
Z_PARAM_LONG(pattern)
@@ -245,8 +245,8 @@ PHP_METHOD(vtiful_format, background)
245245
format_object *obj = Z_FORMAT_P(getThis());
246246

247247
if (obj->ptr.format) {
248-
format_set_pattern(obj->ptr.format, pattern);
249-
format_set_bg_color(obj->ptr.format, color);
248+
format_set_pattern(obj->ptr.format, (uint8_t)pattern);
249+
format_set_bg_color(obj->ptr.format, (uint8_t)color);
250250
}
251251
}
252252
/* }}} */
@@ -303,7 +303,7 @@ PHP_METHOD(vtiful_format, wrap)
303303
*/
304304
PHP_METHOD(vtiful_format, border)
305305
{
306-
zend_long style;
306+
zend_long style = 0;
307307

308308
ZEND_PARSE_PARAMETERS_START(1, 1)
309309
Z_PARAM_LONG(style)
@@ -314,7 +314,7 @@ PHP_METHOD(vtiful_format, border)
314314
format_object *obj = Z_FORMAT_P(getThis());
315315

316316
if (obj->ptr.format) {
317-
format_set_border(obj->ptr.format, style);
317+
format_set_border(obj->ptr.format, (uint8_t)style);
318318
}
319319
}
320320
/* }}} */

kernel/write.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_wri
2525
zend_uchar value_type = Z_TYPE_P(value);
2626

2727
if (value_type == IS_STRING) {
28-
zend_string *_zstr_val = zval_get_string(value);
29-
worksheet_write_string(res->worksheet, lxw_row, lxw_col, ZSTR_VAL(_zstr_val), format_handle);
30-
zend_string_release(_zstr_val);
28+
worksheet_write_string(res->worksheet, lxw_row, lxw_col, ZSTR_VAL(zval_get_string(value)), format_handle);
3129
return;
3230
}
3331

@@ -37,12 +35,12 @@ void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_wri
3735

3836
format_set_num_format(value_format, ZSTR_VAL(format));
3937

40-
worksheet_write_number(res->worksheet, lxw_row, lxw_col, zval_get_long(value), value_format);
38+
worksheet_write_number(res->worksheet, lxw_row, lxw_col, (double)zval_get_long(value), value_format);
4139
return;
4240
}
4341

4442
if (format == NULL && format_handle != NULL) {
45-
worksheet_write_number(res->worksheet, lxw_row, lxw_col, zval_get_long(value), format_handle);
43+
worksheet_write_number(res->worksheet, lxw_row, lxw_col, (double)zval_get_long(value), format_handle);
4644
return;
4745
}
4846

@@ -52,11 +50,11 @@ void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_wri
5250
format_copy(value_format, format_handle);
5351
format_set_num_format(value_format, ZSTR_VAL(format));
5452

55-
worksheet_write_number(res->worksheet, lxw_row, lxw_col, zval_get_long(value), value_format);
53+
worksheet_write_number(res->worksheet, lxw_row, lxw_col, (double)zval_get_long(value), value_format);
5654
return;
5755
}
5856

59-
worksheet_write_number(res->worksheet, lxw_row, lxw_col, zval_get_long(value), NULL);
57+
worksheet_write_number(res->worksheet, lxw_row, lxw_col, (double)zval_get_long(value), NULL);
6058
}
6159

6260
if (value_type == IS_DOUBLE) {
@@ -84,7 +82,7 @@ void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_wri
8482
return;
8583
}
8684

87-
worksheet_write_number(res->worksheet, row, columns, zval_get_double(value), NULL);
85+
worksheet_write_number(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, zval_get_double(value), NULL);
8886
return;
8987
}
9088
}
@@ -162,7 +160,7 @@ void format_copy(lxw_format *new_format, lxw_format *other_format)
162160

163161
void url_writer(zend_long row, zend_long columns, xls_resource_write_t *res, zend_string *url, lxw_format *format)
164162
{
165-
worksheet_write_url(res->worksheet, row, columns, ZSTR_VAL(url), format);
163+
worksheet_write_url(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, ZSTR_VAL(url), format);
166164
}
167165

168166
/*
@@ -172,20 +170,20 @@ void image_writer(zval *value, zend_long row, zend_long columns, double width, d
172170
{
173171
lxw_image_options options = {.x_scale = width, .y_scale = height};
174172

175-
worksheet_insert_image_opt(res->worksheet, row, columns, ZSTR_VAL(zval_get_string(value)), &options);
173+
worksheet_insert_image_opt(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, ZSTR_VAL(zval_get_string(value)), &options);
176174
}
177175

178176
/*
179177
* Write the image to the file
180178
*/
181179
void formula_writer(zval *value, zend_long row, zend_long columns, xls_resource_write_t *res)
182180
{
183-
worksheet_write_formula(res->worksheet, row, columns, ZSTR_VAL(zval_get_string(value)), NULL);
181+
worksheet_write_formula(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, ZSTR_VAL(zval_get_string(value)), NULL);
184182
}
185183

186184
void chart_writer(zend_long row, zend_long columns, xls_resource_chart_t *chart_resource, xls_resource_write_t *res)
187185
{
188-
worksheet_insert_chart(res->worksheet, row, columns, chart_resource->chart);
186+
worksheet_insert_chart(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, chart_resource->chart);
189187
}
190188

191189
/*

tests/multiple_file.phpt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
--TEST--
2+
Check for vtiful presence
3+
--SKIPIF--
4+
<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
5+
--FILE--
6+
<?php
7+
$config = [
8+
'path' => './tests',
9+
];
10+
11+
$lastFilePath = NULL;
12+
13+
for ($index = 0; $index < 100; $index++) {
14+
$fileObject = new \Vtiful\Kernel\Excel($config);
15+
16+
$fileObject = $fileObject->fileName('tutorial' . $index . '.xlsx');
17+
$fileHandle = $fileObject->getHandle();
18+
19+
$format = new \Vtiful\Kernel\Format($fileHandle);
20+
$alignStyle = $format->align(
21+
\Vtiful\Kernel\Format::FORMAT_ALIGN_CENTER,
22+
\Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_CENTER
23+
)->toResource();
24+
25+
$lastFilePath = $fileObject->header(['name', 'age'])
26+
->data([
27+
['viest', 21],
28+
['wjx', 21],
29+
])
30+
->setRow('A1', 50, $alignStyle)
31+
->setRow('A2:A3', 50, $alignStyle)
32+
->output();
33+
}
34+
35+
var_dump($lastFilePath);
36+
?>
37+
--CLEAN--
38+
<?php
39+
for ($index = 0; $index < 100; $index++) {
40+
@unlink(__DIR__ . '/tutorial' . $index . '.xlsx');
41+
}
42+
?>
43+
--EXPECT--
44+
string(23) "./tests/tutorial99.xlsx"

0 commit comments

Comments
 (0)