thinkPHP3.2 Excel的导入和导出以及Word的导出

最近处理数据的时候,用到了Excel文件导入导出数据库,导出word形式的数据的操作,经过一番努力,理清了整个过程,将收获的东西写在这里


Excel导入数据库

程序员直接操作数据库导入数据

写项目的时候,如果要测试大量的数据,通过向数据库一条一条添加数据显然是不合适的,这时候就要大批导入数据了,直接上图片演示过程
来源:Excel导入到phpmyadmin

thinkPHP3.2 Excel的导入和导出以及Word的导出_第1张图片

thinkPHP3.2 Excel的导入和导出以及Word的导出_第2张图片

thinkPHP3.2 Excel的导入和导出以及Word的导出_第3张图片

字段与要导入的文件相同

thinkPHP3.2 Excel的导入和导出以及Word的导出_第4张图片

用户通过界面导入数据

作为不能直接访问数据库的用户,要通过所提供的借口来对数据库进行间接的操作。首先明确Excel文件在数据库中的存储形式:在数据库中,一张表由许多字段组成,一行记录与Excel的表格的一行相对应,字段与列相对应。要实现导入,关键在于怎样将Excel表中的信息转化为数据库中的记录,代码如下

//Common/funciton
function importExcel($tableName,$title,$savePath="Public/Excel/")
{   
    import('ORG.Util.ExcelToArrary');//导入excelToArray类
    $tmp_file = $_FILES ['excel'] ['tmp_name'];
    $file_types = explode ( ".", $_FILES ['excel'] ['name'] );
    $file_type = $file_types [count ( $file_types ) - 1];
     /*判别是不是.xls文件,判别是不是excel文件*/
    if (strtolower ( $file_type ) != "xlsx" && strtolower ( $file_type ) != "xls")              
    {
        $rs='不是Excel文件,重新上传';
        return $rs;
    }
    //检查是否有该文件夹,如果没有就创建,并给予最高权限 
    if(!file_exists($savePath)) 
    { 
        mkdir($savePath, 0700); 
    }//END IF
    /*以时间来命名上传的文件*/
    $str = date ( 'Ymdhis' ); 
    $file_name = $str . "." . $file_type;
    /*是否上传成功*/
    if (! copy ( $tmp_file, $savePath . $file_name )) 
    {
         $rs= '上传失败';
         return $rs;
    }
    $ExcelToArrary=new ExcelToArrary();//实例化
    $res=$ExcelToArrary->read($savePath.$file_name,"UTF-8",$file_type);//传参,判断office2007还是office2003
    foreach ( $res as $k => $v ) //循环excel表
    {
        if($k>1){
        $k=$k-2;//addAll方法要求数组必须有0索引
        for ($i=0; $title[$i]; $i++) { 
            $data[$k][$title[$i]] = $v [$i];//创建二维数组 
        }
        }
    }
    $model=M($tableName);//M方法
    $result=$model->addAll($data);
    if(! $result)
    {
         $rs='导入数据库失败';
    }
    else
    {
         $rs= '导入成功';    
    }
    return $rs;
}

控制器下的导入

   /**
     * 导入测试
     * 导入为Excel表格的形式
     */
    public function import(){
        $tableName="link";
        $title=array("id","linkname","linkadd","type");
        $result=importExcel($tableName,$title);
        $this->success($result);
    }

数据库中数据导出到Excel文件

与导入相似,关键在于怎样将数据库中的记录转化为Excel中的数据,代码如下

//Common/funciton
function exportExcel($data,$title,$subject){  
    Vendor("Excel.Util.PHPExcel");
    Vendor('Excel.PHPExcel.IOFactory');
    Vendor('Excel.PHPExcel.Reader.Excel5');
    // Create new PHPExcel object  
    $objPHPExcel = new PHPExcel();  
    // Set properties  
    $objPHPExcel->getProperties()->setCreator("ctos")  
        ->setLastModifiedBy("ctos")  
        ->setTitle("Office 2007 XLSX Test Document")  
        ->setSubject("Office 2007 XLSX Test Document")  
        ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")  
        ->setKeywords("office 2007 openxml php")  
        ->setCategory("Test result file");  
            $length1=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD');
    $length2=array('A1','B1','C1','D1','E1','F1','G1','H1','I1','J1','K1','L1','M1','N1','O1','P1','Q1','R1','S1','T1','U1','V1','W1','X1','Y1','Z1','AA1','AB1','AC1','AD1');
    //set width  
    for($a=0;$agetActiveSheet()->getColumnDimension($length1[$a])->setWidth(20); 
    }
    //set font size bold  
$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(10);  
$objPHPExcel->getActiveSheet()->getStyle($length2[0].':'.$length2[count($title)-1])->getFont()->setBold(true); 
$objPHPExcel->getActiveSheet()->getStyle($length2[0].':'.$length2[count($title)-1])->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle($length2[0].':'.$length2[count($title)-1])->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  
    // set table header content  
for($a=0;$asetActiveSheetIndex(0)->setCellValue($length2[$a], $title[$a]); 
}
for($i=0;$i0;
        foreach ($buffer as $value) {
            $objPHPExcel->getActiveSheet(0)->setCellValueExplicit($length1[$number].($i+2),$value,PHPExcel_Cell_DataType::TYPE_STRING);//设置单元格为文本格式
            $number++;
        }
        unset($value);
        $objPHPExcel->getActiveSheet()->getStyle($length1[0].($i+2).':'.$length1[$number-1].($i+2))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);  
        $objPHPExcel->getActiveSheet()->getStyle($length1[0].($i+2).':'.$length1[$number-1].($i+2))->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  
        $objPHPExcel->getActiveSheet()->getRowDimension($i+2)->setRowHeight(16);  
    }  
    // Set active sheet index to the first sheet, so Excel opens this as the first sheet  
    $objPHPExcel->setActiveSheetIndex(0);  
    ob_end_clean();//清除缓冲区,避免乱码
    // Redirect output to a client’s web browser (Excel5)  
    header('Content-Type: application/vnd.ms-excel');  
    header('Content-Disposition: attachment;filename='.$subject.'('.date('Y-m-d').').xls');  
    header('Cache-Control: max-age=0');  
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');  
    $objWriter->save('php://output');  
}3 

数据库中数据导出成word

首先明确:数据库导出word是通过将数据库中的数据通过html方式展现在表格中,重点是有了html下的word页面之后,如何提取出word,代码如下

/**
* 根据HTML代码获取word文档内容
* 创建一个本质为mht的文档,该函数会分析文件内容并从远程下载页面中的图片资源
* 该函数依赖于类WordMake
* 该函数会分析img标签,提取src的属性值。但是,src的属性值必须被引号包围,否则不能提取
*
* @param string $content HTML内容
* @param string $absolutePath 网页的绝对路径。如果HTML内容里的图片路径为相对路径,那么就需要填写这个参数,来让该函数自动填补成绝对路径。这个参数最后需要以/结束
* @param bool $isEraseLink 是否去掉HTML内容中的链接
*/
function WordMake( $content , $absolutePath = "" , $isEraseLink = true )
{
    import("@.Util.Wordmaker");
    $mht = new Wordmaker();
    if ($isEraseLink) {
        $content = preg_replace('/(\s*.*?\s*)<\/a>/i' , '$1' , $content);   //去掉链接
    }
    $images = array();
    $files = array();
    $matches = array();
    //这个算法要求src后的属性值必须使用引号括起来
    if ( preg_match_all('//i',$content ,$matches ) ) {
        $arrPath = $matches[1];
        for ( $i=0;$i$arrPath);$i++) {
            $path = $arrPath[$i];
            $imgPath = trim( $path );
            if ( $imgPath != "" ) {
                $files[] = $imgPath;
                if( substr($imgPath,0,7) == 'http://') {
                //绝对链接,不加前缀
                } else {
                    $imgPath = $absolutePath.$imgPath;
                }
                $images[] = $imgPath;
            }
        }
    }
    $mht->AddContents("tmp.html",$mht->GetMimeType("tmp.html"),$content);
    for ( $i=0;$i$images);$i++) {
        $image = $images[$i];
        if ( @fopen($image , 'r') ) {
            $imgcontent = @file_get_contents( $image );
            if ( $content )
            $mht->AddContents($files[$i],$mht->GetMimeType($image),$imgcontent);
        }
        else {
            echo "file:".$image." not exist!
"
; } } return $mht->GetFile(); }

你可能感兴趣的:(thinkphp基础)