一.业务需求

1.新增了销售合同金额的字段,但是老数据没有这个字段;所以销售合同金额从销售合同附件的各品种金额之和。

2.制作好excel字段模板,将此模板发送给销售业务部门来统计并完成excel表格数据

二.产品设计

三.UI设计

四.程序设计

1.使用php-excel插件封装ExcelHelper类,包括导出数据到excel和将excel数据导入数据库

<?php

namespace core\components;

use PHPExcel;
use PHPExcel_IOFactory;
use PHPExcel_Style_Alignment;
use PHPExcel_Reader_Excel5;
use PHPExcel_RichText;

class MyExcelHelper extends \yii\base\Component{

    /**
     * 将二维数组的数据转化为excel表格导出
     * @param $data
     * @param $excel_name
     * @param $headers
     * @param $options
     */
    public static function array2excel($data, $excel_name, $headers, $options, $style_options){
        $objPHPExcel = new PHPExcel();
        ob_start();

        if (!isset($options['creator'])){
            $objPHPExcel->getProperties()->setCreator('creator');
        }else{
            $objPHPExcel->getProperties()->setCreator($options['creator']);
        }

        if (isset($options['last_modified_by'])){
            $objPHPExcel->getProperties()->setCreator('last_modified_by');
        }else{
            $objPHPExcel->getProperties()->setCreator($options['last_modified_by']);
        }

        if (isset($options['title'])){
            $objPHPExcel->getProperties()->setCreator('title');
        }else{
            $objPHPExcel->getProperties()->setCreator($options['title']);
        }

        if (isset($options['subject'])){
            $objPHPExcel->getProperties()->setCreator('subject');
        }else{
            $objPHPExcel->getProperties()->setCreator($options['subject']);
        }

        if (isset($options['description'])){
            $objPHPExcel->getProperties()->setCreator('description');
        }else{
            $objPHPExcel->getProperties()->setCreator($options['description']);
        }

        if (isset($options['keywords'])){
            $objPHPExcel->getProperties()->setCreator('keywords');
        }else{
            $objPHPExcel->getProperties()->setCreator($options['keywords']);
        }

        if (isset($options['category'])){
            $objPHPExcel->getProperties()->setCreator('category');
        }else{
            $objPHPExcel->getProperties()->setCreator($options['category']);
        }

        $header_keys = array_keys($headers);

        foreach ($header_keys as $header_index => $header_key){
            $index_ascii = $header_index + 65;
            $index_chr = chr($index_ascii);
            $header_value = $headers[$header_key];
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($index_chr.'1', $header_value);
            $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension($index_chr)->setWidth(20);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle($index_chr.'1')->applyFromArray([
                'font'=>[
                    'bold' => true
                ],
                'alignment'=>[
                    'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER
                ]
            ]);
            if (isset($style_options['h_align'][$header_key])){
                if ($style_options['h_align'][$header_key] == 'left'){
                    $h_align = PHPExcel_Style_Alignment::HORIZONTAL_LEFT;
                }elseif ($style_options['h_align'][$header_key] == 'center'){
                    $h_align = PHPExcel_Style_Alignment::HORIZONTAL_CENTER;
                }elseif ($style_options['h_align'][$header_key] == 'right'){
                    $h_align = PHPExcel_Style_Alignment::HORIZONTAL_RIGHT;
                }else{
                    $h_align = PHPExcel_Style_Alignment::HORIZONTAL_CENTER;
                }
                $objPHPExcel->setActiveSheetIndex(0)->getStyle($index_chr)->applyFromArray([
                    'alignment'=>[
                        'horizontal' => $h_align
                    ]
                ]);
            }
        }

        $data_row_index = 2;
        foreach ($data as $row_index => $row){
            $data_keys = array_keys($row);
            foreach ($data_keys as $column_index => $data_key){
                if ($column_index>=26){
                    throw new \yii\base\Exception('EXCEL表格超过26列');
                }
                $index_ascii = $column_index + 65;
                $index_chr = chr($index_ascii);
                $value = $row[$data_key];
                $objPHPExcel->setActiveSheetIndex(0)->setCellValue($index_chr . $data_row_index, $value);
            }
            $data_row_index++;
        }

        if (isset($options['summary'])){
            $summary_keys = array_keys($options['summary']);
            foreach ($summary_keys as $summary_index => $summary_key){
                $index_ascii = $summary_index + 65;
                $index_chr = chr($index_ascii);
                $summary_flag = $options['summary'][$summary_key];
                if ($summary_flag){
                    $summary_value = \core\components\ArrayHelper::sumByColumn($data, $summary_key);
                    $objPHPExcel->setActiveSheetIndex(0)->setCellValue($index_chr . $data_row_index, $summary_value);
                }
            }
        }

        $objPHPExcel->setActiveSheetIndex(0);

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

        ob_end_clean();

        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="' . $excel_name . '.xls"');
        header('Cache-Control: max-age=0');

        $objWriter->save('php://output');
        exit;
    }

    /**
     * 将excel表格转化为二维数组的数据
     * @param $excel_path
     * @param $data
     * @param $header
     */
    public static function excel2array($excel_path, $header_keys){

        if(!file_exists($excel_path)){
            throw new \yii\base\Exception('该EXCEL不存在!');
        }
        $PHPReader = new \PHPExcel_Reader_Excel2007();
        if(!$PHPReader->canRead($excel_path)){
            $PHPReader = new PHPExcel_Reader_Excel5();
            if(!$PHPReader->canRead($excel_path)){
                throw new \yii\base\Exception('该EXCEL不可读');
            }
        }

        $PHPExcel = $PHPReader->load($excel_path);
        $currentSheet = $PHPExcel->getSheet(0);

        $max_column_index = $currentSheet->getHighestColumn();
        $max_row_index = $currentSheet->getHighestRow();

        $data = array();
        for($row_index=2; $row_index<=$max_row_index; $row_index++ ){
            for($column_chr='A'; $column_chr<=$max_column_index; $column_chr++){
                $column_ord = ord($column_chr);
                $column_index = $column_ord - 65;
                $key = $column_chr.$row_index;
                $value = $currentSheet->getCell($key)->getValue();
                if($value instanceof PHPExcel_RichText){
                    $value = $value->__toString();
                }

                $data[$row_index-1][$header_keys[$column_index]] = $value;
            }
        }
        return $data;
    }
}

  

2.使用命令模式编写控制台程序将excel的数据导入到数据库

<?php

namespace console\controllers;

use yii\console\Controller;
use Yii;

class SalesContractController extends Controller
{
    public function actionUploadExcel(){
        $excel_path = './console/excels/sales_contract.xlsx';
        $header_keys = ['sales_contract_code', 'sales_customers_name', 'sales_contract_sum_weight'];
        $data = \core\components\MyExcelHelper::excel2array($excel_path, $header_keys);
        if (!empty($data)){
            foreach ($data as $sales_contract){
                $salesContractModel = \core\models\SalesContract::find()->where([
                    'sales_contract_code'=>$sales_contract['sales_contract_code'],
                ])->one();
                if (!empty($salesContractModel)){
                    $salesContractModel->sales_contract_sum_weight = \common\models\Base::weightBcmul($sales_contract['sales_contract_sum_weight']);
                    if ($salesContractModel->save()){
                        echo PHP_EOL.'导入销售合同'.$sales_contract['sales_contract_code'].'更新数据成功!';
                    }
                }
            }
        }
    }
}

  

五.上线

上传excel到制定目录:

运行命令如下:

php yii sales-contract/upload-excel

  运行结果如下:

销售合同金额数据从Excel导入的更多相关文章

  1. 10w行级别数据的Excel导入优化记录

    需求说明 项目中有一个 Excel 导入的需求:缴费记录导入 由实施 / 用户 将别的系统的数据填入我们系统中的 Excel 模板,应用将文件内容读取.校对.转换之后产生欠费数据.票据.票据详情并存储 ...

  2. 利用PL/SQL Developer工具导出数据到excel,导入excel数据到表

    使用PL/SQL Developer工具. 导出: 1.执行select 语句查询出需要导出的数据. 2.在数据列表中右键,选择save results.保存为.csv文件,然后已excel方式打开就 ...

  3. SQL server 导入数据 (excel导入到SQL server数据库)

    打开数据库SQL server ,右键数据库,任务,导入数据 点击下一步 选择数据源类型 选择路径,点击下一步 选择将要生成的类型 选择登陆方式 选中,点击下一步 点击编辑映射可以修改将要生成的表,点 ...

  4. 批量数据的Excel导入

    public void importIndexHistoryByCsv(String fileName) { logger.info("开始获取Csv文件导入到数据库,csv文件名为:&qu ...

  5. .net实现与excel的数据交互、导入导出

    应该说,一套成熟的基于web的管理系统,与用户做好的excel表格进行数据交互是一个不可或缺的功能,毕竟,一切以方便客(jin)户(qian)为宗旨. 本人之前从事PHP的开发工作,熟悉PHP的都应该 ...

  6. C#实现Excel模板导出和从Excel导入数据

    午休时间写了一个Demo关于Excel导入导出的简单练习 1.窗体 2.引用office命名空间 添加引用-程序集-扩展-Microsoft.Office.Interop.Excel 3.封装的Exc ...

  7. Excel大数据量分段导入到Oracle

    客户需要将一个具有2W多条数据的Excel表格中的数据导入到Oracle数据库的A表中,开始采用的是利用Oledb直接将数据读入到DataTable中,然后通过拼接InserInto语句来插入到数据库 ...

  8. [办公自动化] 再读《让EXCEL飞》(从excel导入access数据时,union联合查询,数据源中没有包含可见的表格)

    一年多以前就买了@Mrexcel的<让excel飞>这本书.整体思路是利用access结合excel,大幅度提高数据分析效率. 最近又拿出来看了看.第十五章,比高级筛选更“高级”,P241 ...

  9. Excel导入数据到Sql server 中出错:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”

    从Excel导入数据到Sql server 时,由于表中的数据有的很长,导入时出现如下错误(如果数据不是很长,255内以内,则不会出现错误): 出错原因: SQL Server的导入导出为了确定数据表 ...

随机推荐

  1. Linux:Day6(下) vim编辑器

    vim编辑器 简介: vi:Visual Interface,文本编辑器 文本:ASCII,Unicode 文本编辑种类: 行编辑器:sed 全屏编辑器:nano,vi VIM - Vi IMprov ...

  2. 【vue】vue中引入jquery

    简洁版: 第一步:首先在package.json中输入"jquery":"^3.2.1",其中“3.2.1”为jquery版本号,按需修改 注:package. ...

  3. rabbitMQ常用方法说明 – 6中工作模式及关键点

    首先,RabbitMQ解决什么问题? 1)信息的发送者和接收者如何维持连接,如果一方的连接中断,这期间的数据如何防止丢失? 2)如何降低发送者和接收者的耦合度? 3)如何让Priority高的接收者先 ...

  4. Spring Security(二十四):6.6 The Authentication Manager and the Namespace

    The main interface which provides authentication services in Spring Security is the AuthenticationMa ...

  5. 数组升序排序的方法Arrays.sort();的应用

    package com.Summer_0421.cn; import java.util.Arrays; /** * @author Summer * 数组升序排序的方法Arrays.sort();应 ...

  6. 十二省联考题解 - JLOI2019 题解

    十二省联考题解 - JLOI2019 题解 两个T3的难度较大 平均代码量远大于去年省选 套路题考查居多 A 难度等级 1 $n^2$暴力可以拿到$60$分的优秀成绩 然后可以想到把区间异或转化为前缀 ...

  7. RPC与Zookeeper注册中心的简单实现

    连接上文:https://www.cnblogs.com/wuzhenzhao/p/9962250.html RPC框架的简单实现,基于这个小程序,在我学习完Zookeeper之后如何将注册中心与RP ...

  8. Java线程池实现原理与技术(ThreadPoolExecutor、Executors)

    本文将通过实现一个简易的线程池理解线程池的原理,以及介绍JDK中自带的线程池ThreadPoolExecutor和Executor框架. 1.无限制线程的缺陷 多线程的软件设计方法确实可以最大限度地发 ...

  9. Python 学习 第十五篇:模块搜索路径和包导入

    在导入自定义的模块时,除了指定模块名之外,也需要指定目录,由于Python把目录称作包,因此,这类导入被称为包导入.包导入把计算机上的目录变成Python的命名空间,而目录中所包含的子目录和模块文件则 ...

  10. SQLite 实现删除表中前一天的数据

    注意点1 要注意SQLite datatime()函数为何获取不到系统本地时间?这个问题,坑死我了. 解决方法详见这篇文章:SQLite datatime()函数为何获取不到系统本地时间? 注意点2: ...