thinkphp6 + phpexcel 导入导出数据,设置特殊表格

第一步:安装excel,使用composer安装,我的是在window下,直接cmd切换到项目下面,输入

composer require phpoffice/phpexcel,然后就等待安装完成。如下图:

第二步:引入相关类

<?php
namespace app\admin\controller;
use app\admin\model\Bingli;
use app\admin\model\Moneyinfo;
use think\Controller;
use think\Validate;
use think\facade\Request;
use think\facade\Db;
use think\facade\Session;
use think\facade\View;
use PHPExcel_IOFactory;   //这个是三方类class Binglii extends Base
{ /** 批量导入数据详情*/public function upAgent(){if(Request::param('html') == false){            // 获取表单上传文件$file = request()->file('file');if(empty($file)){return json(['info'=>'请选择上传文件!','status'=>0]);}// 移动到框架应用根目录/public/upload/ 目录下,并修改文件名为时间戳$savename = \think\facade\Filesystem::putFile('excel', $file, 'time');// 文件名称$info = explode('/', $savename);                     $file = public_path().'public/upload/excel/'.$info['excel'];//2022-08-25  补充,最近发现老是报错PHPExcel_IOFactory找不到,于是单独引入文件require_once '../vendor/phpoffice/phpexcel/Classes/PHPExcel.php';require_once '../vendor/phpoffice/phpexcel/Classes/PHPExcel/IOFactory.php';//导入 $objPHPExcel = PHPExcel_IOFactory::load($file); //获取sheet表格数目//$objReader = PHPExcel_IOFactory::createReader('Excel5');//$objPHPExcel = $objReader->load($file,$encode='utf-8');$sheetCount = $objPHPExcel->getSheetCount(); //默认选中sheet0表$sheetSelected = 0;$objPHPExcel->setActiveSheetIndex($sheetSelected); //获取表格行数$rowCount = $objPHPExcel->getActiveSheet()->getHighestRow(); //获取表格列数$columnCount = $objPHPExcel->getActiveSheet()->getHighestColumn();$dataArr = array();/* 循环读取每个单元格的数据 */for ($i = 2; $i <= $rowCount; $i++) {$data['mi_num'] = $objPHPExcel->getActiveSheet()->getCell("D3")->getValue();   $data['mi_time'] = $objPHPExcel->getActiveSheet()->getCell("B".$i)->getFormattedValue(); // getFormattedValue 获取本来的格式$data['mi_chargeItems'] = $objPHPExcel->getActiveSheet()->getCell("E".$i)->getValue();$data['mi_unit'] = $objPHPExcel->getActiveSheet()->getCell("M".$i)->getValue();$data['mi_quantity'] = $objPHPExcel->getActiveSheet()->getCell("O".$i)->getValue();$data['mi_unitPrice'] = $objPHPExcel->getActiveSheet()->getCell("R".$i)->getValue();$data['mi_money'] = $objPHPExcel->getActiveSheet()->getCell("V".$i)->getValue();$data['mi_payCode'] = $objPHPExcel->getActiveSheet()->getCell("X".$i)->getValue();$data['mi_cityCode'] = $objPHPExcel->getActiveSheet()->getCell("AD".$i)->getValue();$res[] = $data;  //数据赋值到数组}$lennum = 400; // 400条数据插入一次//记录一共插入了多少条数据$insertCount = 0;$count = count($res);  //总共多少条数据          $limit = ceil($count/$lennum);  //需要执行多少次插入数据的操作for($i = 1;$i <= $limit; $i++){$offset = ($i-1)*$lennum; //当前是第几次遍历,第一条数据是哪一条//从数组的第几条开始本次数据插入$datac = array_slice($res,$offset,$lennum);//模型可以插入大批量的数据$moneyinfo = new Moneyinfo();$result = $moneyinfo->saveAll($datac); $insertCount = count($result) + $insertCount;}//删除excel文件unlink($file);if($insertCount > 0){return json(['info'=>'文件上传成功,已经导入'.$insertCount.'条数据','status'=>1]); }else{return json(['info'=>'导入第'.$insertCount.'条失败','status'=>0]);  }             }}//数据导出public function downCsvB(){//2022-08-25  补充,最近发现老是报错PHPExcel_IOFactory找不到,于是单独引入文件require_once '../vendor/phpoffice/phpexcel/Classes/PHPExcel.php';require_once '../vendor/phpoffice/phpexcel/Classes/PHPExcel/IOFactory.php';//实例化PHPExcel类$objPHPExcel = new \PHPExcel();//激活当前的sheet表$objPHPExcel->setActiveSheetIndex(0);//数据$info = Request::param();        $id = $info['id'];$map1[] = ['bl_num','=',$id];$map2[] = ['mi_num','=',$id];$map3[] = ['mi_num','=',$id];$data1 = Db::table('zdb_bingli')->field('bl_name,bl_depart,bl_bed,bl_socialSecNum,bl_socialSecPayment,bl_balance,bl_admissionTime,bl_dischargeTime')->where($map1)->find();//引入model$moneyinfoModel = new Moneyinfo();$data = $moneyinfoModel->tab1('','',$id);$maxTime = Db::table('zdb_moneyinfo')->where($map3)->order('mi_time asc')->limit(0,1)->value('mi_time');$minTime = Db::table('zdb_moneyinfo')->where($map3)->order('mi_time desc')->limit(0,1)->value('mi_time');$totalm = Db::table('zdb_moneyinfo')->where($map2)->sum('mi_money'); //总金额$totalm = round($totalm,2);  //四舍五入$time1 = empty($maxTime) ? $data1['bl_admissionTime'] : $maxTime;  //时间段       $time2 = empty($minTime) ? $data1['bl_dischargeTime'] : $minTime;  //时间段 //设置表格头(即excel表格的第一行)// 合并 单元格$objPHPExcel->getActiveSheet()->mergeCells('A1:H1');$objPHPExcel->getActiveSheet()->mergeCells('E2:F2');$objPHPExcel->getActiveSheet()->mergeCells('C3:G3');$objPHPExcel->getActiveSheet(0)->SetCellValue('A1', 'xxxxxxxxxxx费用明细清单');      $objPHPExcel->getActiveSheet(0)->SetCellValue('A2', '姓名:'.$data1['bl_name']);$objPHPExcel->getActiveSheet(0)->SetCellValue('B2', '病区:');        $objPHPExcel->getActiveSheet(0)->SetCellValue('C2', $data1['bl_depart']);$objPHPExcel->getActiveSheet(0)->SetCellValue('E2', '社保号:'.$data1['bl_socialSecNum']);$objPHPExcel->getActiveSheet(0)->SetCellValue('H2', '床号:'.$data1['bl_bed']);$objPHPExcel->getActiveSheet(0)->SetCellValue('A3', '住院号:'.$id);$objPHPExcel->getActiveSheet(0)->SetCellValue('B3', '时间段:');$objPHPExcel->getActiveSheet(0)->SetCellValue('C3', date('Y/m/d H:i',$time1) .'至'. date('Y/m/d H:i',$time2));$objPHPExcel->getActiveSheet(0)->SetCellValue('H3', '病人签字:');//表头$objPHPExcel->getActiveSheet(0)->SetCellValue('A4','业务日期')->SetCellValue('B4','收费项目')->SetCellValue('C4','单位')->SetCellValue('D4','数量')->SetCellValue('E4','单价')->SetCellValue('F4','金额')->SetCellValue('G4','收费项目编码')->SetCellValue('H4','国家编码');$styleThinBlackBorder = array('borders' => array('allborders' => array( //设置全部边框'style' => \PHPExcel_Style_Border::BORDER_THIN //粗的是thick),),);      //边框设置$objPHPExcel->setActiveSheetIndex(0)->getStyle('A4:H4')->applyFromArray($styleThinBlackBorder);//循环刚取出来的数组,将数据逐一添加到excel表格。$num = 4;for ($i = 0; $i < count($data); $i++) {$objPHPExcel->getActiveSheet()->SetCellValue('A'.($i + 5),date('Y-m-d H:i',$data[$i]['mi_time']));$objPHPExcel->getActiveSheet()->SetCellValue('B'.($i + 5),$data[$i]['mi_chargeItems']);$objPHPExcel->getActiveSheet()->SetCellValue('C'.($i + 5),$data[$i]['mi_unit']);$objPHPExcel->getActiveSheet()->SetCellValue('D'.($i + 5),$data[$i]['mi_quantity']);$objPHPExcel->getActiveSheet()->SetCellValue('E'.($i + 5),$data[$i]['mi_unitPrice']);$objPHPExcel->getActiveSheet()->SetCellValue('F'.($i + 5),$data[$i]['mi_money']);$objPHPExcel->getActiveSheet()->SetCellValue('G'.($i + 5),' '.$data[$i]['mi_payCode']);$objPHPExcel->getActiveSheet()->SetCellValue('H'.($i + 5),' '.$data[$i]['mi_cityCode']);$num++;//边框设置$objPHPExcel->setActiveSheetIndex(0)->getStyle('A'.($i + 5).':H'.($i + 5))->applyFromArray($styleThinBlackBorder);}        // 合并 单元格$objPHPExcel->getActiveSheet()->mergeCells('C'.($num+2).':D'.($num+2));$objPHPExcel->getActiveSheet()->mergeCells('E'.($num+2).':F'.($num+2));$objPHPExcel->getActiveSheet(0)->SetCellValue('E'.($num+1), '合计');      $objPHPExcel->getActiveSheet(0)->SetCellValue('F'.($num+1), $totalm);$objPHPExcel->getActiveSheet(0)->SetCellValue('B'.($num+2), '交款:'.($totalm - $data1['bl_socialSecPayment']));$objPHPExcel->getActiveSheet(0)->SetCellValue('C'.($num+2), '入院总费用:'.$totalm);$objPHPExcel->getActiveSheet(0)->SetCellValue('E'.($num+2), '结算报销:'.$data1['bl_socialSecPayment']);$objPHPExcel->getActiveSheet(0)->SetCellValue('G'.($num+2), '余额:'.$data1['bl_balance']);$objPHPExcel->getActiveSheet(0)->SetCellValue('A'.($num+3), '制表人:'.$this->uname);// 水平居中$objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);$objPHPExcel->setActiveSheetIndex(0)->getStyle('A4:H4')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);        //右对齐$objPHPExcel->setActiveSheetIndex(0)->getStyle('B2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);$objPHPExcel->setActiveSheetIndex(0)->getStyle('B2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);$objPHPExcel->setActiveSheetIndex(0)->getStyle('B3')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);$objPHPExcel->setActiveSheetIndex(0)->getStyle('E'.($num+2).':G'.($num+2))->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);//设置单元格宽度$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('A')->setWidth(20);$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('B')->setWidth(25);$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('C')->setWidth(10);$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('D')->setWidth(10);$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('E')->setWidth(10);$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('F')->setWidth(10);$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('G')->setWidth(20);$objPHPExcel->setActiveSheetIndex(0)->getColumnDimension('H')->setWidth(28);// 设置行高度$objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(15); //设置默认行高$objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(20); //第一行行高$objPHPExcel->getActiveSheet()->getRowDimension(($num+1))->setRowHeight(20);$objPHPExcel->getActiveSheet()->getRowDimension(($num+2))->setRowHeight(20);$objPHPExcel->getActiveSheet()->getRowDimension(($num+3))->setRowHeight(20);// 字体大小和样式//$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(9);//第一行是否加粗  $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);$styleThinBlackBorderTB = array('borders' => array('top' => array( // 设置顶部边框'style' => \PHPExcel_Style_Border::BORDER_THIN //粗的是thick),'bottom' => array( //设置底部边框'style' => \PHPExcel_Style_Border::BORDER_THIN //粗的是thick),),);// 边框$objPHPExcel->setActiveSheetIndex(0)->getStyle('A'.($num+2).':H'.($num+2))->applyFromArray($styleThinBlackBorderTB);       // 设置垂直居中$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//设置保存的Excel表格名称$filename = 'user'.date('Ymd_his').'.xls';//设置当前激活的sheet表格名称$objPHPExcel->getActiveSheet()->setTitle('user');iconv("utf-8", "gb2312", $filename);  //解决乱码的问题ob_end_clean();  //解决乱码核心//设置浏览器窗口下载表格header("Content-Type: application/force-download");header("Content-Type: application/octet-stream");header("Content-Type: application/download");header('Content-Disposition:inline;filename="' . $filename . '"');        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');  //生成excel文件//下载文件在浏览器窗口$objWriter->save('php://output');       exit();}
}

第三步:Model类

<?phpnamespace app\admin\model;use think\Model;/*** @mixin think\Model*/
class Moneyinfo extends Model
{public function tab1($startTime = 0,$endTime = 0,$mi_num = 0,$mi_chargeItems = null){//查询条件if(!empty($startTime) && !empty($endTime)){ //时间$startTime = strtotime($startTime);$endTime = strtotime($endTime);$map[] = ['mi_time','between',[$startTime,$endTime]];             }//查询条件if(!empty($mi_chargeItems)){ //项目$map[] = ['mi_chargeItems','like','%'.$mi_chargeItems.'%'];}$map[] = ['mi_num','=',$mi_num];//查询  Moneyinfo 是数据表名$res = Moneyinfo::field("mi_num,mi_time,mi_chargeItems,mi_unit,mi_quantity,mi_unitPrice,mi_money,mi_payCode,mi_cityCode")->where($map)->select()->toArray();//echo Moneyinfo::getLastSql();//返回数据return $res;}
}

关于getBottom不生效,看了一下源代码,改了一下

原写法:$objPHPExcel->getActiveSheet()->getStyle('A1')->getBorders()->getBottom()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN)

正确写法参考上面数据导出的底部边框。

导出的数据结构如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20934.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

雅思口语考试的口音问题怎么解决?

很多学生都担心自己的口音不标准&#xff0c;也许在考试中难拿高分。确实口音不标准对于学生的雅思口语会有影响&#xff0c;那么就来看看雅思考试口音问题怎么解决吧。 一、雅思口语考试口音问题 1、分清楚元音和辅音中的易混音 听力中大家一定遇到过这样的情况&#xff0c;…

剑桥口语 — 48 个音标标准口型与细节发音

文章目录 一、不同的音标介绍二、DJ 音标三、常识&#xff08;一&#xff09;空腔器官&#xff08;二&#xff09;元音&#xff08;三&#xff09;元音舌位图 四、参考视频与教材四、元音&#xff08;1&#xff09;前元音&#xff1a;[i:] [ɪ] [e] [][i:][ɪ][e][] &#xff0…

怎么按面积比例创建缓冲多边形——看一下ChatGPT怎么回答

学习更多Python & GIS的相关知识&#xff0c;请移步公众号GeodataAnalysis。 之前写论文的时候看到过一个计算城市边界的方法&#xff0c;其大致流程是这样的&#xff0c;先是识别建成区单元&#xff1b;然后去除农村建成区单元&#xff1b;之后为每个单元创建缓冲区&…

Nature:为什么人工智能需要理解因果?

转自&#xff1a;集智俱乐部 作者&#xff1a;Neil Savage 导语&#xff1a;为什么药物只对某些人有效&#xff0c;而对另一些人无效&#xff1f;为什么 ChatGPT 会产生违背常识的答案&#xff1f;机器学习的发展似乎遇到了障碍&#xff0c;其中症结或许在于“相关性不等于因果…

2023数据技术嘉年华(福利来了)

2023的数据技术嘉年华即将如约而至&#xff0c;可能有朋友知道&#xff0c;这次的DTC&#xff0c;其实是去年12月的延期&#xff0c;只能赞叹大佬们对当时和未来形势的判断如此精妙。无论如何&#xff0c;作为一次技术人员的集会&#xff0c;能面对面交流&#xff0c;都是一次难…

轻量版ChatGPT训练方法开源!仅用3天围绕LLaMA打造,号称训练速度比OpenAI快15倍...

萧箫 发自 凹非寺量子位 | 公众号 QbitAI 基于Meta模型打造的轻量版ChatGPT&#xff0c;这就来啦&#xff1f; Meta宣布推出LLaMA才三天&#xff0c;业界就出现了把它打造成ChatGPT的开源训练方法&#xff0c;号称比ChatGPT训练速度最高快15倍。 LLaMA是Meta推出的超快超小型GP…

为什么 APISIX Ingress 是比 Traefik 更好的选择?

❝ 作者&#xff1a;张晋涛&#xff0c;API7.ai 云原生专家&#xff0c;Apache APISIX Committer、Kubernetes Ingress Nginx Reviewer Apache APISIX Ingress Apache APISIX Ingress[1] 是一个使用 Apache APISIX 作为数据面的 Kubernetes Ingress controller 实现。 目前&…

ChatOps的利器:Hubot

引言 近几年&#xff0c;DevOps 在各个企业用的风生水起&#xff0c;也衍生出了很多的其他的实践和理念&#xff0c;比如AIOps&#xff0c;DevSecOps&#xff0c; TestOps&#xff0c; BizOps 当然还有本文的主角 ChatOps大哥了。 说起ChatOps&#xff0c; 顾名思义就是通过聊…

大模型开发(五):实现Jupyter本地调用OpenAI API

全文共3000余字&#xff0c;预计阅读时间约15分钟 | 满满干货&#xff0c;建议收藏&#xff01; 大模型开发(五)&#xff1a;实现Jupyter本地调用OpenAI API OpenAI作为本轮大语言模型技术进步的先驱&#xff0c;其系列大型模型在效果上一直保持着领先。其推出的各类模型如文本…

[考研数据结构]第2章之顺序表的基本知识与操作

前言 从本篇文章开始&#xff0c;正式开启考研专业课之一的数据结构的复习之旅&#xff0c;数学与专业课并驾齐驱&#xff0c;早开始&#xff0c;后期才能游刃有余。另外博客重点分享数据结构需要动手实践的代码部分&#xff0c;对于概念的解释将被一笔带过或者忽略&#xff0c…

线程池 2(第二部分--循环队列)

在考虑如何去设计一个任务容器的时候&#xff0c;其实尝试了很多。最开始的时候直接用的是std::queue容器&#xff0c;主要是看了知乎上面的 “ 基于C11实现线程池 - 知乎 ”这个帖子&#xff0c;去封装一个安全队列。但是这个操作每次都要上一次锁&#xff0c;实在是太浪费时间…

ubuntu20.04 硬盘挂载、显卡驱动安装

前几天ubuntu系统莫名出问题了&#xff0c;修不好只能重装&#xff0c;在此记录安装ubuntu系统后的硬盘挂载和显卡驱动安装。 注意&#xff0c;本文并非教程&#xff0c;只是个人安装过程的记录&#xff0c;仅供参考 ubuntu系统&#xff1a;Ubuntu 20.04.6 LTS 硬件设备&…

一文带你搞清 ChatGPT 与 Azure OpenAI 的区别

这两周是我从2017年开始全职涉入 NLP 领域后最忙的两周&#xff0c;无数的同事和客户都在向我提出一个询问&#xff1a;ChatGPT 可以帮到我们什么&#xff1f; 特别是在2023年3月31日我做了一场微软 Azure OpenAI [布局助力企业]拥抱新智能时代的演讲之后&#xff0c;这几天我…

ChatGPT的真相:强泛化的秘密以及众多关键问题

进NLP群—>加入NLP交流群 本文转载自AI科技评论&#xff0c;作者韩庐山。 本文从ChatGPT带来的即时学习能力&#xff08;in-context learning&#xff09;入手&#xff0c;逐步深入地探讨了ChatGPT目前众多的关键性问题&#xff0c;包括&#xff1a; ChatGPT带来了从未有过的…

chatgpt赋能python:用Python向手机发送信息是如何实现的?

用Python向手机发送信息是如何实现的&#xff1f; 在今天的信息时代&#xff0c;随时随地保持联系已经成为生活不可或缺的一部分。随着技术的发展&#xff0c;我们可以使用各种方式发送和接收信息&#xff0c;而使用Python向手机发送短信是其中一种非常方便的方式。 Python的…

chatgpt赋能python:Python自动认证上网教程

Python自动认证上网教程 随着互联网的普及&#xff0c;越来越多的人需要通过手机、电脑等设备上网&#xff0c;而许多场所都要求进行认证才能使用网络。每次都手动操作认证费时费力&#xff0c;这时Python就可以派上用场了。Python是一种高级的编程语言&#xff0c;具有可读性…

双因素认证(2FA)教程

所谓认证&#xff08;authentication&#xff09;就是确认用户的身份&#xff0c;是网站登录必不可少的步骤。 密码是最常见的认证方法&#xff0c;但是不安全&#xff0c;容易泄露和冒充。 越来越多的地方&#xff0c;要求启用双因素认证&#xff08;Two-factor authenticatio…

如何实现双因素认证?

增强数字安全的愿望引起了世界各国政府的关注&#xff0c;所有政府都希望保护消费者和企业。因此&#xff0c;许多人提出了立法&#xff0c;将两因素身份验证 (2FA) 作为 IT 系统的强制性要求。其实&#xff0c;在我国等级保护制度中等级保护第三级以上都要求完成双因素认证的&…

网络安全合规-Tisax(汽车安全评估讯息交换平台)一

**TISAX&#xff08;汽车安全评估讯息交换平台&#xff08;可信信息安全评估交换平台&#xff09;&#xff09;**是2017年由德国汽车工业联合会(VDA) 联合欧洲网络交换所(ENX) 所推出的资讯交换平台&#xff0c;通过应用欧洲网络交换协会&#xff08;ENX&#xff09;和德国汽车…

从医疗保健攻击到HIPAA 合规性

医疗机构无疑是网络攻击的热门目标。攻击者因在暗网上出售一条健康记录而获取高额 佣金&#xff0c;在各行业网络安全报告中医疗保健行业的攻击事件占比居高不下&#xff0c;这有什么奇怪的吗&#xff1f; 根据2022 年 SonicWall 网络威胁报告&#xff0c;医疗保健行业&#x…