PHP code example of yzh0325 / xlswrite

1. Go to this page and download the library: Download yzh0325/xlswrite library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

yzh0325 / xlswrite example snippets


use Pxlswrite\Pxlswrite;
$fileObj = new Pxlswrite(['path' => __DIR__]);
$filePath = $fileObj
    ->fileName('123.xlsx','sheet1') //fileName 会自动创建一个工作表,你可以自定义该工作表名称,工作表名称为可选参数
    ->field([
        'username'=>['name'=>'用户名'],
        'age'=>['name'=>'年龄']
    ]) //设置字段&表格头
    ->setGeneralData('generateData') //通过回调生成器方法向excel填充数据
    ->output(); //输出excel文件到磁盘,返回文件路径
$fileObj->download($filePath); //下载excel文件
/**
* 数据生成器方法 封装数据获取逻辑 通过yield返回 节省内存
*/
function generateData(){
    for($i=0;$i<10000;$i++){
        yield [
                [
                    'username' => '匿名用户'.rand(1,9999),
                    'age' => rand(1,100),  
                 ]
              ];
    }
}

$fileObj->download($filePath); 
//false 文件下载后不会自动删除原文件,true 默认值,下载后自动删除原文件
//$fileObj->download($filePath,false); 

/**
 * 设置字段&表格头
 * @param array $field 字段定义数组 数据格式如下
 * [
 *  'name' => ['name' => '姓名','callback'=>'functionName'],
 *  'age' => ['name' => '年龄'],
 * ]
 * @return $this
 * @throws DataFormatException
 */
function field($field)

use Pxlswrite\Pxlswrite;
//定义字段
$field = [
    'name' => ['name' => '姓名'],
    'year' => ['name' => '出生年份'],
    'age' => ['name' => '年龄','callback'=>'ageFormat']//callback 回调方法处理格式化值 可以是函数/对象方法
];
$fileObj = new Pxlswrite(['path' => __DIR__ . '/uploads' ]);
$fileObj->fileName('field.xlsx')
    ->field($field)//设置字段&表格头
    ->setGeneralData(function(){
       yield [
            ['name'=>'Rent', 'year'=>1999,'age'=>0],
            ['name'=>'Gas',  'year'=>1996,'age'=>0],
            ['name'=>'Food', 'year'=>1998,'age'=>0],
            ['name'=>'Gym',  'year'=>1995,'age'=>0],
        ];
    }
    )
    ->output();//输出excel文件到磁盘
//格式化字段值
function ageFormat($v, $values)
{
    return date('Y') - $values['year'];
}

 /**
 * 设置单元格自适应列宽
 * @param array $_range 单元列范围  e.g. ['A:B','C'] 为空则默认所有单元列
 * @return $this
 * @throws DataFormatException
 */
setAutoSize(array $_range = [])

/**
 *  行单元格样式
 * @param string $_range 单元格范围
 * @param int|double $_height 单元格高度  -1 默认行高13.5镑
 * @param resource|array $_formatHandler 单元格样式
 * @return $this
 * @throws DataFormatException
 */
setRow($range, $height = -1, $formatHandler = null);
 /**
 * 列单元格样式
 * @param string $_range 单元格范围  e.g.  'A:C'
 * @param int|double $_width 单元格宽度  -1 自适列宽
 * @param resource|array $_formatHandler 单元格样式
 * @return $this
 * @throws DataFormatException
 */
setColumn($range, $width = -1, $formatHandler = null)
/**
 * 全局默认样式 对setRow,setColumn,insertUrl,insertText方法有效
 * @param resource|array $_formatHandler style
 * @return $this
 * @throws DataFormatException
 */
setDefaultStyle($formatHandler)
 /**
 * 合并单元格
 * @param string $scope   单元格范围
 * @param string $data    data
 * @param resource|array $formatHandler 合并单元格的样式
 * @return $this
 * @throws DataFormatException
 */
mergeCells($scope, $data, $formatHandler = null)

/**
 * 设置一般数据 通过生成器逐行向表格插入数据,
 * 设置过field才支持动态单元格合并,
 * 可以根据指定的字段 通过值比较自动进行 行合并
 * @param callable $_generator 回调数据生成器方法 返回的数据格式是二维数组 如下字段名数量不限
 * [['id'=>1,'name'=>'张三','age'=>'18']]
 * @param array $_mergeColumn 需要合并的字段
 * @param array $_mergeColumnStyle 统一设置合并单元格的样式,设置后将无法修改样式,若要单独设置样式,参数应为空值,后续可用setColumn方式设置样式
 * @param int $_index 单元格行偏移量 合并单元格的起始位置
 * @param WebSocketClient|null $_pushHandle
 * @return Pxlswrite
 * @throws DataFormatException 数据格式错误
 */
function setGeneralData($_generator, array $_mergeColumn = [], array $_mergeColumnStyle = [], WebSocketClient $_pushHandle = null, $_index = 1)

 /**
 * 设置订单数据 根据数据可以合并指定的字段,需要遵循以下数据格式
 * @param callable $_generator 数据生成器方法 返回数据格式如下,字段数量名称不限,只支持一个item二维数组
 * [
 *    [
 *        'order'=>'20200632555' ,
 *        'time'=>'2020-06-30 12:30:10',
 *        'username'=>'张三',
 *        'address'=>'成都',
 *        'phone'=>'17756891562',
 *        'item'=> [
 *            [
 *                'itemnumer'=>'2020515',
 *                'productname'=>'商品1',
 *                'mark'=>'备注',
 *            ],
 *        ],
 *    ]
 * ];
 * @param array $_mergeColumn 需要合并的字段
 * @param array $_mergeColumnStyle 统一设置合并单元格的样式,设置后将无法修改样式,若要单独设置样式,参数应为空值,后续可用setColumn方式设置样式
 * @param WebSocketClient|null $_pushHandle WebSocketClient对象 用于推送进度
 * @param int $_index 单元格行偏移量 合并单元格的起始位置
 * @return $this
 * @throws DataFormatException 数据格式错误
 */
function setOrderData($_generator, array $_mergeColumn = [], array $_mergeColumnStyle = [], WebSocketClient $_pushHandle = null, $_index = 1)

 /**
 * @param int $_row 行 从0开始
 * @param int $_col 列 从0开始
 * @param string $_data 数据
 * @param string $_format 数据格式
 * @param array $_formatHandler 单元格样式
 * @return $this
 * @throws DataFormatException
 */
 function insertText($_row, $_col, $_data, $_format = '', $_formatHandler=[])

/**
* 插入链接
* @param int $_row 行 从0开始
* @param int $_col 列 从0开始
* @param string $_url  链接地址
* @param array $_formatHandler 单元格样式
* @return $this
* @throws DataFormatException
*/
function insertUrl($_row,$_col,$_url, $_formatHandler = [])

$data = [
    [
        'order'=>'20200632555' ,
        'time'=>'2020-06-30 12:30:10',
        'username'=>'张三',
        'address'=>'成都',
        'phone'=>'17756891562',
        'item'=> [
            [
                'itemnumer'=>'2020515',
                'productname'=>'商品1',
                'mark'=>'备注',
            ],
        ],
    ]
];

/**
 * 设置一般数据 通过生成器逐行向表格插入数据,
 * 设置过field才支持动态单元格合并,
 * 可以根据指定的字段 通过值比较自动进行 行合并
 * @param callable $_generator 回调数据生成器方法 返回的数据格式是二维数组 如下字段名数量不限
 * [['id'=>1,'name'=>'张三','age'=>'18']]
 * @param array $_mergeColumn 需要合并的字段
 * @param array $_mergeColumnStyle 统一设置合并单元格的样式,设置后将无法修改样式,若要单独设置样式,参数应为空值,后续可用setColumn方式设置样式
 * @param int $_index 单元格行偏移量 合并单元格的起始位置
 * @param WebSocketClient|null $_pushHandle
 * @return Pxlswrite
 * @throws DataFormatException 数据格式错误
 */
setGeneralData($_generator, array $_mergeColumn = [], array $_mergeColumnStyle = [], WebSocketClient $_pushHandle = null, $_index = 1)

/**
 * 设置订单数据 根据数据可以合并指定的字段,需要遵循以下数据格式
 * @param callable $_generator 数据生成器方法 返回数据格式如下,字段数量名称不限,只支持一个item二维数组
 * [
 *    [
 *        'order'=>'20200632555' ,
 *        'time'=>'2020-06-30 12:30:10',
 *        'username'=>'张三',
 *        'address'=>'成都',
 *        'phone'=>'17756891562',
 *        'item'=> [
 *            [
 *                'itemnumer'=>'2020515',
 *                'productname'=>'商品1',
 *                'mark'=>'备注',
 *            ],
 *        ],
 *    ]
 * ];
 * @param array $_mergeColumn 需要合并的字段
 * @param array $_mergeColumnStyle 统一设置合并单元格的样式,设置后将无法修改样式,若要单独设置样式,参数应为空值,后续可用setColumn方式设置样式
 * @param WebSocketClient|null $_pushHandle WebSocketClient对象 用于推送进度
 * @param int $_index 单元格行偏移量 合并单元格的起始位置
 * @return $this
 * @throws DataFormatException 数据格式错误
 */
setOrderData($_generator, array $_mergeColumn = [], array $_mergeColumnStyle = [], WebSocketClient $_pushHandle = null, $_index = 1)

use Pxlswrite\Pxlswrite;
//定义字段
$orderField =  [
    'order'=>['name'=>'订单号'] ,
    'time'=>['name'=>'下单时间'],
    'username'=>['name'=>'用户名'],
    'address'=>['name'=>'地址'],
    'phone'=>['name'=>'手机号'],
    'itemnumer'=>['name'=>'子订单号'],
    'productname'=>['name'=>'商品名称'],
    'amount'=>['name'=>'数量'],
    'mark'=>['name'=>'备注'],
];
$fileObj = new Pxlswrite(['path' => __DIR__ ]);
$filePath = $fileObj->fileName('123.xlsx');
    ->field($orderField)//设置字段&表格头
    ->setOrderData('generateOrderData',['order','time'],['align' => [Pxlswrite::FORMAT_ALIGN_CENTER, Pxlswrite::FORMAT_ALIGN_VERTICAL_CENTER]])//设置订单类型数据并自动合并单元格
    ->output();//输出excel文件到磁盘
//订单数据生成器 一个订单有多个item
function generateOrderData(){
    for ($i=0;$i<100;$i++){
        $order = [];
        $range = mt_rand(0,5);
        for($k = 0;$k<$range;$k++){
            $orderId = date('YmdHis').rand(1000,9999);
            $range2 = mt_rand(1,5);
            $item = [];
            for($j = 0;$j<$range2;$j++){
                $item[] = [
                    'itemnumer'=>$orderId,
                    'productname'=>'商品'.rand(10,99),
                    'amount'=>'1',
                    'mark'=>'备注',
                ];
            }
            $order[] = [
                'order'=>$orderId ,
                'time'=>date('Y-m-d H:i:s'),
                'username'=>'张三',
                'address'=>'成都',
                'phone'=>'17756891562',
                'item'=> $item,
            ];
        }
        yield $order;
    }
}

php ./src/WebSocket/WebSocketServer.php

use Pxlswrite\Pxlswrite;
use Pxlswrite\WebSocket\WebSocketClient;
$fileObj = new Pxlswrite(['path' => __DIR__]);
//实例化WebSocketClient--需要推送进度才实例化
$pushHandle = new WebSocketClient('ws://127.0.0.1:9502', $_GET['fd']);
$filePath = $fileObj->fileName('123.xlsx','sheet1')
    ->field($field)//设置字段&表格头
    ->setGeneralData('generateData', [], [], $pushHandle)//设置数据 回调生成器方法获取数据,$pushHandle 用于推送,可选参数
    ->output();//输出excel文件到磁盘
//ajax请求返回下载地址
echo json_encode(['code' => 1, 'msg' => '导出完毕', 'url' => '/download.php?file=' . $filePath]);

/**
 * 游标读取excel,分段插入数据库
 * @param callable $_func 方法名 回调数据插入的方法
 * @param WebSocketClient|null $_pushHandle
 * @param array $_dataType 可指定每个单元格数据类型进行读取
 */
importDataByCursor($_func, WebSocketClient $_pushHandle = null, array $_dataType = [])

use Pxlswrite\Pxlswrite;
$fileObj = new Pxlswrite(['path' => dirname($_GET['file'])]);
$fileInfo = explode('/', $_GET['file']);
$fileName = end($fileInfo);
//实例化WebSocketClient
$pushHandle = new WebSocketClient('ws://127.0.0.1:9502',$_GET['fd']);
//          打开excel文件       打开工作表   跳过一行数据      读取并导入数据
$fileObj->openFile($fileName)->openSheet()->setSkipRows(1)->importDataByCursor('insert_data',$pushHandle);

//数据插入逻辑
function insert_data($data)
{
    $db = DB::getInstance();
    $sql = '';
    foreach ($data as $v) {
        $sql .= "(" . implode(",", $v) . "),";
    }
    $sql = trim($sql, ',');
    $db->execute("insert into sheet2 (id,c1,c2,c3,c4) values " . $sql);
}