https://mp.weixin.qq.com/s/ChPIKIv9tqmuqGyfc9Zi7Q

合并单元格的表,很多地方可以见到,比如购物车,订单合并等,今天给大家讲解一下,如何操作,虽然我用的laravel,但是都是PHP。以下只做参考!

部分效果图如下

路由文件

Route::get('admin/allots/index', ['as'=> 'admin.allots.index', 'uses' => 'AllotController@index']);

控制器文件:AllotController.php

/**
* Display a listing of the Allot.
*
* @param Request $request
* @return Response
*/
public function index(Request $request)
{
$param = $request->all();
$params = [
'orderBy' => ['allot_id', 'desc'],
'groupBy' => 'allot_sn'
]; $params['left_join'][] = ['allot_detail','allot.allot_id','=','allot_detail.allot_id'];
$params['left_join'][] = ['goods_sku','allot_detail.sku_id','=','goods_sku.sku_id'];
$params['left_join'][] = ['goods','goods_sku.goods_id','=','goods.goods_id']; $params['select'] = [
'allot.*',
'allot_detail.sku_id',
'goods_sku.sku_id',
'goods_sku.goods_id',
'goods.goods_id',
'goods.goods_name'
]; if(!empty($param['goods_name'])){
$params['where'] = $this->entryWareRepository->getLikeGoods(trim($param['goods_name']));
$search_sku_id = $this->entryWareRepository->getLikeSkuID(trim($param['goods_name']));
} //用户所属对应仓库的信息
$admin_ware = $this->allotRepository->getAdminWare();
if($admin_ware > 0){
$params['whereIn'] = ['allot.from_ware_id', $admin_ware];
} $this->allotRepository->pushCriteria(new RequestCriteria($request));
$allots = $this->allotRepository->paginate(config('config.pagesize'),[
'detail.sku.goods','out_ware','entry_ware'
],$params); $allots->each(function($item,$key){
$item->is_out_ware = count($this->allotRepository->out_ware($item->allot_sn));
$item->is_entry_ware = count($this->allotRepository->entry_ware($item->allot_sn));
}); foreach ($allots as $val){
$val->detail->each(function($vo,$k){
$vo->change_sku = $vo->sku->getShowSku();
});
}
//dd($allots); return view('admin.allots.index', compact('allots','admin_ware','param')); }

model文件:Allot.php

class Allot extends Model
{ public $table = 'allot'; const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at'; protected $primaryKey = 'allot_id'; public $fillable = [
'allot_sn',
'remark',
'status',
'from_ware_id',
'to_ware_id',
'create_admin_id',
'create_admin_name',
'examine_admin_id',
'examine_admin_name',
'entry_ware_status',
'out_ware_status',
'confirm_admin_id',
'confirm_admin_name'
]; /**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'allot_id' => 'integer',
'allot_sn' => 'string',
'remark' => 'string',
'status' => 'integer',
'from_ware_id' => 'integer',
'to_ware_id' => 'integer',
'create_admin_id' => 'integer',
'create_admin_name' => 'string',
'examine_admin_id' => 'integer',
'examine_admin_name' => 'string',
'confirm_admin_id' => 'integer',
'confirm_admin_name' => 'string',
'entry_ware_status' =>'integer',
'out_ware_status' => 'integer',
]; /**
* Validation rules
*
* @var array
*/
public static $rules = [ ];

容器文件:AllotRepository.php

<?php

namespace App\Repository;

use App\Model\Allot;
use App\Model\AllotDetail;
use App\Model\AllotSkuBatch;
use App\Repository\CommonRepository; class AllotRepository extends CommonRepository
{
/**
* @var array
*/
protected $fieldSearchable = [
'allot_id',
]; /**
* Configure the Model
**/
public function model()
{
return Allot::class;
} public function search($param = [])
{ $model = $this->model();
$model = new $model; $rs = $model;
if (!empty($param['goods_name'])) {
$rs = $model->where('goods_name', '=', $param['goods_name']);
} //创建时间开始
if (!empty($param['add_time_start'])) {
$rs = $rs->where('created_at', '>=', $param['created_at'] . ' 00:00:00');
}
//创建时间结束
if (!empty($param['add_time_end'])) {
$rs = $rs->where('created_at', '<=', $param['created_at'] . ' 23:59:59');
} return $rs;
} /**
* Function:自动生成入单号
* User:wucy
* @return string
*/
public function createAllotSn()
{
$model = $this->model();
$allot_id = $model::max('allot_id');
$date = date('Ymd',time());
$allot_id = $allot_id +1;
$allot_sn = 'A' .$date. str_repeat('0', 8 - strlen($allot_id)) . $allot_id;
$sn_list = $model::where('allot_sn','like','%'.$allot_id.'%')->where('allot_id','<>',$allot_id)->get()->toArray();
if (in_array($allot_sn, $sn_list))
{
$max = pow(10, strlen($sn_list[0]) - strlen($allot_sn) + 1) - 1;
$new_sn = $allot_sn . mt_rand(0, $max);
while (in_array($new_sn, $sn_list))
{
$new_sn = $allot_sn . mt_rand(0, $max);
}
$allot_sn = $new_sn;
} return $allot_sn;
}

模板文件table.blade.php

<div class="box" style="overflow-x:scroll;">
<div class="box-body">
<table class="table table-bordered table-hover lastTd" id="allots-table" style="font-size:12px;">
<thead>
<tr class="nowrap">
<th>调拨单号</th>
<th>制单时间</th>
<th>调出仓库</th> <th>商品SKU</th>
<th>商品名称</th>
<th>商品属性</th>
<th>单位</th>
<th>调拨数量</th> <th>调入仓库</th>
<th>调拨备注</th>
<th>审核状态</th>
<th>审核人</th>
<th>是否出库</th>
<th>是否入库</th>
<th style="width:135px;min-width:135px;">操作</th>
</tr>
</thead>
<tbody>
@foreach($allots as $allot)
<?php
if(isset($param['goods_name']) && !empty($param['goods_name'])){
$detail = $allot->detail->whereInLoose('sku_id',$search_sku_id);
}else{
$detail = $allot->detail;
} $count = count($detail);
$rowspan = $count == 1 ? '' : "rowspan='{$count}'"; //单元格合并
$first_detail = $detail->shift(); $admin_id = Auth::id(); if(($admin_ware > 0 && in_array( $allot->from_ware_id,$admin_ware))
|| $admin_ware==0){
$from_admin_ware =1;
}else{
$from_admin_ware =0;
} if(($admin_ware > 0 && in_array( $allot->to_ware_id,$admin_ware))
|| $admin_ware==0){
$to_admin_ware =1;
}else{
$to_admin_ware =0;
} //dd($from_admin_ware); ?>
<tr>
<td {!! $rowspan !!}>{!! $allot->allot_sn !!}</td>
<td {!! $rowspan !!}>{!! $allot->created_at !!}</td>
<td {!! $rowspan !!}>{!! $allot['out_ware']['name'] !!}</td> <td>{!! !empty($first_detail) ? $first_detail->change_sku : '--' !!}</td>
<td>{!! !empty($first_detail) ? $first_detail->sku->goods->goods_name : '--' !!}</td>
<td>{!! !empty($first_detail) ? $first_detail->sku->value_name : '--' !!}</td>
<td>{!! !empty($first_detail) ? $first_detail->sku->goods->goods_unit : '--' !!}</td>
<td>{!! !empty($first_detail) ? $first_detail->send_number : '--' !!}</td> <td {!! $rowspan !!}>{!! $allot['entry_ware']['name'] !!}</td>
<td {!! $rowspan !!}>{!! $allot->remark !!}</td>
<td {!! $rowspan !!}>
<small class="label pull-left bg-blue">{!! config('const.ware.entry_status')[$allot->status] !!}</small>
</td>
<td {!! $rowspan !!}>{!! $allot->confirm_admin_name ? $allot->confirm_admin_name : '--'!!}</td>
<td {!! $rowspan !!}>{!! config('const.ware.entry_or_out_ware')[$allot->out_ware_status] !!}</td>
<td {!! $rowspan !!}>{!! config('const.ware.entry_or_out_ware')[$allot->entry_ware_status] !!}</td>
<td {!! $rowspan !!}>
{!! Form::open(['route' => ['admin.allots.destroy', $allot->getKey()], 'method' => 'delete']) !!}
<div class='btn-group'>
<a href="@if($allot->status==1) javascript:; @else {!! route('admin.allots.edit', [$allot->getKey()]) !!} @endif"
class='btn btn-default btn-xs' @if($allot->status==1) disabled="disabled" @endif title="编辑" alt="编辑"><i class="fa fa-edit"></i></a>
<a href="@if($allot->status==1) javascript:; @else{!! route('admin.allots.examine', [$allot->getKey()]) !!} @endif"
class='btn btn-default btn-xs' @if($allot->status==1) disabled="disabled" @endif title="审核" alt="审核"><i class="fa fa-user"></i></a> <a href="@if($allot->is_out_ware == 1 || $from_admin_ware ==0)javascript:; @else {!! route('admin.allots.out_ware', [$allot->getKey()]) !!} @endif"
class='btn btn-default btn-xs' @if($allot->is_out_ware==1 ||$allot->status==0 || $from_admin_ware ==0) disabled="disabled" @endif title="办理出库" alt="办理出库"><i class="fa fa-share"></i></a> <a href="@if($allot->entry_ware_status == 1 || $allot->out_ware_status==0 || $allot->is_entry_ware==1 || $to_admin_ware == 0) javascript:; @else {!! route('admin.allots.entry_ware', [$allot->getKey()]) !!} @endif"
class='btn btn-default btn-xs' @if($allot->entry_ware_status==1 || $allot->out_ware_status==0 ||$allot->is_entry_ware==1 || $to_admin_ware == 0) disabled="disabled" @endif title="办理入库" alt="办理入库"><i class="fa fa-reply"></i></a> <a @if($allot->status > 0) disabled="disabled" @endif href="{!! route('admin.allots.destroy', [$allot->getKey()]) !!}" title="删除" alt="删除" class='btn btn-default btn-xs'><i class="fa fa-trash"></i></a>
</div>
{!! Form::close() !!}
</td>
</tr> @if($rowspan != '')
@foreach($detail as $row)
<tr>
<td>{{ $row->change_sku }}</td>
<td>{{ $row->sku->goods->goods_name }}</td>
<td>{{ $row->sku->value_name }}</td>
<td>{{ $row->sku->goods->goods_unit }}</td>
<td>{{ $row->send_number }}</td>
</tr>
@endforeach
@endif
@endforeach
</tbody>
</table>
</div>
</div>

一个功能模块包括增删改查,贴出来的代码会很多!这里只贴出列表的功能,有问题的可以留言

PHP如何输出合并单元格的表的更多相关文章

  1. 议:如何将树形菜单形式的数据转化成HTML的二维表(相同内容需合并单元格)

    一般做OA类管理系统,经常涉及到“组织架构”的概念,那么像这种有上下层级关系的数据一般会做成树形菜单的方式显示,底层代码必定会用到递归算法.这篇随笔的目的就是要谈谈除了用树形菜单来显示这种上下层级关系 ...

  2. NPOI扩展--判断指定单元格是否为合并单元格和输出该单元格的行列跨度(维度)

    因工作需要用到跨合并单元格获取数据,所以写了个NPOI扩展类. 主要方法如下: 1.判断指定行/列索引(单元格)是否为合并单元格. 2.获取指定列索引的实际含有数据的单元格. 3.返回指定行/列索引的 ...

  3. Java导出Excel表,POI 实现合并单元格以及列自适应宽度(转载)

    POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是: sheet.addMergedRegion(new CellRangeAddress ...

  4. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  5. 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel

    步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript&qu ...

  6. PHPEXCEL xls模板导入,及格式自定义:合并单元格、加粗、居中等操作

    PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格,如 Excel (BIFF) .xls ...

  7. 20170622xlVBA多部门分类汇总同类合并单元格

    Public Sub Basic_CodeFrame() AppSettings On Error GoTo ErrHandler Dim StartTime, UsedTime As Variant ...

  8. 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

    前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...

  9. jquery操作表格 合并单元格

    jquery操作table,合并单元格,合并相同的行 合并的方法 $("#tableid").mergeCell({ cols:[X,X] ///参数为要合并的列}) /** * ...

随机推荐

  1. vue 路由入门(vue-router)

    新建的 js 文件如下: import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) //全局使用该组件 / ...

  2. Angular-cli 的安装

    一.先安装node.js(若已经安装就跳过) 1.下载node.js安装包 http://nodejs.cn 按照自己电脑的配置,下载相应的安装包(我下载的是 node-v6.10.3-x64.msi ...

  3. RxJS 入门指引和初步应用

    作者:徐飞链接:https://zhuanlan.zhihu.com/p/25383159来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. RxJS是一个强大的React ...

  4. PAT甲级——A1035 Password

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  5. PAT甲级——A1023 Have Fun with Numbers

    Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, wit ...

  6. Webpack构建前端项目

    前言 公司据说要搞前后端分离,趁这两天项目完成的差不多,抓紧时间学习一下前端知识 现在流行前端项目工程化,那么第一个问题就是如何创建工程(项目),第一次玩webpack 通过 NPM 创建项目 # 创 ...

  7. Luogu P2679 子串(字符串+dp)

    P2679 子串 题意 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\ ...

  8. 使用Python Requests上传表单数据和文件

    在Python环境下写一个HTTP客户端,发送POST请求,同时上传表单数据和文件,我们可以使用Requests模块来实现.代码如下: data = { 'name': 'nginx' } files ...

  9. LUOGU P1290 欧几里德的游戏

    题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...

  10. mysql 常用命令语法

    登录到mysql client 以windows下为例,打开cmd命令窗口,进入到mysql安装目录bin目录下,首先要启动mysql服务,执行命令: net start mysql,这里不需要分号. ...