Kaynağa Gözat

Feat: mergeCells type writer

viest 5 yıl önce
ebeveyn
işleme
f49a78f7f4
4 değiştirilmiş dosya ile 54 ekleme ve 6 silme
  1. 1 1
      include/xlswriter.h
  2. 3 3
      kernel/excel.c
  3. 7 2
      kernel/write.c
  4. 43 0
      tests/merge_cell_type_writer.phpt

+ 1 - 1
include/xlswriter.h

@@ -204,7 +204,7 @@ 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 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 merge_cells(zend_string *range, zend_string *value, xls_resource_write_t *res, lxw_format *format);
+void merge_cells(zend_string *range, zval *value, 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 call_object_method(zval *object, const char *function_name, uint32_t param_count, zval *params, zval *ret_val);
 void chart_writer(zend_long row, zend_long columns, xls_resource_chart_t *chart_resource, xls_resource_write_t *res);

+ 3 - 3
kernel/excel.c

@@ -738,14 +738,14 @@ PHP_METHOD(vtiful_xls, autoFilter)
  */
 PHP_METHOD(vtiful_xls, mergeCells)
 {
-    zval *format_handle = NULL;
-    zend_string *range = NULL, *data = NULL;
+    zend_string *range = NULL;
+    zval *data = NULL, *format_handle = NULL;
 
     int argc = ZEND_NUM_ARGS();
 
     ZEND_PARSE_PARAMETERS_START(2, 3)
             Z_PARAM_STR(range)
-            Z_PARAM_STR(data)
+            Z_PARAM_ZVAL(data)
             Z_PARAM_OPTIONAL
             Z_PARAM_RESOURCE(format_handle)
     ZEND_PARSE_PARAMETERS_END();

+ 7 - 2
kernel/write.c

@@ -225,15 +225,20 @@ void auto_filter(zend_string *range, xls_resource_write_t *res)
 /*
  * Merge cells.
  */
-void merge_cells(zend_string *range, zend_string *value, xls_resource_write_t *res, lxw_format *format)
+void merge_cells(zend_string *range, zval *value, xls_resource_write_t *res, lxw_format *format)
 {
-    int error = worksheet_merge_range(res->worksheet, RANGE(ZSTR_VAL(range)), ZSTR_VAL(value), format);
+    char *_range = ZSTR_VAL(range);
+
+    int error = worksheet_merge_range(res->worksheet, RANGE(_range), "", format);
 
     // Cells that have been placed cannot be modified using optimization mode
     WORKSHEET_INDEX_OUT_OF_CHANGE_IN_OPTIMIZE_EXCEPTION(res, error)
 
     // Worksheet row or column index out of range
     WORKSHEET_INDEX_OUT_OF_CHANGE_EXCEPTION(error)
+
+    // writer merge cell
+    type_writer(value, lxw_name_to_row(_range), lxw_name_to_col(_range), res, NULL, format);
 }
 
 /*

+ 43 - 0
tests/merge_cell_type_writer.phpt

@@ -0,0 +1,43 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
+--FILE--
+<?php
+$config = ['path' => './tests'];
+$excel = new \Vtiful\Kernel\Excel($config);
+
+$filePath = $excel->fileName("tutorial.xlsx")
+    ->mergeCells('A1:C1', 1)
+    ->mergeCells('A2:D2', '2')
+    ->mergeCells('A3:E3', 3.001)
+    ->output();
+
+$data = $excel->openFile('tutorial.xlsx')
+    ->openSheet()
+    ->getSheetData();
+
+var_dump($data);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+array(3) {
+  [0]=>
+  array(1) {
+    [0]=>
+    int(1)
+  }
+  [1]=>
+  array(1) {
+    [0]=>
+    int(2)
+  }
+  [2]=>
+  array(1) {
+    [0]=>
+    float(3.001)
+  }
+}