Browse Source

Merge pull request #180 from viest/dev

Merge dev branch
viest 5 years ago
parent
commit
25755e66a3
9 changed files with 184 additions and 20 deletions
  1. 35 2
      ide-helper/helper.php
  2. 13 10
      include/xlswriter.h
  3. 25 0
      kernel/excel.c
  4. 32 6
      kernel/format.c
  5. 8 0
      kernel/write.c
  6. 1 0
      package.xml
  7. 2 2
      tests/format_background.phpt
  8. 37 0
      tests/format_font.phpt
  9. 31 0
      tests/freeze_panes.phpt

+ 35 - 2
ide-helper/helper.php

@@ -393,6 +393,25 @@ class Excel
     {
         //
     }
+
+    /**
+     * Freeze panes
+     *
+     * freezePanes(1, 0); // Freeze the first row.
+     * freezePanes(0, 1); // Freeze the first column.
+     * freezePanes(1, 1); // Freeze first row/column.
+     *
+     * @param int $row
+     * @param int $column
+     *
+     * @return $this
+     *
+     * @author viest
+     */
+    public function freezePanes(int $row, int $column): self
+    {
+        return $this;
+    }
 }
 
 /**
@@ -577,6 +596,20 @@ class Format
         return $this;
     }
 
+    /**
+     * Font
+     *
+     * @param string $fontName
+     *
+     * @return Format
+     *
+     * @author viest
+     */
+    public function font(string $fontName): self
+    {
+        return $this;
+    }
+
     /**
      * Font size
      *
@@ -620,14 +653,14 @@ class Format
     /**
      * Cell background
      *
-     * @param int $pattern const PATTERN_****
      * @param int $color   const COLOR_****
+     * @param int $pattern const PATTERN_****
      *
      * @return Format
      *
      * @author viest
      */
-    public function background(int $pattern, int $color): self
+    public function background(int $color, int $pattern = self::PATTERN_SOLID): self
     {
         return $this;
     }

+ 13 - 10
include/xlswriter.h

@@ -161,27 +161,30 @@ 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);
 
-STATIC void _prepare_defined_names(lxw_workbook *self);
+STATIC int  _compare_defined_names(lxw_defined_name *a, lxw_defined_name *b);
+
 STATIC void _prepare_drawings(lxw_workbook *self);
 STATIC void _add_chart_cache_data(lxw_workbook *self);
-STATIC int  _compare_defined_names(lxw_defined_name *a, lxw_defined_name *b);
+STATIC void _prepare_defined_names(lxw_workbook *self);
 STATIC void _populate_range(lxw_workbook *self, lxw_series_range *range);
 STATIC void _populate_range_dimensions(lxw_workbook *self, lxw_series_range *range);
 
-void format_copy(lxw_format *new_format, lxw_format *other_format);
-void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_write_t *res, zend_string *format, lxw_format *format_handle);
-void chart_writer(zend_long row, zend_long columns, xls_resource_chart_t *chart_resource, xls_resource_write_t *res);
-void url_writer(zend_long row, zend_long columns, xls_resource_write_t *res, zend_string *url, lxw_format *format);
-void image_writer(zval *value, zend_long row, zend_long columns, double width, double height, xls_resource_write_t *res);
-void formula_writer(zval *value, zend_long row, zend_long columns, xls_resource_write_t *res);
 void auto_filter(zend_string *range, xls_resource_write_t *res);
+void format_copy(lxw_format *new_format, lxw_format *other_format);
+void xls_file_path(zend_string *file_name, zval *dir_path, zval *file_path);
+void freeze_panes(xls_resource_write_t *res, zend_long row, zend_long column);
 void merge_cells(zend_string *range, zend_string *value, xls_resource_write_t *res);
-void set_column(zend_string *range, double width, xls_resource_write_t *res, lxw_format *format);
+void formula_writer(zval *value, zend_long row, zend_long columns, xls_resource_write_t *res);
 void set_row(zend_string *range, double height, xls_resource_write_t *res, lxw_format *format);
+void set_column(zend_string *range, double width, xls_resource_write_t *res, lxw_format *format);
+void url_writer(zend_long row, zend_long columns, xls_resource_write_t *res, zend_string *url, lxw_format *format);
+void chart_writer(zend_long row, zend_long columns, xls_resource_chart_t *chart_resource, xls_resource_write_t *res);
 void worksheet_set_rows(lxw_row_t start, lxw_row_t end, double height, xls_resource_write_t *res, lxw_format *format);
+void image_writer(zval *value, zend_long row, zend_long columns, double width, double height, xls_resource_write_t *res);
+void type_writer(zval *value, zend_long row, zend_long columns, xls_resource_write_t *res, zend_string *format, lxw_format *format_handle);
+
 lxw_error workbook_file(xls_resource_write_t *self);
 
-void xls_file_path(zend_string *file_name, zval *dir_path, zval *file_path);
 zend_string* str_pick_up(zend_string *left, char *right);
 
 #endif

+ 25 - 0
kernel/excel.c

@@ -179,6 +179,11 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_INFO_EX(xls_string_to_index, 0, 0, 1)
                 ZEND_ARG_INFO(0, index)
 ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(xls_freeze_panes_arginfo, 0, 0, 2)
+                ZEND_ARG_INFO(0, row)
+                ZEND_ARG_INFO(0, column)
+ZEND_END_ARG_INFO()
 /* }}} */
 
 /** {{{ \Vtiful\Kernel\xls::__construct(array $config)
@@ -718,6 +723,25 @@ PHP_METHOD(vtiful_xls, setRow)
 }
 /* }}} */
 
+/** {{{ \Vtiful\Kernel\xls::freezePanes(int $row, int $column)
+ */
+PHP_METHOD(vtiful_xls, freezePanes)
+{
+    zend_long row = 0, column = 0;
+
+    ZEND_PARSE_PARAMETERS_START(2, 2)
+            Z_PARAM_LONG(row)
+            Z_PARAM_LONG(column)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    xls_object *obj = Z_XLS_P(getThis());
+
+    freeze_panes(&obj->write_ptr, row, column);
+}
+/* }}} */
+
 /** {{{ \Vtiful\Kernel\xls::columnIndexFromString(string $index)
  */
 PHP_METHOD(vtiful_xls, columnIndexFromString)
@@ -934,6 +958,7 @@ zend_function_entry xls_methods[] = {
         PHP_ME(vtiful_xls, mergeCells,    xls_merge_cells_arginfo,    ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, setColumn,     xls_set_column_arginfo,     ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, setRow,        xls_set_row_arginfo,        ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_xls, freezePanes,   xls_freeze_panes_arginfo,   ZEND_ACC_PUBLIC)
 
         PHP_ME(vtiful_xls, columnIndexFromString,  xls_index_to_string, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
         PHP_ME(vtiful_xls, stringFromColumnIndex,  xls_string_to_index, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)

+ 32 - 6
kernel/format.c

@@ -87,6 +87,10 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_INFO_EX(format_border_arginfo, 0, 0, 1)
                 ZEND_ARG_INFO(0, style)
 ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(format_font_arginfo, 0, 0, 1)
+                ZEND_ARG_INFO(0, font)
+ZEND_END_ARG_INFO()
 /* }}} */
 
 /** {{{ \Vtiful\Kernel\Format::__construct()
@@ -229,15 +233,16 @@ PHP_METHOD(vtiful_format, number)
 }
 /* }}} */
 
-/** {{{ \Vtiful\Kernel\Format::background(int $pattern, int $color)
+/** {{{ \Vtiful\Kernel\Format::background(int $color [, int $pattern = \Vtiful\Kernel\Format::PATTERN_SOLID])
  */
 PHP_METHOD(vtiful_format, background)
 {
-    zend_long pattern = 0, color = 0;
+    zend_long pattern = LXW_PATTERN_SOLID, color = 0;
 
-    ZEND_PARSE_PARAMETERS_START(2, 2)
-            Z_PARAM_LONG(pattern)
+    ZEND_PARSE_PARAMETERS_START(1, 2)
             Z_PARAM_LONG(color)
+            Z_PARAM_OPTIONAL
+            Z_PARAM_LONG(pattern)
     ZEND_PARSE_PARAMETERS_END();
 
     ZVAL_COPY(return_value, getThis());
@@ -245,8 +250,8 @@ PHP_METHOD(vtiful_format, background)
     format_object *obj = Z_FORMAT_P(getThis());
 
     if (obj->ptr.format) {
-        format_set_pattern(obj->ptr.format, (uint8_t)pattern);
-        format_set_bg_color(obj->ptr.format, (uint8_t)color);
+        format_set_pattern(obj->ptr.format, pattern);
+        format_set_bg_color(obj->ptr.format, color);
     }
 }
 /* }}} */
@@ -271,6 +276,26 @@ PHP_METHOD(vtiful_format, fontSize)
 }
 /* }}} */
 
+/** {{{ \Vtiful\Kernel\Format::font(string $fontName)
+ */
+PHP_METHOD(vtiful_format, font)
+{
+    zend_string *font_name = NULL;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_STR(font_name)
+    ZEND_PARSE_PARAMETERS_END();
+
+    ZVAL_COPY(return_value, getThis());
+
+    format_object *obj = Z_FORMAT_P(getThis());
+
+    if (obj->ptr.format) {
+        format_set_font_name(obj->ptr.format, ZSTR_VAL(font_name));
+    }
+}
+/* }}} */
+
 /** {{{ \Vtiful\Kernel\Format::strikeout()
  */
 PHP_METHOD(vtiful_format, strikeout)
@@ -341,6 +366,7 @@ zend_function_entry format_methods[] = {
         PHP_ME(vtiful_format, align,         format_align_arginfo,      ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_format, number,        format_number_arginfo,     ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_format, fontColor,     format_color_arginfo,      ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_format, font,          format_font_arginfo,       ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_format, fontSize,      format_size_arginfo,       ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_format, strikeout,     NULL,                      ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_format, underline,     format_underline_arginfo,  ZEND_ACC_PUBLIC)

+ 8 - 0
kernel/write.c

@@ -237,6 +237,14 @@ void worksheet_set_rows(lxw_row_t start, lxw_row_t end, double height, xls_resou
     }
 }
 
+/*
+ * Set freeze panes
+ */
+void freeze_panes(xls_resource_write_t *res, zend_long row, zend_long column)
+{
+    worksheet_freeze_panes(res->worksheet, row, column);
+}
+
 /*
  * Call finalization code and close file.
  */

+ 1 - 0
package.xml

@@ -170,6 +170,7 @@
    <file md5sum="4dfaa3f81e9c7138aca39da99a67f270" name="tests/format_font_strikeout.phpt" role="test" />
    <file md5sum="c32a045fc8d621cbbaf8f00008ddb8b5" name="tests/format_number.phpt" role="test" />
    <file md5sum="f9c233fedf10a2bbb2ac5534cf8f20ef" name="tests/format_wrap.phpt" role="test" />
+   <file name="tests/freeze_panes.phpt" role="test" />
    <file md5sum="b4c6f2949c46ab89099e5f971f152a1f" name="tests/image_no_styles.phpt" role="test" />
    <file md5sum="fb81df82009c851b96a6124972ccc3d1" name="tests/image_width_height_styles.phpt" role="test" />
    <file md5sum="73521b6a1cb84ba3c7730470b836368f" name="tests/insert_date_custom_format.phpt" role="test" />

+ 2 - 2
tests/format_background.phpt

@@ -15,8 +15,8 @@ $fileHandle = $fileObject->getHandle();
 
 $format = new \Vtiful\Kernel\Format($fileHandle);
 $style  = $format->background(
-	\Vtiful\Kernel\Format::PATTERN_LIGHT_UP,
-	\Vtiful\Kernel\Format::COLOR_RED
+	\Vtiful\Kernel\Format::COLOR_RED,
+	\Vtiful\Kernel\Format::PATTERN_LIGHT_UP
 )->toResource();
 
 $filePath = $fileObject->header(['name', 'age'])

+ 37 - 0
tests/format_font.phpt

@@ -0,0 +1,37 @@
+--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);
+$fontStyle = $format->font('Calibri')->toResource();
+
+// Local Test
+// $fontStyle = $format->font('华文楷体')->toResource();
+
+$filePath = $fileObject->header(['name', 'age'])
+    ->data([
+        ['viest', 21],
+        ['wjx',   21]
+    ])
+    ->setRow('A1', 50, $fontStyle)
+    ->output();
+
+var_dump($filePath);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+string(21) "./tests/tutorial.xlsx"

+ 31 - 0
tests/freeze_panes.phpt

@@ -0,0 +1,31 @@
+--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();
+
+$filePath = $fileObject->freezePanes(1, 0)
+    ->header(['name', 'age']);
+
+for ($index = 0; $index < 100; $index++) {
+    $fileObject->insertText($index + 1, 0, 'wjx');
+    $fileObject->insertText($index + 1, 1, 21);
+}
+
+var_dump($fileObject->output());
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+string(21) "./tests/tutorial.xlsx"