PHP 批量导出数据

/*********************************************方法一******************************************************/
/**
 * 批量导出数据
 * @param $arr  从数据库查询出来,即要导出的数据
 *        $name  excel表格名
 */
function expExcel($arr,$name){

    require_once dirname(__FILE__) . '/../Classes/PHPExcel.php';
    require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php';
    require_once dirname(__FILE__) . '/../Classes/PHPExcel/Reader/Excel5.php';
//        require_once dirname(__FILE__) . '/../Classes/PHPExcel/Reader/Excel2007.php';
    //实例化
    $objPHPExcel = new PHPExcel();
    /*右键属性所显示的信息*/
    $objPHPExcel->getProperties()->setCreator("zxf")       //作者
    ->setLastModifiedBy("zxf")       //最后一次保存者
    ->setTitle('数据EXCEL导出')      //标题
    ->setSubject('数据EXCEL导出')    //主题
    ->setDescription('导出数据')     //描述
    ->setKeywords("excel")           //标记
    ->setCategory("result file");     //类别


    //设置当前的表格
    $objPHPExcel->setActiveSheetIndex(0);
    // 设置表格第一行显示内容
    $objPHPExcel->getActiveSheet()
        ->setCellValue('A1', '序号')
        ->setCellValue('B1', '区域类型')
        ->setCellValue('C1', '显示顺序')
        ->setCellValue('D1', '区域名称');
    //设置第一行为红色字体
//        ->getStyle('A1:K1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
//        ->getStyle('A1:D1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
    // 设置默认字体和大小
    $objPHPExcel->getDefaultStyle()->getFont()->setName('宋体');
    $objPHPExcel->getDefaultStyle()->getFont()->setSize(12);
    //单元格居中
    $objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $objPHPExcel->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

    $key = 1;
    /*以下就是对处理Excel里的数据,横着取数据*/
    foreach($arr as $v){
//        print_r($v);
        //设置循环从第二行开始
        $key++;
        $objPHPExcel->getActiveSheet()->getStyle('C'.$key)->getAlignment()->setWrapText(true);
        $objPHPExcel->getActiveSheet()
            //Excel的第A列,name是你查出数组的键值字段,下面以此类推
            ->setCellValue('A'.$key, $key-1)
            ->setCellValue('B'.$key, $v['PMP_TypeName'])
            ->setCellValue('C'.$key, $v['PMV_Index'])
            ->setCellValue('D'.$key, $v['PMV_Name']);
    }
    //设置单元格宽度
    $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8);
    $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
    $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);
    $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(15);
    //设置当前的表格
    $objPHPExcel->setActiveSheetIndex(0);
    ob_end_clean();     //清除缓冲区,避免乱码
    header('Content-Type: application/vnd.ms-excel');  //文件类型
    header('Content-Disposition: attachment;filename="'.$name.'.xls"');    //文件名
    header('Cache-Control: max-age=0');
    header('Content-Type: text/html; charset=utf-8');  //编码

    //返回已经存好的文件目录地址提供下载
    $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
    $response = array(
        'success' => true,
        'url' => saveExcelToLocalFile($objWriter,$name)
    );
    echo json_encode($response);
    exit;
}
 
//生成xls文件并存入当前文件目录
function saveExcelToLocalFile($objWriter,$filename){
    // make sure you have permission to write to directory
    $filePath = 'download/'.$filename.'.xls';
    $objWriter->save($filePath);
    return $filePath;
}

/************************************************************************方法二***********************************************************/

function mod_excel()
{
    global $row_User;
   // 条件查询
    $wheresql1 = $wheresql = getQueryCondition();
  //编写SQL语句
    $sql = "select * from (select row_number()over(order by OYP_ID DESC )row, 
    TcQueryPlat.* FROM (
        SELECT FlowDataV.MFL_ID, MAX(MP_InstanceNode.MIN_ID) AS MIN_ID, MAX(MP_InstanceNode.MFN_ID) AS MFN_ID
            , MP_FlowInstance.MFV_ID, FlowDataV.MFL_State, FlowDataV.MFL_Title, OY.OYP_PayDept, OY.OYP_PayPerson,OEP_Name
            , OEP_Count, OEP_Price, OEP_PlanDate, OEP_User, OEP_Remark,OY.OYP_ID,SFD_Name
        FROM FlowDataV
            JOIN MP_InstanceNode ON FlowDataV.MFL_ID = MP_InstanceNode.MFL_ID
            JOIN MP_FlowINstance ON FlowDataV.MFL_ID = MP_FlowINstance.MFL_ID
            JOIN OA_YearEquipmentPlan OY ON FlowDataV.MFI_DataID = OY.OYP_ID
            JOIN OA_EquipmentPlan OP ON OY.OYP_ID = OP.OYP_ID
            JOIN SF_Department ON SF_Department.SFD_ID = OY.OYP_PayDept
        WHERE FlowDataV.MWF_Code = 'OA_YearEquipmentPlan'
            AND FlowDataV.MFL_State = 'Finish'
        GROUP BY FlowDataV.MFL_ID, MP_FlowInstance.MFV_ID, FlowDataV.MFL_State, FlowDataV.MFL_Title,                   OY.OYP_PayDept,OY.OYP_PayPerson,OY.OYP_ID, OEP_Name, OEP_Count, OEP_Price, OEP_PlanDate, OEP_User, OEP_Remark,SFD_Name
    ) TcQueryPlat WHERE $wheresql1) as t";

    $cursor = mssqlquery($sql);
    $i = 0;
    $result = array();
    for($i=0;$i<8;$i++){
        $maxColWidth[$i]=0;
    }
    $jj=0;
   // 解析执行的SQL结果,回去想要的数据
    while ($row = sqlsrv_fetch_array($cursor, SQLSRV_FETCH_ASSOC)) {
        $jj++;
        $result[] = array(
            'OEP_ID' => $jj,
            'SFD_Name' => iconv("GBK", "UTF-8", $row["SFD_Name"]),   //部门
            'OEP_PlanDate' => $row['OEP_PlanDate'],     //购置时间
            'OEP_Name' => iconv("GBK", "UTF-8", $row["OEP_Name"]),     //资产名称
            'OEP_Count' => floatval($row["OEP_Count"]),     //数量
            'OEP_Price' =>floatval($row["OEP_Price"]),     //单价
            'SFU_Name' => iconv("GBK", "UTF-8", $row["OEP_User"]),   //领用人
            'OEP_Remark' => iconv("GBK", "UTF-8", $row["OEP_Remark"]),   //备注
        );
    }
    foreach ($result as $row) {
        $key=0;
        foreach ($row as $v) {
            $len1 = (strlen($v) + mb_strlen($v, 'UTF8')) / 2;
            if ($maxColWidth[$key] < $len1) {
                $maxColWidth[$key] = $len1;
            }
            $key++;
        }
    }
   // 将获取对应的数据的列名称按顺序写好(要与$result数据一一对应)
    $headList = [
        '序号'=>'string',
        '部门'=>'string',
        '购置时间'=>'date',
        '资产名称'=>'string',
        '数量'=>'',
        '单价'=>'',
        '领用人'=>'string',
        '备注'=>'string',
    ];
    $ii=0;
    foreach ($headList as $key => $v){
        $len1=(strlen($key) + mb_strlen($key,'UTF8')) / 2;
        if($maxColWidth[$ii]<$len1){
            $maxColWidth[$ii]=$len1;
        }
        $ii++;
    }
    $maxWidth = 9;
    foreach ($maxColWidth as $key => $v){
        $width = (($v * $maxWidth + 39) / $maxWidth * 256) / 256;
        $maxColWidth[$key] = (int)($width+0.5);
        if($maxColWidth[$key]>45){
            $maxColWidth[$key]=45;
        }
    }

    set_time_limit(0);
    ini_set("memory_limit","512M");
    $styles = array( 'font'=>'宋体','font-size'=>12,'border'=>'left,right,top,bottom','border-style' => 'thin');
    $writer = new XLSXWriter();
    $writer->writeSheetHeader('Sheet1', $headList, $col_options = ['widths' => $maxColWidth, 'font'=>'宋体','font-size'=>12, 'halign'=>'center','border'=>'left,right,top,bottom','border-style' => 'thin'] );
    foreach($result as $row)
    {
        $writer->writeSheetRow('Sheet1', $row, $styles );
    }
    $filename = 'download/'.get_date('YmdHis',PHP_TIME).'.xlsx';
    $writer->writeToFile($filename);
    header('Content-type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.xls"');
    $response = array(
        'success' => true,
        'url' => $filename
    );
    echo json_encode($response);
    exit;
}

猜你喜欢

转载自blog.csdn.net/weixin_39494923/article/details/79630802