切换导航条
此项目
正在载入...
登录
何书鹏
/
salarycalculator
·
提交
转到一个项目
GitLab
转到仪表盘
项目
活动
文件
提交
管道
0
构建
0
图表
里程碑
问题
0
合并请求
0
成员
标记
维基
派生
网络
创建新的问题
下载为
邮件补丁
差异文件
浏览文件
作者
PPPSCN
6 years ago
提交者
Karson
6 years ago
提交
93f8f46eab6ba831ebecf1852fd86ef6c445c99c
1 个父辈
2bfd1926
优化导入import方法(废弃phpoffice/phpexcel改用phpoffice/phpspreadsheet)
优化批量更新multi方法
隐藏空白字符变更
内嵌
并排对比
正在显示
2 个修改的文件
包含
90 行增加
和
36 行删除
application/admin/library/traits/Backend.php
composer.json
application/admin/library/traits/Backend.php
查看文件 @
93f8f46
...
...
@@ -2,6 +2,11 @@
namespace
app\admin\library\traits
;
use
app\admin\library\Auth
;
use
PhpOffice\PhpSpreadsheet\Cell\Coordinate
;
use
PhpOffice\PhpSpreadsheet\Reader\Xlsx
;
use
PhpOffice\PhpSpreadsheet\Reader\Xls
;
use
PhpOffice\PhpSpreadsheet\Reader\Csv
;
trait
Backend
{
...
...
@@ -258,10 +263,8 @@ trait Backend
if
(
$ids
)
{
if
(
$this
->
request
->
has
(
'params'
))
{
parse_str
(
$this
->
request
->
post
(
"params"
),
$values
);
if
(
!
$this
->
auth
->
isSuperAdmin
())
{
$values
=
array_intersect_key
(
$values
,
array_flip
(
is_array
(
$this
->
multiFields
)
?
$this
->
multiFields
:
explode
(
','
,
$this
->
multiFields
)));
}
if
(
$values
)
{
$values
=
array_intersect_key
(
$values
,
array_flip
(
is_array
(
$this
->
multiFields
)
?
$this
->
multiFields
:
explode
(
','
,
$this
->
multiFields
)));
if
(
$values
||
$this
->
auth
->
isSuperAdmin
())
{
$adminIds
=
$this
->
getDataLimitAdminIds
();
if
(
is_array
(
$adminIds
))
{
$this
->
model
->
where
(
$this
->
dataLimitField
,
'in'
,
$adminIds
);
...
...
@@ -297,15 +300,36 @@ trait Backend
if
(
!
is_file
(
$filePath
))
{
$this
->
error
(
__
(
'No results were found'
));
}
$PHPReader
=
new
\PHPExcel_Reader_Excel2007
();
if
(
!
$PHPReader
->
canRead
(
$filePath
))
{
$PHPReader
=
new
\PHPExcel_Reader_Excel5
();
if
(
!
$PHPReader
->
canRead
(
$filePath
))
{
$PHPReader
=
new
\PHPExcel_Reader_CSV
();
if
(
!
$PHPReader
->
canRead
(
$filePath
))
{
$this
->
error
(
__
(
'Unknown data format'
));
//实例化reader
$ext
=
pathinfo
(
$filePath
,
PATHINFO_EXTENSION
);
if
(
!
in_array
(
$ext
,
[
'csv'
,
'xls'
,
'xlsx'
]))
{
$this
->
error
(
__
(
'Unknown data format'
));
}
if
(
$ext
===
'csv'
)
{
$file
=
fopen
(
$filePath
,
'r'
);
$filePath
=
tempnam
(
sys_get_temp_dir
(),
'import_csv'
);
$fp
=
fopen
(
$filePath
,
"w"
);
$n
=
0
;
while
(
$line
=
fgets
(
$file
))
{
$line
=
rtrim
(
$line
,
"
\n\r\0
"
);
$encoding
=
mb_detect_encoding
(
$line
,
[
'utf-8'
,
'gbk'
,
'latin1'
,
'big5'
]);
if
(
$encoding
!=
'utf-8'
)
{
$line
=
mb_convert_encoding
(
$line
,
'utf-8'
,
$encoding
);
}
if
(
$n
==
0
||
preg_match
(
'/^".*"$/'
,
$line
))
{
fwrite
(
$fp
,
$line
.
"
\n
"
);
}
else
{
fwrite
(
$fp
,
'"'
.
str_replace
([
'"'
,
','
],
[
'""'
,
'","'
],
$line
)
.
"
\"\n
"
);
}
$n
++
;
}
fclose
(
$file
)
||
fclose
(
$fp
);
$reader
=
new
Csv
();
}
elseif
(
$ext
===
'xls'
)
{
$reader
=
new
Xls
();
}
else
{
$reader
=
new
Xlsx
();
}
//导入文件首行类型,默认是注释,如果需要使用字段名称请使用name
...
...
@@ -323,42 +347,72 @@ trait Backend
}
}
$PHPExcel
=
$PHPReader
->
load
(
$filePath
);
//加载文件
$currentSheet
=
$PHPExcel
->
getSheet
(
0
);
//读取文件中的第一个工作表
$allColumn
=
$currentSheet
->
getHighestDataColumn
();
//取得最大的列号
$allRow
=
$currentSheet
->
getHighestRow
();
//取得一共有多少行
$maxColumnNumber
=
\PHPExcel_Cell
::
columnIndexFromString
(
$allColumn
);
for
(
$currentRow
=
1
;
$currentRow
<=
1
;
$currentRow
++
)
{
for
(
$currentColumn
=
0
;
$currentColumn
<
$maxColumnNumber
;
$currentColumn
++
)
{
$val
=
$currentSheet
->
getCellByColumnAndRow
(
$currentColumn
,
$currentRow
)
->
getValue
();
$fields
[]
=
$val
;
}
}
//加载文件
$insert
=
[];
for
(
$currentRow
=
2
;
$currentRow
<=
$allRow
;
$currentRow
++
)
{
$values
=
[];
for
(
$currentColumn
=
0
;
$currentColumn
<
$maxColumnNumber
;
$currentColumn
++
)
{
$val
=
$currentSheet
->
getCellByColumnAndRow
(
$currentColumn
,
$currentRow
)
->
getValue
();
$values
[]
=
is_null
(
$val
)
?
''
:
$val
;
try
{
if
(
!
$PHPExcel
=
$reader
->
load
(
$filePath
))
{
$this
->
error
(
__
(
'Unknown data format'
));
}
$row
=
[];
$temp
=
array_combine
(
$fields
,
$values
);
foreach
(
$temp
as
$k
=>
$v
)
{
if
(
isset
(
$fieldArr
[
$k
])
&&
$k
!==
''
)
{
$row
[
$fieldArr
[
$k
]]
=
$v
;
$currentSheet
=
$PHPExcel
->
getSheet
(
0
);
//读取文件中的第一个工作表
$allColumn
=
$currentSheet
->
getHighestDataColumn
();
//取得最大的列号
$allRow
=
$currentSheet
->
getHighestRow
();
//取得一共有多少行
$maxColumnNumber
=
Coordinate
::
columnIndexFromString
(
$allColumn
);
$fields
=
[];
for
(
$currentRow
=
1
;
$currentRow
<=
1
;
$currentRow
++
)
{
for
(
$currentColumn
=
1
;
$currentColumn
<=
$maxColumnNumber
;
$currentColumn
++
)
{
$val
=
$currentSheet
->
getCellByColumnAndRow
(
$currentColumn
,
$currentRow
)
->
getValue
();
$fields
[]
=
$val
;
}
}
if
(
$row
)
{
$insert
[]
=
$row
;
for
(
$currentRow
=
2
;
$currentRow
<=
$allRow
;
$currentRow
++
)
{
$values
=
[];
for
(
$currentColumn
=
1
;
$currentColumn
<=
$maxColumnNumber
;
$currentColumn
++
)
{
$val
=
$currentSheet
->
getCellByColumnAndRow
(
$currentColumn
,
$currentRow
)
->
getValue
();
$values
[]
=
is_null
(
$val
)
?
''
:
$val
;
}
$row
=
[];
$temp
=
array_combine
(
$fields
,
$values
);
foreach
(
$temp
as
$k
=>
$v
)
{
if
(
isset
(
$fieldArr
[
$k
])
&&
$k
!==
''
)
{
$row
[
$fieldArr
[
$k
]]
=
$v
;
}
}
if
(
$row
)
{
$insert
[]
=
$row
;
}
}
}
catch
(
Exception
$exception
)
{
$this
->
error
(
$exception
->
getMessage
());
}
if
(
!
$insert
)
{
$this
->
error
(
__
(
'No rows were updated'
));
}
try
{
//是否包含admin_id字段
$has_admin_id
=
false
;
foreach
(
$fieldArr
as
$name
=>
$key
)
{
if
(
$key
==
'admin_id'
)
{
$has_admin_id
=
true
;
break
;
}
}
if
(
$has_admin_id
)
{
$auth
=
Auth
::
instance
();
foreach
(
$insert
as
&
$val
)
{
if
(
!
isset
(
$val
[
'admin_id'
])
||
empty
(
$val
[
'admin_id'
]))
{
$val
[
'admin_id'
]
=
$auth
->
isLogin
()
?
$auth
->
id
:
0
;
}
}
}
$this
->
model
->
saveAll
(
$insert
);
}
catch
(
\think\exception\PDOException
$exception
)
{
$this
->
error
(
$exception
->
getMessage
());
$msg
=
$exception
->
getMessage
();
if
(
preg_match
(
"/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is"
,
$msg
,
$matches
))
{
$msg
=
"导入失败,包含【
{
$matches
[
1
]}
】的记录已存在
";
};
$this->error
(
$msg
);
} catch (\Exception
$e
) {
$this->error
(
$e->getMessage
());
}
...
...
composer.json
查看文件 @
93f8f46
...
...
@@ -24,7 +24,7 @@
"phpmailer/phpmailer"
:
"^5.2"
,
"karsonzhang/fastadmin-addons"
:
"~1.1.4"
,
"overtrue/pinyin"
:
"~3.0"
,
"phpoffice/php
excel"
:
"^1.8
"
"phpoffice/php
spreadsheet"
:
"^1.2
"
},
"config"
:
{
"preferred-install"
:
"dist"
...
...
请
注册
或
登录
后发表评论