当你在使用phpoffice/phpexcel 类库时候。composer 会给你提示一句话

Package phpoffice/phpexcel is abandoned, you should avoid using it. Use phpoffice/phpspreadsheet instead

phpexcel 已被废弃,建议我们用phpspreadsheet,

包地址:

https://packagist.org/packages/phpoffice/phpspreadsheet

composer:

composer require phpoffice/phpspreadsheet

使用

引入

use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\IOFactory;
use \PhpOffice\PhpSpreadsheet\Style\NumberFormat;

导出:

    //模板下载
public function template_download()
{ $spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet(); $worksheet->setTitle('导入模板'); //设置当前sheet的标题
$worksheet->getStyle('A1:E1')->getFont()->setBold(true)->setName('Arial')->setSize();
$worksheet->getStyle('B1')->getFont()->setBold(true);
$worksheet->getDefaultColumnDimension()->setWidth(); //设置第一栏的标题
$worksheet->setCellValue('A1', '交易流水号');
$worksheet->setCellValue('B1', '开户名');
$worksheet->setCellValue('C1', '卡号');
$worksheet->setCellValue('D1', '交易金额');
$worksheet->setCellValue('E1', '交易时间'); //默认填充数据
$explame_data_list = array(
array(
'bank_deal_no' => '',
'account_name' => '小明',
'bank_card' => '',
'deal_money' => '100.00',
'deal_time' => date("Y-m-d H:i:s"),
),
); //第二行起
$baseRow = ; //数据从N-1行开始往下输出 这里是避免头信息被覆盖
foreach ($explame_data_list as $k => $val) {
$i = $k + $baseRow;
$worksheet->setCellValue('A' . $i, $val['bank_deal_no']);
$worksheet->setCellValue('B' . $i, $val['account_name']);
$worksheet->setCellValue('C' . $i, $val['bank_card']);
$worksheet->setCellValue('D' . $i, $val['deal_money']);
$worksheet->setCellValue('E' . $i, $val['deal_time']);;
} //处理 数字过大会进行科学计数法
$worksheet->getStyle('A2')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER);
$worksheet->getStyle('C2')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER); $this->downloadExcel($spreadsheet, '批量导入模板-合同表单选项', 'Xls'); } /*********************************************************************************************************************/ //公共文件,用来传入xls并下载
private function downloadExcel($spreadsheet, $filename, $format)
{
// $format只能为 Xlsx 或 Xls
if ($format == 'Xlsx') {
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
} elseif ($format == 'Xls') {
header('Content-Type: application/vnd.ms-excel');
} header("Content-Disposition: attachment;filename="
. $filename . date('Y-m-d') . '.' . strtolower($format));
header('Cache-Control: max-age=0');
$objWriter = IOFactory::createWriter($spreadsheet, $format); $objWriter->save('php://output'); //通过php保存在本地的时候需要用到
//$objWriter->save($dir.'/demo.xlsx'); //以下为需要用到IE时候设置
// If you're serving to IE 9, then the following may be needed
//header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
//header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
//header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
//header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
//header('Pragma: public'); // HTTP/1.0
exit;
}

  

导入

    public function import(){
header("content-type:text/html;charset=utf-8"); //上传excel文件
$files = request()->file(); //将文件保存到public/uploads目录下面
try {
validate(['image'=>'fileSize:1048576|fileExt:xls'])
->check($files); $savename = [];
foreach($files as $file){
$savename[] = \think\facade\Filesystem::disk('public')->putFile( 'billfile', $file,'md5');
} } catch (think\exception\ValidateException $e) {
return json(['status' => '', 'message' => $e->getMessage()]);
}
//获取文件路径
$filePath = ROOT_PATH().'/public/uploads/'.$savename[];
$spreadsheet = IOFactory::load($filePath);
$sheetData = $spreadsheet->getActiveSheet()->toArray(true, true, true, true,true);
$row_num = count($sheetData); $now_time = time();
$import_data = []; //数组形式获取表格数据
for ($i = ; $i <= $row_num; $i++) { $bank_deal_no = $sheetData[$i]['A'];
$account_name = $sheetData[$i]['B'];
$bank_card = $sheetData[$i]['C'];
$deal_money = $sheetData[$i]['D'];
$deal_time = $sheetData[$i]['E']; if(!empty($bank_deal_no) && !empty($account_name) && !empty($bank_card) && !empty($deal_money) && !empty($deal_time) ){
$import_data[$i]['bank_deal_no'] = $bank_deal_no;
$import_data[$i]['account_name'] = $account_name;
$import_data[$i]['bank_card'] = $bank_card;
$import_data[$i]['deal_money'] = $deal_money;
$import_data[$i]['deal_time'] = $deal_time;
$import_data[$i]['create_time'] = $now_time;
$import_data[$i]['update_time'] = $now_time;
}
} sort($import_data); if (empty($import_data)) {
return json(['status' => '', 'message' => '数据解析失败']);
} $total_num = count($import_data);
if ($total_num > ) {
return json(['status' => '', 'message' => '数据超出限制,最多100条']);
} //校验是否重复:交易流水号
$data_array = array_column($import_data, 'bank_deal_no');
$data_ids = implode(',', $data_array);
$result_data = Db::name('user_bank_bill')
->field('bank_deal_no')
->where('bank_deal_no', 'in', $data_ids)
->select()
->toArray(); $error_message = '';
if (!empty($result_data)) {
$result_data_array = array_column($result_data, 'bank_deal_no');
$result_data_ids = implode(',', $result_data_array);
$error_message = '以下流水号有重复,已筛选出: '.$result_data_ids;
foreach ($import_data as $key => $value) {
if(in_array($value['bank_deal_no'],$result_data_array)){
unset($import_data[$key]);
}
}
} if(!empty($import_data)){
//将数据保存到数据库
$res = Db::name('user_bank_bill')->insertAll($import_data);
if ($res) {
return json(['status' => '', 'message' => '操作成功','result'=>$error_message]);
} else {
return json(['status' => '', 'message' => '提交失败,请刷新重试']);
}
} return json(['status' => '', 'message' => '数据错误','result' => $error_message]); }

最新文章

  1. JokeClient-Swift 仿写学习
  2. Python全栈开发day7
  3. CSS中定位机制的想法
  4. Linux下通过源码编译安装程序
  5. DevExpress免费线上公开课17日开课
  6. regsvr32的使用
  7. jquery判断是否出现滚动条
  8. iOS WIFI
  9. 淘宝语音搜索的实现——html5
  10. jquery控制左右箭头滚动图片列表
  11. Linux如何实现开机启动程序详解
  12. 64位WIN7+oracle11g+plsql
  13. UVA11983 - Weird Advertisement(扫描线)
  14. 使用Google 的 gson方式解析json
  15. C#下RSA算法的实现(适用于支付宝和易宝支付)
  16. android 开发 View _13 绘制图片与BitmapShader位图的图像渲染器
  17. 學習Echart 2.2.7
  18. 步步为营-35-SQL语言基础
  19. gcd和lcm模板
  20. python使用cv2显示图片像素值

热门文章

  1. 2019年杭电多校第二场 1002题Beauty Of Unimodal Sequence(LIS+单调栈)
  2. 使用ArcGIS for Server的Feature Access REST在线编辑图层
  3. ArcGIS 10.2 JavaScript API本地部署离线开发环境
  4. Exception的异常分类与处理
  5. 测试mybatis延迟加载错误与解决方法
  6. Ofbiz项目学习——阶段性小结——查询
  7. Predicate Format String Syntax 与字面量
  8. (知识点1)#pragma once 与 #ifndef 解析
  9. LeetCode 1249. Minimum Remove to Make Valid Parentheses
  10. 使用viper 进行golang 应用的配置管理