前端 - 数据导出
数据导出是通过 layui.excel 工具导出 Excel 文件,不需要服务器生成 Excel 文件,仅需返回 JSON 内容,由前端 JS 生成并下载到本地。
关于 layui.excel 工具更多文档可以去其官方网站了解:http://excel.wj2015.com
<fieldset>
<legend>条件搜索</legend>
<form class="layui-form layui-form-pane form-search" action="{:sysuri()}" onsubmit="return false" method="get" autocomplete="off">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">操作账号</label>
<div class="layui-input-inline">
<select name='username' lay-search class="layui-select">
<option value=''>-- 全部账号 --</option>
{foreach $users as $user}{if $user eq input('get.username')}
<option selected value="{$user}">{$user}</option>
{else}
<option value="{$user}">{$user}</option>
{/if}{/foreach}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">操作节点</label>
<label class="layui-input-inline">
<input name="node" value="{$get.node|default=''}" placeholder="请输入操作内容" class="layui-input">
</label>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">操作行为</label>
<div class="layui-input-inline">
<select name="action" lay-search class="layui-select">
<option value=''>-- 全部行为 --</option>
{foreach $actions as $action}{if $action eq input('get.action')}
<option selected value="{$action}">{$action}</option>
{else}
<option value="{$action}">{$action}</option>
{/if}{/foreach}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">操作描述</label>
<label class="layui-input-inline">
<input name="content" value="{$get.content|default=''}" placeholder="请输入操作内容" class="layui-input">
</label>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">访问地址</label>
<label class="layui-input-inline">
<input name="geoip" value="{$get.geoip|default=''}" placeholder="请输入访问地址" class="layui-input">
</label>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">操作时间</label>
<label class="layui-input-inline">
<input data-date-range name="create_at" value="{$get.create_at|default=''}" placeholder="请选择操作时间" class="layui-input">
</label>
</div>
<div class="layui-form-item layui-inline">
<button type="submit" class="layui-btn layui-btn-primary"><i class="layui-icon"></i> 搜 索</button>
<button type="button" data-form-export="{:url('index')}?type={$type|default=''}" class="layui-btn layui-btn-primary">
<i class="layui-icon layui-icon-export"></i> 导 出
</button>
</div>
</form>
</fieldset>
<script>
require(['excel'], function (excel) {
excel.bind(function (data) {
// 设置表格内容
data.forEach(function (item, index) {
data[index] = [item.id, item.username, item.node, item.geoip, item.geoisp, item.action, item.content, item.create_at];
});
// 设置表头内容
data.unshift(['ID', '操作账号', '访问节点', '访问IP地址', '访问地理区域', '访问操作', '操作内容', '操作时间']);
// 可选,自动计算列序号
var lastCol = layui.excel.numToTitle((function (count, idx) {
for (idx in data[0]) count++;
return count;
})(0));
// 可选,设置表头样式
layui.excel.setExportCellStyle(data, 'A1:' + lastCol + '1', {
s: {
font: {sz: 14, bold: true, color: {rgb: "FFFFFF"}, shadow: true},
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "5FB878"}},
alignment: {vertical: 'center', horizontal: 'center'}
}
});
// 可选,设置内容样式
var style1 = {
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "EAEAEA"}},
alignment: {vertical: 'center', horizontal: 'center'}
}, style2 = {
fill: {bgColor: {indexed: 64}, fgColor: {rgb: "FFFFFF"}},
alignment: {vertical: 'center', horizontal: 'center'}
};
layui.excel.setExportCellStyle(data, 'A2:' + lastCol + data.length, {
s: style1
}, function (rawCell, newCell, row, config, currentRow, currentCol, fieldKey) {
/* 判断并转换单元格数据为对象,以便初始化样式 */
typeof rawCell !== 'object' && (rawCell = {v: rawCell});
rawCell.s = Object.assign({}, style2, rawCell.s || {});
return (currentRow % 2 === 0) ? newCell : rawCell;
});
// 可选,设置表格行宽高,需要设置最后的行或列宽高,否则部分不生效 ???
var rowsC = {1: 40}, colsC = {A: 60, B: 100};
rowsC[data.length] = 33, colsC[lastCol] = 160;
this.options.extend = {
'!rows': layui.excel.makeRowConfig(rowsC, 33), // 设置每行高度,默认 33
'!cols': layui.excel.makeColConfig(colsC, 160) // 设置每行宽度,默认 160
};
// 其他更多样式,可以配置 this.options.extend 参数,每次执行 bind 会被重置
// 在线文档:http://excel.wj2015.com/_book/docs/%E5%87%BD%E6%95%B0%E5%88%97%E8%A1%A8/%E6%A0%B7%E5%BC%8F%E8%AE%BE%E7%BD%AE%E7%9B%B8%E5%85%B3%E5%87%BD%E6%95%B0.html
return data;
}, '操作日志');
});
</script>