Skip to content

Commit fd60b0a

Browse files
authored
Merge pull request #270 from viest/dev
Feat: Cell comment
2 parents 5be538c + e59fc8f commit fd60b0a

File tree

16 files changed

+317
-143
lines changed

16 files changed

+317
-143
lines changed

.gitmodules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[submodule "library/libxlsxwriter"]
22
path = library/libxlsxwriter
33
url = https://github.com/jmcnamara/libxlsxwriter.git
4-
branch = RELEASE_0.7.9
4+
branch = RELEASE_0.9.4
55
[submodule "library/libexpat"]
66
path = library/libexpat
77
url = https://github.com/libexpat/libexpat.git

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ branches:
3535
only:
3636
- master
3737
- dev
38+
- bundle
3839

3940
script:
4041
- ./travis/run-test.sh

config.m4

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,11 @@ if test "$PHP_XLSWRITER" != "no"; then
3737

3838
libxlsxwriter_sources="
3939
library/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c \
40+
library/libxlsxwriter/third_party/md5/md5.c \
4041
library/libxlsxwriter/src/app.c \
4142
library/libxlsxwriter/src/chart.c \
43+
library/libxlsxwriter/src/chartsheet.c \
44+
library/libxlsxwriter/src/comment.c \
4245
library/libxlsxwriter/src/content_types.c \
4346
library/libxlsxwriter/src/core.c \
4447
library/libxlsxwriter/src/custom.c \
@@ -51,6 +54,7 @@ if test "$PHP_XLSWRITER" != "no"; then
5154
library/libxlsxwriter/src/styles.c \
5255
library/libxlsxwriter/src/theme.c \
5356
library/libxlsxwriter/src/utility.c \
57+
library/libxlsxwriter/src/vml.c \
5458
library/libxlsxwriter/src/workbook.c \
5559
library/libxlsxwriter/src/worksheet.c \
5660
library/libxlsxwriter/src/xmlwriter.c \
@@ -85,32 +89,11 @@ if test "$PHP_XLSWRITER" != "no"; then
8589
AC_MSG_ERROR([libxlsxwriter library not found])
8690
else
8791
PHP_ADD_INCLUDE($XLSXWRITER_DIR/include)
88-
PHP_CHECK_LIBRARY(xlsxwriter, worksheet_write_string,
92+
PHP_CHECK_LIBRARY(xlsxwriter, lxw_worksheet_find_cell_in_row,
8993
[
9094
PHP_ADD_LIBRARY_WITH_PATH(xlsxwriter, $i/$PHP_LIBDIR, XLSWRITER_SHARED_LIBADD)
9195
],[
92-
AC_MSG_ERROR([Wrong libxlsxwriter version or library not found])
93-
],[
94-
-L$XLSXWRITER_DIR/$PHP_LIBDIR -lm
95-
])
96-
PHP_CHECK_LIBRARY(xlsxwriter, lxw_version,
97-
[
98-
AC_DEFINE(HAVE_LXW_VERSION, 1, [ lxw_version available in 0.7.9 ])
99-
],[
100-
],[
101-
-L$XLSXWRITER_DIR/$PHP_LIBDIR -lm
102-
])
103-
PHP_CHECK_LIBRARY(xlsxwriter, lxw_chartsheet_new,
104-
[
105-
AC_DEFINE(HAVE_LXW_CHARTSHEET_NEW, 1, [ lxw_chartsheet_new available in 0.8.0 ])
106-
],[
107-
],[
108-
-L$XLSXWRITER_DIR/$PHP_LIBDIR -lm
109-
])
110-
PHP_CHECK_LIBRARY(xlsxwriter, workbook_add_vba_project,
111-
[
112-
AC_DEFINE(HAVE_WORKBOOK_ADD_VBA_PROJECT, 1, [ workbook_add_vba_project available in 0.8.7 ])
113-
],[
96+
AC_MSG_ERROR([Wrong libxlsxwriter version or library not found, 0.9.3 required])
11497
],[
11598
-L$XLSXWRITER_DIR/$PHP_LIBDIR -lm
11699
])
@@ -129,23 +112,6 @@ if test "$PHP_XLSWRITER" != "no"; then
129112
xls_writer_sources="$xls_writer_sources $libxlsxwriter_sources"
130113
PHP_ADD_INCLUDE([$srcdir/library/libxlsxwriter/include])
131114

132-
XLSXWRITER_VERSION=`$EGREP "define LXW_VERSION" $srcdir/library/include/libxlsxwriter/xlsxwriter.h | $SED -e 's/[[^0-9\.]]//g'`
133-
134-
if test `echo $XLSXWRITER_VERSION | $SED -e 's/[[^0-9]]/ /g' | $AWK '{print $1*10000 + $2*100 + $3}'` -ge 709; then
135-
AC_DEFINE(HAVE_LXW_VERSION, 1, [ lxw_version available in 0.7.9 ])
136-
fi
137-
138-
if test `echo $XLSXWRITER_VERSION | $SED -e 's/[[^0-9]]/ /g' | $AWK '{print $1*10000 + $2*100 + $3}'` -ge 800; then
139-
AC_DEFINE(HAVE_LXW_CHARTSHEET_NEW, 1, [ lxw_chartsheet_new available in 0.8.0 ])
140-
fi
141-
142-
if test `echo $XLSXWRITER_VERSION | $SED -e 's/[[^0-9]]/ /g' | $AWK '{print $1*10000 + $2*100 + $3}'` -ge 807; then
143-
AC_DEFINE(HAVE_WORKBOOK_ADD_VBA_PROJECT, 1, [ workbook_add_vba_project available in 0.8.7 ])
144-
fi
145-
146-
if test `echo $XLSXWRITER_VERSION | $SED -e 's/[[^0-9]]/ /g' | $AWK '{print $1*10000 + $2*100 + $3}'` -ge 808; then
147-
AC_DEFINE(HAVE_LXW_OPEN, 1, [ lxw_fopen available in 0.8.8 ])
148-
fi
149115
dnl see library/CMakeLists.txt
150116
LIBOPT="-DNOCRYPT -DNOUNCRYPT"
151117
fi
@@ -215,6 +181,7 @@ if test "$PHP_XLSWRITER" != "no"; then
215181
PHP_ADD_BUILD_DIR([$abs_builddir/library/libxlsxwriter/src])
216182
PHP_ADD_BUILD_DIR([$abs_builddir/library/libxlsxwriter/third_party/minizip])
217183
PHP_ADD_BUILD_DIR([$abs_builddir/library/libxlsxwriter/third_party/tmpfileplus])
184+
PHP_ADD_BUILD_DIR([$abs_builddir/library/libxlsxwriter/third_party/md5])
218185

219186
PHP_ADD_BUILD_DIR([$abs_builddir/library/libexpat/expat/lib])
220187
PHP_ADD_BUILD_DIR([$abs_builddir/library/libxlsxio/lib])

config.w32

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,21 @@ if (PHP_XLSWRITER != "no") {
3636
mztools.c \
3737
unzip.c \
3838
zip.c \
39-
", "xlswriter");
39+
", "xlswriter", "libxlsxwriter");
4040

4141
ADD_SOURCES(configure_module_dirname + "\\library\\libxlsxwriter\\third_party\\tmpfileplus", "\
4242
tmpfileplus.c \
43-
", "xlswriter");
43+
", "xlswriter", "libxlsxwriter");
44+
45+
ADD_SOURCES(configure_module_dirname + "\\library\\libxlsxwriter\\third_party\\md5", "\
46+
md5.c \
47+
", "xlswriter", "libxlsxwriter");
4448

4549
ADD_SOURCES(configure_module_dirname + "\\library\\libxlsxwriter\\src", "\
4650
app.c \
4751
chart.c \
52+
chartsheet.c \
53+
comment.c \
4854
content_types.c \
4955
core.c \
5056
custom.c \
@@ -57,6 +63,7 @@ if (PHP_XLSWRITER != "no") {
5763
styles.c \
5864
theme.c \
5965
utility.c \
66+
vml.c \
6067
workbook.c \
6168
worksheet.c \
6269
xmlwriter.c \
@@ -69,12 +76,12 @@ if (PHP_XLSWRITER != "no") {
6976
xmltok.c \
7077
xmltok_impl.c \
7178
xmltok_ns.c \
72-
", "xlswriter");
79+
", "xlswriter", "libexpat");
7380

7481
ADD_SOURCES(configure_module_dirname + "\\library\\libxlsxio\\lib", "\
7582
xlsxio_read.c \
7683
xlsxio_read_sharedstrings.c \
77-
", "xlswriter");
84+
", "xlswriter", "libxlsxio");
7885
} else {
7986
WARNING("xlswriter not enabled, xlsxwriter.lib or headers not found");
8087
}

include/help.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#ifndef PHP_EXT_XLS_EXPORT_HELP_H
1414
#define PHP_EXT_XLS_EXPORT_HELP_H
1515

16+
unsigned int file_exists(const char *path);
17+
unsigned int directory_exists(const char *path);
1618
zend_long date_double_to_timestamp(double value);
1719

1820
#endif //PHP_EXT_XLS_EXPORT_HELP_H

include/xlswriter.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,12 @@ STATIC int _compare_defined_names(lxw_defined_name *a, lxw_defined_name *b);
193193

194194
STATIC void _prepare_drawings(lxw_workbook *self);
195195
STATIC void _add_chart_cache_data(lxw_workbook *self);
196+
STATIC void _prepare_vml(lxw_workbook *self);
196197
STATIC void _prepare_defined_names(lxw_workbook *self);
197198
STATIC void _populate_range(lxw_workbook *self, lxw_series_range *range);
198199
STATIC void _populate_range_dimensions(lxw_workbook *self, lxw_series_range *range);
199200

201+
void comment_show(xls_resource_write_t *res);
200202
void zoom(xls_resource_write_t *res, zend_long zoom);
201203
void gridlines(xls_resource_write_t *res, zend_long option);
202204
void auto_filter(zend_string *range, xls_resource_write_t *res);
@@ -206,6 +208,7 @@ void freeze_panes(xls_resource_write_t *res, zend_long row, zend_long column);
206208
void set_row(zend_string *range, double height, xls_resource_write_t *res, lxw_format *format);
207209
void set_column(zend_string *range, double width, xls_resource_write_t *res, lxw_format *format);
208210
void merge_cells(zend_string *range, zval *value, xls_resource_write_t *res, lxw_format *format);
211+
void comment_writer(zend_string *comment, zend_long row, zend_long columns, xls_resource_write_t *res);
209212
void url_writer(zend_long row, zend_long columns, xls_resource_write_t *res, zend_string *url, lxw_format *format);
210213
void call_object_method(zval *object, const char *function_name, uint32_t param_count, zval *params, zval *ret_val);
211214
void chart_writer(zend_long row, zend_long columns, xls_resource_chart_t *chart_resource, xls_resource_write_t *res);

kernel/chart.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,6 @@ VTIFUL_STARTUP_FUNCTION(chart)
311311
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN_STACKED", LXW_CHART_COLUMN_STACKED)
312312
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_COLUMN_STACKED_PERCENT", LXW_CHART_COLUMN_STACKED_PERCENT)
313313
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_DOUGHNUT", LXW_CHART_DOUGHNUT)
314-
#if defined(LXW_VERSION_ID) && LXW_VERSION_ID >= 95
315-
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LINE_STACKED", LXW_CHART_LINE_STACKED)
316-
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LINE_STACKED_PERCENT", LXW_CHART_LINE_STACKED_PERCENT)
317-
#endif
318314
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_PIE", LXW_CHART_PIE)
319315
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER", LXW_CHART_SCATTER)
320316
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_SCATTER_STRAIGHT", LXW_CHART_SCATTER_STRAIGHT)
@@ -333,10 +329,15 @@ VTIFUL_STARTUP_FUNCTION(chart)
333329
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_RIGHT", LXW_CHART_LEGEND_OVERLAY_RIGHT)
334330
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_LEFT", LXW_CHART_LEGEND_OVERLAY_LEFT)
335331

332+
#if defined(LXW_VERSION_ID) && LXW_VERSION_ID >= 95
333+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LINE_STACKED", LXW_CHART_LINE_STACKED)
334+
REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LINE_STACKED_PERCENT", LXW_CHART_LINE_STACKED_PERCENT)
335+
#endif
336+
336337
// PECL Windows version is 0.7.7, but define in 0.7.8
337338
//REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_TOP_RIGHT", LXW_CHART_LEGEND_TOP_RIGHT)
338339
//REGISTER_CLASS_CONST_LONG(vtiful_chart_ce, "CHART_LEGEND_OVERLAY_TOP_RIGHT", LXW_CHART_LEGEND_OVERLAY_TOP_RIGHT)
339340

340341
return SUCCESS;
341342
}
342-
/* }}} */
343+
/* }}} */

kernel/excel.c

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
#include "xlswriter.h"
1414
#include "ext/date/php_date.h"
15-
#include "ext/standard/php_filestat.h"
1615

1716
zend_class_entry *vtiful_xls_ce;
1817

@@ -153,6 +152,15 @@ ZEND_BEGIN_ARG_INFO_EX(xls_insert_formula_arginfo, 0, 0, 3)
153152
ZEND_ARG_INFO(0, format_handle)
154153
ZEND_END_ARG_INFO()
155154

155+
ZEND_BEGIN_ARG_INFO_EX(xls_insert_comment_arginfo, 0, 0, 3)
156+
ZEND_ARG_INFO(0, row)
157+
ZEND_ARG_INFO(0, column)
158+
ZEND_ARG_INFO(0, comment)
159+
ZEND_END_ARG_INFO()
160+
161+
ZEND_BEGIN_ARG_INFO_EX(xls_show_comment_arginfo, 0, 0, 0)
162+
ZEND_END_ARG_INFO()
163+
156164
ZEND_BEGIN_ARG_INFO_EX(xls_auto_filter_arginfo, 0, 0, 1)
157165
ZEND_ARG_INFO(0, range)
158166
ZEND_END_ARG_INFO()
@@ -278,7 +286,7 @@ PHP_METHOD(vtiful_xls, __construct)
278286
PHP_METHOD(vtiful_xls, fileName)
279287
{
280288
char *sheet_name = NULL;
281-
zval file_path, dir_exists, *dir_path = NULL;
289+
zval file_path, *dir_path = NULL;
282290
zend_string *zs_file_name = NULL, *zs_sheet_name = NULL;
283291

284292
ZEND_PARSE_PARAMETERS_START(1, 2)
@@ -287,16 +295,13 @@ PHP_METHOD(vtiful_xls, fileName)
287295
Z_PARAM_STR(zs_sheet_name)
288296
ZEND_PARSE_PARAMETERS_END();
289297

290-
ZVAL_NULL(&dir_exists);
291298
ZVAL_COPY(return_value, getThis());
292299

293300
GET_CONFIG_PATH(dir_path, vtiful_xls_ce, return_value);
294301

295-
php_stat(ZSTR_VAL(Z_STR_P(dir_path)), strlen(ZSTR_VAL(Z_STR_P(dir_path))), FS_IS_DIR, &dir_exists);
296-
297-
if (Z_TYPE(dir_exists) == IS_FALSE) {
298-
zval_ptr_dtor(&dir_exists);
302+
if(directory_exists(ZSTR_VAL(Z_STR_P(dir_path))) == XLSWRITER_FALSE) {
299303
zend_throw_exception(vtiful_exception_ce, "Configure 'path' directory does not exist", 121);
304+
return;
300305
}
301306

302307
xls_object *obj = Z_XLS_P(getThis());
@@ -315,8 +320,6 @@ PHP_METHOD(vtiful_xls, fileName)
315320

316321
zval_ptr_dtor(&file_path);
317322
}
318-
319-
zval_ptr_dtor(&dir_exists);
320323
}
321324
/* }}} */
322325

@@ -711,7 +714,7 @@ PHP_METHOD(vtiful_xls, insertImage)
711714
}
712715
/* }}} */
713716

714-
/** {{{ \Vtiful\Kernel\Excel::insertImage(int $row, int $column, string $imagePath)
717+
/** {{{ \Vtiful\Kernel\Excel::insertFormula(int $row, int $column, string $formula)
715718
*/
716719
PHP_METHOD(vtiful_xls, insertFormula)
717720
{
@@ -745,6 +748,43 @@ PHP_METHOD(vtiful_xls, insertFormula)
745748
}
746749
/* }}} */
747750

751+
/** {{{ \Vtiful\Kernel\Excel::insertComment(int $row, int $column, string $comment)
752+
*/
753+
PHP_METHOD(vtiful_xls, insertComment)
754+
{
755+
zend_string *comment = NULL;
756+
zend_long row = 0, column = 0;
757+
758+
ZEND_PARSE_PARAMETERS_START(3, 3)
759+
Z_PARAM_LONG(row)
760+
Z_PARAM_LONG(column)
761+
Z_PARAM_STR(comment)
762+
ZEND_PARSE_PARAMETERS_END();
763+
764+
ZVAL_COPY(return_value, getThis());
765+
766+
xls_object *obj = Z_XLS_P(getThis());
767+
768+
WORKBOOK_NOT_INITIALIZED(obj);
769+
770+
comment_writer(comment, row, column, &obj->write_ptr);
771+
}
772+
/* }}} */
773+
774+
/** {{{ \Vtiful\Kernel\Excel::showComment()
775+
*/
776+
PHP_METHOD(vtiful_xls, showComment)
777+
{
778+
ZVAL_COPY(return_value, getThis());
779+
780+
xls_object *obj = Z_XLS_P(getThis());
781+
782+
WORKBOOK_NOT_INITIALIZED(obj);
783+
784+
comment_show(&obj->write_ptr);
785+
}
786+
/* }}} */
787+
748788
/** {{{ \Vtiful\Kernel\Excel::autoFilter(int $rowStart, int $rowEnd, int $columnStart, int $columnEnd)
749789
*/
750790
PHP_METHOD(vtiful_xls, autoFilter)
@@ -1288,6 +1328,8 @@ zend_function_entry xls_methods[] = {
12881328
PHP_ME(vtiful_xls, insertUrl, xls_insert_url_arginfo, ZEND_ACC_PUBLIC)
12891329
PHP_ME(vtiful_xls, insertImage, xls_insert_image_arginfo, ZEND_ACC_PUBLIC)
12901330
PHP_ME(vtiful_xls, insertFormula, xls_insert_formula_arginfo, ZEND_ACC_PUBLIC)
1331+
PHP_ME(vtiful_xls, insertComment, xls_insert_comment_arginfo, ZEND_ACC_PUBLIC)
1332+
PHP_ME(vtiful_xls, showComment, xls_show_comment_arginfo, ZEND_ACC_PUBLIC)
12911333
PHP_ME(vtiful_xls, mergeCells, xls_merge_cells_arginfo, ZEND_ACC_PUBLIC)
12921334
PHP_ME(vtiful_xls, setColumn, xls_set_column_arginfo, ZEND_ACC_PUBLIC)
12931335
PHP_ME(vtiful_xls, setRow, xls_set_row_arginfo, ZEND_ACC_PUBLIC)

kernel/help.c

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
#include "xlswriter.h"
1414
#include "ext/date/php_date.h"
1515
#include "ext/standard/php_math.h"
16+
#include "ext/standard/php_filestat.h"
1617

18+
/* {{{ */
1719
zend_long date_double_to_timestamp(double value) {
1820
double days, partDay, hours, minutes, seconds;
1921

@@ -56,4 +58,35 @@ zend_long date_double_to_timestamp(double value) {
5658
zval_ptr_dtor(&_format_result);
5759

5860
return timestamp;
59-
}
61+
}
62+
/* }}} */
63+
64+
/* {{{ */
65+
unsigned int directory_exists(const char *path) {
66+
zval dir_exists;
67+
php_stat(path, strlen(path), FS_IS_DIR, &dir_exists);
68+
69+
if (Z_TYPE(dir_exists) == IS_FALSE) {
70+
zval_ptr_dtor(&dir_exists);
71+
return XLSWRITER_FALSE;
72+
}
73+
74+
zval_ptr_dtor(&dir_exists);
75+
return XLSWRITER_TRUE;
76+
}
77+
/* }}} */
78+
79+
/* {{{ */
80+
unsigned int file_exists(const char *path) {
81+
zval file_exists;
82+
php_stat(path, strlen(path), FS_IS_FILE, &file_exists);
83+
84+
if (Z_TYPE(file_exists) == IS_FALSE) {
85+
zval_ptr_dtor(&file_exists);
86+
return XLSWRITER_FALSE;
87+
}
88+
89+
zval_ptr_dtor(&file_exists);
90+
return XLSWRITER_TRUE;
91+
}
92+
/* }}} */

0 commit comments

Comments
 (0)