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 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
$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
}
}



ThinkPhp 使用PhpExcel导出导入多语言文件的更多相关文章
- PHPExcel导出导入
便于记忆 这里写一个PHPexcel导出的demo 我们构造一个数据 $letter = array('A','B','D','E'); //sheet索引 $date = array( ar ...
- PHPExcel导出导入excel、csv等格式数据
<?php if(!defined('BASEPATH')) exit('No direct script access allowed'); //物资发料单明细 class Read_writ ...
- thinkphp使用PHPExcel导出
thinkphp3. 将PHPExcel下载包放在项目\ThinkPHP\Library\Vendor\PHPExcel thinkphp5 将PHPExcel下载包放在项目\vendor\PHPEx ...
- 用PHPExcel导出导入Excel
thinkPHP5.0框架 查询数据库调用Excel方法 public function exportlist(){ $orderModel = new OrderModel(); if($start ...
- Thinkphp解决phpExcel导出数据量大导致内存溢出
工作需要导出几万的数据量.操作比较频繁.之前数据在七八千是数据导出很慢.phpExcel是方便但是性能一般.现在改为使用csv导出数据:可以缓解内存压力,一次导出两三万是没问题的.当然服务器内存给力, ...
- CodeIgniterCodeigniter+PHPExcel导出数据到Excel文件
解压压缩包里的Classes文件夹中的内容到application\libraries\目录下,目录结构如下:--application\libraries\PHPExcel.php--applica ...
- phpexcel导出数据库成excel文件
<?php error_reporting(E_ALL); date_default_timezone_set('Europe/London'); /** PHPExcel */ require ...
- ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
这篇文章主要介绍了ThinkPHP使用PHPExcel实现Excel数据导入导出,非常实用的功能,需要的朋友可以参考下 本文所述实例是使用在Thinkphp的开发框架上,要是使用在其他框架也是同样的方 ...
- ThinkPHP 整合 PHPExcel ,数据导出功能实现,解决Invalid cell coordinate
PHPExcel想必大家都不陌生,是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格 本次只做数据导出功能的 ...
随机推荐
- python 全栈开发,Day114(装饰器,排序规则,显示列,添加按钮,定制ModelForm,自定义列表页面,自定制URL)
一.装饰器 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事务处理, ...
- 把linux文件夹压缩成tar.gz的命令
解压 tar zxvf 文件名.tar.gz 压缩 tar zcvf software.tar.gz /usr/local/software
- 【转】角落的开发工具集之Vs(Visual Studio)2017插件推荐
因为最近录制视频的缘故,很多朋友都在QQ群留言,或者微信公众号私信我,问我一些工具和一些插件啊,怎么使用的啊?那么今天我忙里偷闲整理一下清单,然后在这里面公布出来. Visual Studio 201 ...
- poj 2752 求一个字符串所有的相同前后缀
求一个字符串所有的相同前后缀Sample Input ababcababababcababaaaaaSample Output 2 4 9 181 2 3 4 5 #include <iostr ...
- Asp.Net Core 2.0 项目实战(4)ADO.NET操作数据库封装、 EF Core操作及实例
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- HTML页面滚动时获取离页面顶部的距离2种实现方法
获取离滚动页面的顶部距离有两种方法一是DOM:而是jquery,具体的实现如下,感兴趣的朋友可以尝试操作下 方法一:DOM 复制代码 代码如下: <script> window.o ...
- BZOJ1477 青蛙的约会 扩展欧几里德
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1477 题意概括 两只青蛙,现在分别在x,y的位置,以m,n的速度在周长为L的环形跑道上面跑. 问他 ...
- Flutter中打造多行列列表GridView组件的使用
GridView组件.一个可滚动的二维空间数组. 在使用无限加载滚动列表的时候,最先使用的还是ListView组件.但若是要一行显示2列或者更多列的滚动列表,GridView组件更为方便.如下 在向服 ...
- python有序字典OrderedDict()
转python创建有序字典OrderedDict # -*- coding:utf-8 -*- """ python有序字典 需导入模块collections " ...
- Spring MVC 注解 @RequestParam解析
在Spring MVC 后台控制层获取参数的方式主要有两种,一种是requset.getParameter(“name”),另一种是用注解@Resquest.Param直接获取. 一.基本使用获取提交 ...