ThinkPhp 使用PhpExcel导出导入多语言文件
在ThinkPHP 里已经实现了多语言功能,只要在指定的目录下创建对应的语言文件并填充内容,即可实现多语言功能
而多语言的翻译却是一个很麻烦的事情,因为客户特定的行业问题导致我们翻译可能是不准确的
于是就写了一个导入导出多语言功能,让客户根据规则自行翻译多语言内容(撇清责任)
ThinkPHP 具体的语言包文件命名和位置如下:
语言包 | 语言文件位置 |
---|---|
应用语言包 | 应用公共目录/Lang/语言文件.php |
模块语言包 | 模块目录/Lang/语言文件.php |
控制器语言包 | 模块目录/Lang/语言目录/控制器名(小写).php |
<?php /*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-07-13 17:06:00* @Description: 多语言导出与导入*/ namespace Admin\Controller; use Common\Controller\AdminbaseController; class LangController extends AdminbaseController {/*** 首页* @Author HTL* @Email huangyuan413026@163.com* @DateTime 2016-07-13T17:11:40+0800* @return [type] [description]*/function index(){switch (I("get.type")) {case 'export_lang':$this->_export_lang();break;case 'import_lang':$this->_import_lang();break;default:$this->display();break;}}/*** 从Excel中导入多语言并生成PHP代码* @Author HTL* @Email huangyuan413026@163.com* @DateTime 2016-07-12T17:08:42+0800* @return [type] [description]*/function _import_lang(){//是否上传文件if (count($_FILES['file']) <= 0) {$this->error("not select file");exit;}//多语言路径,注意路径大小写,Linux是区分大小写的$lang_path = SPAPP . "Admin/Lang/";$apps = sp_scan_dir($lang_path . "/*", GLOB_ONLYDIR);//多语言数[提供几种语言]$app_count = count($apps);if ($app_count <= 0) {$this->error(L("_SELECT_NOT_EXIST_"));exit;}//将上传的多语言文件上传到此,需要有写入权限$new_file = './data/upload/' . iconv('UTF-8', 'GB2312', $_FILES['file']['name']);//上传到指定路径move_uploaded_file($_FILES['file']['tmp_name'], $new_file);vendor("PHPExcel.PHPExcel");//导入PHPExcel类$objPHPExcel;try {$objReader = \PHPExcel_IOFactory::createReader('Excel2007');$objPHPExcel = $objReader->load($new_file);} catch (Exception $e) {$this->error($e->getMessage());die;}//遍历工作表foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {$excels = array();$highestRow = $worksheet->getHighestRow();foreach ($worksheet->getRowIterator() as $row_index => $row) {//得到所有列$cellIterator = $row->getCellIterator();//单元格索引$index = 0;//遍历列foreach ($cellIterator as $cell_index => $cell) {//多语言的名称[en-us、zh-cn 、more.......]//根据多语言生成不同的数组[每个语言为一个数组]if ($row_index == 1) {break;//导出的文档语言是否本地的语言一致// $lang_name = $cell->getCalculatedValue();// foreach ($apps as $key => $value) {// $excels[$value] = array();// } }//创建多语言数据[0=多语言的字段]//某个语言的字段,用于设置N个多语言的值if ($index == 0) {$lang_name = $cell->getCalculatedValue();} else {$cell_val = $cell->getCalculatedValue();//设置某个语言的字段值if (strlen($cell_val) > 0) {$excels[$apps[$index - 1]][$lang_name] = $cell_val;}}$index++;}}//输出php代码到文件//$name:语言名称//$excl:语言内容foreach ($excels as $name => $excel) {$excel = var_export($excel, true);//var_export 生成的数组有一个空值,需要去掉,否则将出现错误$excel = preg_replace("/\\,\\s\\)/i", ")", $excel);//输出php语言格式$excel = "<?php return " . $excel . "?>";if ($worksheet->getTitle() == "ALL_Language.php") {file_put_contents($lang_path . '/' . $name . ".php", $excel);} else {file_put_contents($lang_path . '/' . $name . '/' . $worksheet->getTitle(), $excel);}}}unset($excels);unset($objPHPExcel);$this->success(L("_OPERATION_SUCCESS_"));}/*** 替代scan_dir的方法* @param string $pattern 检索模式 搜索模式 *.txt,*.doc; (同glog方法)* @param int $flags*/function sp_scan_dir($pattern, $flags = null){$files = array_map('basename', glob($pattern, $flags));return $files;}/*** 导出自定义多语言到excel* @Author HTL* @Email huangyuan413026@163.com* @DateTime 2016-07-12T16:23:36+0800* @return [type] [description]*/function _export_lang(){//多语言文件所在路径,注意大小写$lang_path = SPAPP . "Admin/Lang/";$apps = sp_scan_dir($lang_path . "/*", GLOB_ONLYDIR);//多语言数[提供几种语言]$app_count = count($apps);if ($app_count <= 0) {$this->error(L("_SELECT_NOT_EXIST_"));exit;}vendor("PHPExcel.PHPExcel");//导入PHPExcel类$objPHPExcel = new \PHPExcel();$app = $lang_path . $apps[0];if (!is_dir($app)) {$this->error(L("_SELECT_NOT_EXIST_"));exit;}$objPHPExcel->removeSheetByIndex(0);//路径下的语言文件[/lang/en-us.php & /Lang/zh-cn.php & more]$merge_files = array();foreach ($apps as $key => $value) {$lang_file = $lang_path . $value . '.php';if (is_file($lang_file)) {//数组的key为多语言名称$merge_files[$value] = (include $lang_file);}//end if }//end foreach// print_r($merge_files);exit;// ALL_Language.php 为全局语言文件$this->_set_sheet_value(0, $objPHPExcel, $merge_files, 'ALL_Language.php');//多语言目录下的语言文件[/Lang/zh-cn/*.php]$files = sp_scan_dir($app . "/*.php");foreach ($files as $index => $key) {//合并多语言到一个数组$merge_files = array();//导入多语言并添加到数组中foreach ($apps as $_app) {$lang_file = $lang_path . $_app . '/' . $key;// echo($_app).'<BR>';// array_push($merge_files, $_app);if (is_file($lang_file)) {//数组的key为多语言名称$merge_files[$_app] = (include $lang_file);// array_push($merge_files, include ($lang_file)); }//end if }//end foreach$this->_set_sheet_value($index + 1, $objPHPExcel, $merge_files, $key);}//end forach$objPHPExcel->setActiveSheetIndex(0);// $objPHPExcel->removeSheetByIndex(0);header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');header('Content-Disposition: attachment;filename="' . date('ymdHis') . '-Languages.xlsx"');header('Cache-Control: max-age=0');// If you're serving to IE 9, then the following may be neededheader('Cache-Control: max-age=1');// If you're serving to IE over SSL, then the following may be neededheader('Expires: Mon, 26 Jul 1997 05:00:00 GMT');// Date in the pastheader('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');// always modifiedheader('Cache-Control: cache, must-revalidate');// HTTP/1.1header('Pragma: public');// HTTP/1.0$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');$objWriter->save('php://output');}/*** 设置sheet和单元格值* @Author HTL* @Email huangyuan413026@163.com* @DateTime 2016-07-12T17:06:05+0800* @param [type] $sheet_index [sheet的索引]* @param [type] $objPHPExcel [phpexcel对象]* @param [type] $merge_files [多语言数据]* @param [type] $title [sheet title]*/function _set_sheet_value($sheet_index = 0, $objPHPExcel, $merge_files, $title){if (!$objPHPExcel || !$objPHPExcel || count($objPHPExcel) <= 0) {return;}//创建sheet并设置title,每一个多语言文件都是一个sheet$excel = $objPHPExcel->createSheet($sheet_index)->setTitle($title);// $excel->setCellValue('A1',"Name")->setCellValue('B1',"")->setCellValue("C1","");//多语言定义的字段数量$field_count = array_keys($merge_files);//计算第一个多语言的key数量[数组的key是多语言名称: array=('zh-cn'=>array("name"=>"name","age"=>"age"),"en-us"=>array())]$field_count = array_keys($merge_files[$field_count[0]]);//行索引[excel从1开始]$row_index = 1;//设置多语言foreach ($merge_files as $_key => $_value) {//每个shet的第一行第一列为Name[字段的名称]if ($row_index == 1) {$excel->setCellValue("A{$row_index}", "Name");}//第一行的其他列为多语言名称[zh-cn、en-us、.....]$excel->setCellValue(\PHPExcel_Cell::stringFromColumnIndex($row_index) . '1', $_key);//每个多语言都是单独一列foreach ($field_count as $key => $values) {//第一列为多语言字段名[从1开始,第1行为Name或多语言名称,因此这里从2开始]$excel->setCellValue('A' . ($key + 2), $field_count[$key]);//列索引$column_index = \PHPExcel_Cell::stringFromColumnIndex($row_index);$excel->setCellValue($column_index . '' . ($key + 2), $_value[$values]);}//end foreach$row_index++;}//end foreach } }
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
ThinkPhp 使用PhpExcel导出导入多语言文件相关推荐
- 如何使用 MySQL 的 IDE 导出导入数据表文件(以 Navicat for MySQL 导出导入 Excel 文件为例)
系列文章目录 关于更多 MySQL 数据库以及数据库 IDE 的问题大家可以移步本人专栏--MySQL 数据库. 文章目录 系列文章目录 前言 一.使用 Navicat 导出数据表 1.1.使用&qu ...
- php 利用 PHPExcel 导出 导入 Excel 方法介绍(功能介绍)
第一步 phpexcel官网上http://phpexcel.codeplex.com 下载最新的phpexcel类,下载解压缩后有一个classes文件夹,里面包含了PHPExcel.php和PHP ...
- php连接excel表格数据类型,TP5 中使用PHPExcel 导出导入数据到excel表格
将下载好的PHPExcel文件夹放置在框架中的Vendor目录下,注意目录的结构,按照我的代码来基本上直接引用就能使用,如下图: 导出数据代码如下 //导出数据表 开始 public function ...
- mysql 数据库导出导入到本地文件
借鉴:https://www.cnblogs.com/Jasper-changing/p/13924977.html 一.导出备份 1.mysqldump命令 mysqldump 是 MySQL 自带 ...
- PHPExcel导出导入问题”continue” targeting switch is equivalent to “break”.Did you mean to use “continue 2”?
在 php 7.3 的 switch 中使用 continue 会出现警告 1 2 3 最好的方式是把 \PHPExcel\Shared\OLE.php 文件中的 continue; 改为 conti ...
- php导出数据库为excel文件,phpexcel导出数据库成excel文件
error_reporting(E_ALL); date_default_timezone_set('Europe/London'); /** PHPExcel */ require_once '.. ...
- php导入excel源码,利用PHPExcel类库,实现PHP导出导入Excel表格Excel文件!
[温馨提示]源码包解压密码:www.youhutong.com 利用PHPExcel类库,实现PHP导出导入Excel文件!(案例教程源码) 需要注意的地方就是: 1.导出文件时,如果你的字段过多,可 ...
- thinkphp phpexcel导出
近期做一个项目涉及到商品信息的批量导出与导入,遂记录了下来,框架是tp框架3.2.3(tp5.0性质是一样的,无非是加载方法与所放目录不一样罢了),运用的是phpexcel,闲话不多说,上代码 1.首 ...
- 使用PHP导入Excel和导出数据为Excel文件
有时需要将Excel表格的数据导入到mysql数据库中,我们使用PHP的一个开源项目PHP-ExcelReader可以轻松实现Excel的导入.另外将mysql数据导出为Excel与本站上篇文章中导出 ...
最新文章
- 转: IO设计模式:Reactor和Proactor对比
- (十六)java springcloud版b2b2c社交电商spring cloud分布式微服务-使用spring cloud Bus刷新配置...
- linux zsh命令行vim命令补齐,Linux使用zsh提高效率的5条建议
- Struts工作原理
- 教学思路SQL之预备课程学习 建库、建表、建约束、关系、部分T-sql语句
- [iOS]利用通知实现监听系统键盘
- linux rpm和deb的区别,rpm与deb的区别
- python chrome headless_[技巧] chrome headless 爬虫抓取websoket 数据
- JavaScript ECMA
- java word模版填充_[转载]java向word模板中填充数据(总结)
- export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...
- 在使用SVN,下载文件到本地时,一定要把全目录下载下来!
- 素数筛法详解-列出1-n中的素数
- DNS解析出错导致网站在部分地区无法打开
- VS2019打包exe文件
- Linux:Lilo 设定档 /etc/lilo.conf
- 使用ethers.js执行读函数与写函数
- POSIX标准总体分析 执行调度 消息传递 调度参数 进程调度函数 关闭消息队列 得到消息队列参数 设置调度参数 时钟和定时器 时钟和定时器函数 消息传递函数 打开消息队列 设置消息队列参数
- Linux文件导入gitee仓库中
- C#实现在企业微信内发送消息给指定人员帮助类