ajax 上传excel文件 并用 PHPEXCEL 将excel数据导入数据库
/// 后台上传操作,并phpexcel处理数据成数组
public function upload(){
$Reader_M = D("Readers");
$istea = I("post.istea",0,intval);
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('xls');// 设置附件上传类型
$upload->rootPath = 'Public/upload/'; // 设置附件上传根目录
$upload->savePath = ''; // 设置附件上传(子)目录
$upload->hash = false;
// 上传文件
$info = $upload->upload();
//开始读取文档
import("Org.Util.PHPExcel");
$filename="Public/upload/".$info['file']['savepath'].$info['file']['savename'];
$PHPExcel = new \PHPExcel();
import("Org.Util.PHPExcel.Reader.Excel5");
import("Org.Util.PHPExcel.Reader.Excel2007");
$PHPReader = new \PHPExcel_Reader_Excel2007();
if (!$PHPReader->canRead($filename)) {
$PHPReader = new \PHPExcel_Reader_Excel5();
if (!$PHPReader->canRead($filename)){
return false;
}
}
$E = $PHPReader->load($filename);
$currentSheet=$E->getSheet(0);
//获取总列数
$allColumn=$currentSheet->getHighestColumn();
//获取总行数
$allRow=$currentSheet->getHighestRow();
//循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
for($currentRow=2;$currentRow<=$allRow;$currentRow++){
//从哪列开始,A表示第一列
for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
//数据坐标
$address=$currentColumn.$currentRow;
//读取到的数据,保存到数组$arr中
$arr[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue();
}
}
unlink($filename); // 删除上传文件
rmdir($upload->rootPath.$info['file']['savepath']); // 删除上传时创建的文件夹
//遍历数组$arr 加入数据库 Readers
$msg = array();
foreach ($arr as $k => $v) {
$info=$condition=array();
$text="";
if ($v["A"]) {
$text = $v["A"]." ".$v["B"]." ".$v["C"]." ".$v["D"]." ";
$condition = array("number"=>$v["A"]);
$re = $Reader_M->getOneinfo($condition);
if ($re) {
if ($istea) {
$msg[] = array("status"=>0,"msg"=>"职工号已存在
","text"=>$text);
}else{
$msg[] = array("status"=>0,"msg"=>"学号已存在
","text"=>$text);
}
continue;
}else{
if ($v["D"]) {
$condition = array("cardno"=>$v["D"]);
$re = $Reader_M->getOneinfo($condition);
if ($re) {
$msg[] = array("status"=>0,"msg"=>"读者证号已存在
","text"=>$text);
continue;
}else{
$info["cardno"] = $v["D"];
}
}else{
$info["cardno"] = $v["A"];
}
$info["number"] = $v["A"];
$info["name"] =$v["B"];
$info["class"] =$v["C"];
$info["istea"] = $istea;
$info["addtime"] = time();
$res = $Reader_M->Add($info);
if ($res) {
$msg[] = array("status"=>1,"msg"=>"导入成功
","text"=>$text);
continue;
}else{
$msg[] = array("status"=>0,"msg"=>"导入失败
","text"=>$text);
continue;
}
}
}
}
$this->ajaxReturn($msg);
}
// 前台页面调用js方法
function doUpload() {
var formData = new FormData($( "#form1" )[0]);
$.ajax({
url: "{:U('Upload/upload')}",
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (msg) {
$("#msg").html('');
$.each(msg,function(e,val){
if (val.status) {
$("#msg").append(" "+val.text+val.msg+"
}else{
$("#msg").append(" "+val.text+val.msg+"
};
})
}
});
return false;
}
如何实现li列表中显示文字强制不换行,大于li宽度自动隐藏文字,这种效果在新闻列表中时很实用的,下面有个不错的示例,大家可以参考下
代码如下:
li{
display:block;
font-size:14px;
height:16px;
line-height:16px;
width:330px;
white-space:nowrap; //强制不换行
overflow:hidden; //自动隐藏文字
text-overflow: ellipsis; //文字隐藏后添加省略号
-o-text-overflow:ellipsis; //适用于opera浏览器
}
涉及关键属性的语法:
1、语法:
text-overflow : clip | ellipsis
参数:
clip : 不显示省略标记(...),而是简单的裁切
ellipsis : 当对象内文本溢出时显示省略标记(...)
2、
语法:
overflow : visible | auto | hidden | scroll
参数:
visible : 不剪切内容也不添加滚动条。假如显式声明此默认值,对象将被剪切为包含对象的window或frame的大小。并且clip属性设置将失效
auto : 此为body对象和textarea的默认值。在需要时剪切内容并添加滚动条
hidden : 不显示超过对象尺寸的内容
scroll : 总是显示滚动条
3、
语法:
white-space : normal | pre | nowrap
参数:
normal : 默认处理方式
pre : 用等宽字体显示预先格式化的文本。不合并字间的空白距离和进行两端对齐。参阅pre对象
nowrap : 强制在同一行内显示所有文本,直到文本结束或者遭遇br对象。参阅td,div等对象的nowrap属性(特性)
attr 未指定元素获取/增加属性
$(“p”).arr(“id”) 获取p标签的id值
$(“p”).arr(“id”,5) 设置p标签的id值为5
$(“p”).arr(“id”,function(){
return 5;
}) 以函数返回值的形式设置p标签的id值
$(“p”).arr({“id”:5,”class”:”name”}) 批量设置p标签的属性值
POST xxxx 404 (Not Found) jquery.min.js:4
1、后台语句有误,thinkphp里 常见sql语句错误加了“;”
2、请求参数有误
更新字段
如果只是更新个别字段的值,可以使用setField方法。
使用示例:
$User = M("User"); // 实例化User对象
// 更改用户的name值
$User-> where('id=5')->setField('name','ThinkPHP');
setField方法支持同时更新多个字段,只需要传入数组即可,例如:
$User = M("User"); // 实例化User对象
// 更改用户的name和email的值
$data = array('name'=>'ThinkPHP','email'=>'[email protected]');
$User-> where('id=5')->setField($data);
而对于统计字段(通常指的是数字类型)的更新,系统还提供了setInc和setDec方法。
$User = M("User"); // 实例化User对象
$User->where('id=5')->setInc('score',3); // 用户的积分加3
$User->where('id=5')->setInc('score'); // 用户的积分加1
$User->where('id=5')->setDec('score',5); // 用户的积分减5
$User->where('id=5')->setDec('score'); // 用户的积分减1
js 字符串截取函数及用法
1.substr(start,length)
start 整数,起始位置,可为负数
length 要截取的字符串长度
2.substring(start,stop)
start 起始位置,不能为负数
stop 结束位置,不能为负数
3.slice(start,stop)
start 起始位置,可为负数
stop 结束位置,可为负数
String 对象的方法 slice()、substring() 和 substr() (不建议使用)都可返回字符串的指定部分。slice() 比 substring() 要灵活一些,因为它允许使用负数作为参数。slice() 与 substr() 有所不同,因为它用两个字符的位置来指定子串,而 substr() 则用字符位置和长度来指定子串。