最近收到一个很奇葩的需求,要求上传excel员工工资表,表格表头不固定,导入后字段名为表头的拼音,每月导入一次,当月重复导入则覆盖现有的当月表头,并且可以按照在界面上按照月份筛选显示,我写的代码主要包含了几个稍微复杂的地方:

1、excel文件导入后表头汉字转拼音作为字段名

2、phpexcel类读取excel文件中如果列数超过26个(也就是超出A-Z的范围)

3、当月数据上传多次,最近一次会覆盖上一次的全部数据,并且字段重新建立

下面是我实现的代码,包含了phpexcel类,数据库类,上传类,这些类文件可以网上找到,所以不再贴出来

 <?php
include_once("PHPExcel.php");//引入PHP EXCEL类
include_once("medoo.php");//引入数据库类
include_once("UploadFile.php");//引入上传类
define ('UPLOAD_PATH','./Uploads/');
$fieldArr = array('shenfenzhenghao', 'zhigongbianhao', 'gongjijinzhanghao', 'danwei', 'banzu', 'xingming'); if (isset($_FILES['excel']['size']) && $_FILES['excel']['size'] != null) {
$upload = new UploadFile();
$upload->maxSize = 10240000;
$upload->allowExts = array('xls');
$dirname = UPLOAD_PATH . date('Ym', time()).'/'.date('d', time()).'/';
if (!is_dir($dirname) && !mkdir($dirname, 0777, true)) {
echo '<script type="text/javascript">alert("目录没有写入权限!!");</script>';
}
$upload->savePath = $dirname;
$message = $upload->getErrorMsg();
if(!$upload->upload()) {
echo '<script type="text/javascript">alert("{$message}");</script>';
}else{
$info = $upload->getUploadFileInfo();
} if(is_array($info[0]) && !empty($info[0])){
$savePath = $dirname . $info[0]['savename'];
}else{
echo '<script type="text/javascript">alert("上传失败");</script>';
}; if(empty($savePath) or !file_exists($savePath)){die('file not exists');}
$PHPReader = new PHPExcel_Reader_Excel2007(); //建立reader对象
if(!$PHPReader->canRead($savePath)){
$PHPReader = new PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($savePath)){
echo 'no Excel';
return ;
}
}
$PHPExcel = $PHPReader->load($savePath); //建立excel对象
$currentSheet = $PHPExcel->getSheet(0); //**读取excel文件中的指定工作表*/
$allColumn = $currentSheet->getHighestColumn(); //**取得最大的列号*/
$allRow = $currentSheet->getHighestRow(); //**取得一共有多少行*/
$data = array();
$row = 1;
$rowOne = $rowArr = $main = $time = array();
$i = 0;
// 取出excel第一行全部字段
while(stringFromColumnIndex($i) != $allColumn) {
$addr = stringFromColumnIndex($i) . $row;
$cell = (String)$currentSheet->getCell($addr)->getValue();
if($cell instanceof PHPExcel_RichText){ //富文本转换字符串
$cell = $cell->__toString();
}
$rowOne[$row][stringFromColumnIndex($i)] = $cell;
$i++;
}
$cell = (String)$currentSheet->getCell($allColumn . $row)->getValue();
$rowOne[$row][$allColumn] = $cell; $newArr = array();
foreach($rowOne[1] as $key => $value) {
$tmp = Pinyin($value,'utf-8');
if(!in_array($tmp, $fieldArr)) {
$newArr[$key] = $tmp;
}
}
$db = new medoo(array(
'database_type' => 'mysql',
'database_name' => 'gzoa',
'server' => '127.0.0.1',
'username' => 'root',
'password' => '',
'port' => 3306,
'charset' => 'utf8',
'option' => array(PDO::ATTR_CASE => PDO::CASE_NATURAL)
)); $time = date("Ym", time());
$result = $db->select("fields", ["field_id","field","name"], ["time[=]" => $time]);
if(!empty($result)) {
$db->query("delete from fields where time = {$time}");
}
foreach($newArr as $key => $value) {
$insertData = array(
'is_main' => 0,
'field' => $value,
'name' => $rowOne[1][$key],
'form_type' => 'number',
'time' => $time
);
$db->insert("fields", $insertData);
} $infoArr = array();
foreach($newArr as $key => $value) {
foreach($rowOne[1] as $list => $content) {
if($key == $list) {
$infoArr[$value] = $content;
}
}
}
$infoSql = '';
foreach($infoArr as $key => $value) {
if(!empty($value)) {
$infoSql .= "`{$key}` float(25,2) NOT NULL COMMENT '{$value}',";
}
}
$infoSql = rtrim($infoSql, ','); $db->query("DROP TABLE `info_{$time}`"); $db->query("CREATE TABLE IF NOT EXISTS `info_{$time}` (
`userid` int(10) unsigned NOT NULL COMMENT '用户id',
`groupid` int(10) unsigned NOT NULL COMMENT '用户分组id', {$infoSql}
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;"); $field_list = $db->select("fields", ["field_id","field","name"], ["OR" => ["is_main[=]" => 1,"time[=]" => $time]]);
foreach($field_list as $key => $value) {
foreach($rowOne[1] as $list => $content) {
if($content == $value['name']) {
$rowArr[$list] = $value['field'];
}
}
} $db->query("delete from info where time = {$time}");
for($rowIndex=2;$rowIndex<=$allRow;$rowIndex++){ //循环读取每个单元格的内容。注意行从1开始,列从A开始 $i = 0;
// 取出excel第一行全部字段
while(stringFromColumnIndex($i) != $allColumn) {
$colnum = stringFromColumnIndex($i);
$addr = stringFromColumnIndex($i) . $rowIndex;
$cell = (String)$currentSheet->getCell($addr)->getValue();
if($cell instanceof PHPExcel_RichText){ //富文本转换字符串
$cell = $cell->__toString();
}
if(!empty($cell)) {
if(in_array($rowArr[$colnum], $fieldArr)) {
$data1[$rowArr[$colnum]] = $cell;
} else {
$data2[$rowArr[$colnum]] = $cell;
}
}
$i++;
}
$cell = (String)$currentSheet->getCell($allColumn . $allRow)->getValue();
if(!empty($cell)) {
if(in_array($rowArr[$allColumn], $fieldArr)) {
$data1[$rowArr[$allColumn]] = $cell;
} else {
$data2[$rowArr[$allColumn]] = $cell;
}
} $data1['time'] = $time;
$data1['groupid'] = $data2['groupid'] = 0;//设置信息分组id
$name = isset($data1['xingming']) ? $data1['xingming'] : '';//判断如果帐号不存在,则创建帐号,默认密码123456
$result = $db->select("admin", ["id","uid","username"], ["username[=]" => $name]);
if(empty($result)) {
$adminData = array(
'uid' => 3,
'username' => $name,
'password' => md5('123456')
);
$db->insert("admin", $adminData);
}
$userid = $db->insert("info", $data1);
if($userid) {
$data2['userid'] = $userid;
$last_user_id = $db->insert("info_{$time}", $data2);
}
}
echo "<script language=javascript>" .
"alert('上传成功!'),parent.location.href='../main.php' " .
"</script>";
} function stringFromColumnIndex($pColumnIndex = 0)
{
static $_indexCache = array(); if (!isset($_indexCache[$pColumnIndex])) {
if ($pColumnIndex < 26) {
$_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex);
} elseif ($pColumnIndex < 702) {
$_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) . chr(65 + $pColumnIndex % 26);
} else { //开源软件:phpfensi.com
$_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676)) . chr(65 + ((($pColumnIndex - 26) % 676) / 26)) . chr(65 + $pColumnIndex % 26);
}
}
return $_indexCache[$pColumnIndex];
} ?>

php读取excel文件并导入数据库(表头任意设定)的更多相关文章

  1. java读取excel文件数据导入mysql数据库

    这是我来公司的第二周的一个小学习任务,下面是实现过程: 1.建立maven工程(方便管理jar包) 在pom.xml导入 jxl,mysql-connector 依赖 可以在maven仓库搜索 2.建 ...

  2. jsp上传excel文件并导入数据库

    1,excel文件的上传 需要借助jar包:commons-fileupload-1.2.1.jar以及commons-io-1.3.2.jar 前端的html文件 <form id=" ...

  3. java后端服务器读取excel将数据导入数据库

    使用的是easypoi,官网文档:http://easypoi.mydoc.io/ /** * 导入Excel文件 */ @PostMapping("/importTeacher" ...

  4. larave5.6 将Excel文件数据导入数据库代码实例

    <?php namespace App\Admin\Controllers; use App\AdminUser; use Illuminate\Http\Request; use Excel; ...

  5. Excel文件数据导入到后台保存倒数据库

    后台代码数据解析: 方法一: (简单点) import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermo ...

  6. POI读取Excel数据保存到数据库,并反馈给用户处理信息(导入带模板的数据)

    今天遇到这么一个需求,将课程信息以Excel的形式导入数据库,并且课程编号再数据库中不能重复,也就是我们需要先读取Excel提取信息之后保存到数据库,并将处理的信息反馈给用户.于是想到了POI读取文件 ...

  7. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  8. springMVC(5)---导入excel文件数据到数据库

    springMVC(5)---导入excel文件数据到数据库 上一篇文章写了从数据库导出数据到excel文件,这篇文章悄悄相反,写的是导入excel文件数据到数据库.上一篇链接:springMVC(4 ...

  9. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

随机推荐

  1. vue父组件异步获取动态数据传递给子组件获取不到值

    原理: 在父组件中使用axios获取异步数据传给子组件,但是发现子组件在渲染的时候并没有数据,在created里面打印也是空的,结果发现一开始子组件绑定的数据是空的,在请求数据没有返回数据时,子组件就 ...

  2. 引用自定义的css或者js文件

    用script标签,src是js文件路径 <script type="text/javascript" src="./js/udc.js">< ...

  3. layui.form is not a function

    改变: var form = layui.form; 如果你是从1.x升级2.x造成的,那只需要在定义的时候吧后面的()去掉就可以了.请关注更新日志:1.x 升 2.0 特别注意事项layDate日期 ...

  4. node.js入门学习(五)--Demo模块化改造

    1.node.js中模块的分类 1)node.js内置模块(核心,原生) 所有内置模块在安装node.js时就已经编译成二进制文件,可以直接加载运行(速度较快),部分内置模块,在node.exe这个进 ...

  5. XML 简介 – 什么是 XML?

    XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML 很重要,也很容易学习. <?xml version="1 ...

  6. jsp页面实现上传文件,并且还得支持断点续传的功能

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  7. POJ 2155 Matrix (树状数组 && 区间计数)

    题意 : 给出一个N*N的矩阵, 矩阵只有可能包含0或1, 一开始则全部是0.对于矩阵可以进行两种操作, 第一种是输入 C x1 y1 x2 y2 表示, 对以(x1, y1)为左上角, 以(x2, ...

  8. 详解cocos2dx 3.0的release版本在android平台的签名过程

    当您的游戏准备发布前,需要编译成为release版本,命令中需要增加 -m release,编译命令如下: cocos compile -p android -m release 在编译结束后,生成x ...

  9. VS Code报错Module 'xx' has no 'xx' member pylint(no-member)解决办法

    pylint是vscode的python语法检查器,pylint是静态检查,在用第三方库的时候有些成员只有在运行代码的时候才会被建立,它就找不到成员,在设置(settings.json)里添加 &qu ...

  10. ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'ambari'

    配置Ambari远程maridb 报错: ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'ambari' ...