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);
}