一.业务需求

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

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

二.产品设计

三.UI设计

四.程序设计

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

  1. <?php
  2.  
  3. namespace core\components;
  4.  
  5. use PHPExcel;
  6. use PHPExcel_IOFactory;
  7. use PHPExcel_Style_Alignment;
  8. use PHPExcel_Reader_Excel5;
  9. use PHPExcel_RichText;
  10.  
  11. class MyExcelHelper extends \yii\base\Component{
  12.  
  13. /**
  14. * 将二维数组的数据转化为excel表格导出
  15. * @param $data
  16. * @param $excel_name
  17. * @param $headers
  18. * @param $options
  19. */
  20. public static function array2excel($data, $excel_name, $headers, $options, $style_options){
  21. $objPHPExcel = new PHPExcel();
  22. ob_start();
  23.  
  24. if (!isset($options['creator'])){
  25. $objPHPExcel->getProperties()->setCreator('creator');
  26. }else{
  27. $objPHPExcel->getProperties()->setCreator($options['creator']);
  28. }
  29.  
  30. if (isset($options['last_modified_by'])){
  31. $objPHPExcel->getProperties()->setCreator('last_modified_by');
  32. }else{
  33. $objPHPExcel->getProperties()->setCreator($options['last_modified_by']);
  34. }
  35.  
  36. if (isset($options['title'])){
  37. $objPHPExcel->getProperties()->setCreator('title');
  38. }else{
  39. $objPHPExcel->getProperties()->setCreator($options['title']);
  40. }
  41.  
  42. if (isset($options['subject'])){
  43. $objPHPExcel->getProperties()->setCreator('subject');
  44. }else{
  45. $objPHPExcel->getProperties()->setCreator($options['subject']);
  46. }
  47.  
  48. if (isset($options['description'])){
  49. $objPHPExcel->getProperties()->setCreator('description');
  50. }else{
  51. $objPHPExcel->getProperties()->setCreator($options['description']);
  52. }
  53.  
  54. if (isset($options['keywords'])){
  55. $objPHPExcel->getProperties()->setCreator('keywords');
  56. }else{
  57. $objPHPExcel->getProperties()->setCreator($options['keywords']);
  58. }
  59.  
  60. if (isset($options['category'])){
  61. $objPHPExcel->getProperties()->setCreator('category');
  62. }else{
  63. $objPHPExcel->getProperties()->setCreator($options['category']);
  64. }
  65.  
  66. $header_keys = array_keys($headers);
  67.  
  68. foreach ($header_keys as $header_index => $header_key){
  69. $index_ascii = $header_index + 65;
  70. $index_chr = chr($index_ascii);
  71. $header_value = $headers[$header_key];
  72. $objPHPExcel->setActiveSheetIndex(0)->setCellValue($index_chr.'1', $header_value);
  73. $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension($index_chr)->setWidth(20);
  74. $objPHPExcel->setActiveSheetIndex(0)->getStyle($index_chr.'1')->applyFromArray([
  75. 'font'=>[
  76. 'bold' => true
  77. ],
  78. 'alignment'=>[
  79. 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER
  80. ]
  81. ]);
  82. if (isset($style_options['h_align'][$header_key])){
  83. if ($style_options['h_align'][$header_key] == 'left'){
  84. $h_align = PHPExcel_Style_Alignment::HORIZONTAL_LEFT;
  85. }elseif ($style_options['h_align'][$header_key] == 'center'){
  86. $h_align = PHPExcel_Style_Alignment::HORIZONTAL_CENTER;
  87. }elseif ($style_options['h_align'][$header_key] == 'right'){
  88. $h_align = PHPExcel_Style_Alignment::HORIZONTAL_RIGHT;
  89. }else{
  90. $h_align = PHPExcel_Style_Alignment::HORIZONTAL_CENTER;
  91. }
  92. $objPHPExcel->setActiveSheetIndex(0)->getStyle($index_chr)->applyFromArray([
  93. 'alignment'=>[
  94. 'horizontal' => $h_align
  95. ]
  96. ]);
  97. }
  98. }
  99.  
  100. $data_row_index = 2;
  101. foreach ($data as $row_index => $row){
  102. $data_keys = array_keys($row);
  103. foreach ($data_keys as $column_index => $data_key){
  104. if ($column_index>=26){
  105. throw new \yii\base\Exception('EXCEL表格超过26列');
  106. }
  107. $index_ascii = $column_index + 65;
  108. $index_chr = chr($index_ascii);
  109. $value = $row[$data_key];
  110. $objPHPExcel->setActiveSheetIndex(0)->setCellValue($index_chr . $data_row_index, $value);
  111. }
  112. $data_row_index++;
  113. }
  114.  
  115. if (isset($options['summary'])){
  116. $summary_keys = array_keys($options['summary']);
  117. foreach ($summary_keys as $summary_index => $summary_key){
  118. $index_ascii = $summary_index + 65;
  119. $index_chr = chr($index_ascii);
  120. $summary_flag = $options['summary'][$summary_key];
  121. if ($summary_flag){
  122. $summary_value = \core\components\ArrayHelper::sumByColumn($data, $summary_key);
  123. $objPHPExcel->setActiveSheetIndex(0)->setCellValue($index_chr . $data_row_index, $summary_value);
  124. }
  125. }
  126. }
  127.  
  128. $objPHPExcel->setActiveSheetIndex(0);
  129.  
  130. $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
  131.  
  132. ob_end_clean();
  133.  
  134. header('Content-Type: application/vnd.ms-excel');
  135. header('Content-Disposition: attachment;filename="' . $excel_name . '.xls"');
  136. header('Cache-Control: max-age=0');
  137.  
  138. $objWriter->save('php://output');
  139. exit;
  140. }
  141.  
  142. /**
  143. * 将excel表格转化为二维数组的数据
  144. * @param $excel_path
  145. * @param $data
  146. * @param $header
  147. */
  148. public static function excel2array($excel_path, $header_keys){
  149.  
  150. if(!file_exists($excel_path)){
  151. throw new \yii\base\Exception('该EXCEL不存在!');
  152. }
  153. $PHPReader = new \PHPExcel_Reader_Excel2007();
  154. if(!$PHPReader->canRead($excel_path)){
  155. $PHPReader = new PHPExcel_Reader_Excel5();
  156. if(!$PHPReader->canRead($excel_path)){
  157. throw new \yii\base\Exception('该EXCEL不可读');
  158. }
  159. }
  160.  
  161. $PHPExcel = $PHPReader->load($excel_path);
  162. $currentSheet = $PHPExcel->getSheet(0);
  163.  
  164. $max_column_index = $currentSheet->getHighestColumn();
  165. $max_row_index = $currentSheet->getHighestRow();
  166.  
  167. $data = array();
  168. for($row_index=2; $row_index<=$max_row_index; $row_index++ ){
  169. for($column_chr='A'; $column_chr<=$max_column_index; $column_chr++){
  170. $column_ord = ord($column_chr);
  171. $column_index = $column_ord - 65;
  172. $key = $column_chr.$row_index;
  173. $value = $currentSheet->getCell($key)->getValue();
  174. if($value instanceof PHPExcel_RichText){
  175. $value = $value->__toString();
  176. }
  177.  
  178. $data[$row_index-1][$header_keys[$column_index]] = $value;
  179. }
  180. }
  181. return $data;
  182. }
  183. }

  

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

  1. <?php
  2.  
  3. namespace console\controllers;
  4.  
  5. use yii\console\Controller;
  6. use Yii;
  7.  
  8. class SalesContractController extends Controller
  9. {
  10. public function actionUploadExcel(){
  11. $excel_path = './console/excels/sales_contract.xlsx';
  12. $header_keys = ['sales_contract_code', 'sales_customers_name', 'sales_contract_sum_weight'];
  13. $data = \core\components\MyExcelHelper::excel2array($excel_path, $header_keys);
  14. if (!empty($data)){
  15. foreach ($data as $sales_contract){
  16. $salesContractModel = \core\models\SalesContract::find()->where([
  17. 'sales_contract_code'=>$sales_contract['sales_contract_code'],
  18. ])->one();
  19. if (!empty($salesContractModel)){
  20. $salesContractModel->sales_contract_sum_weight = \common\models\Base::weightBcmul($sales_contract['sales_contract_sum_weight']);
  21. if ($salesContractModel->save()){
  22. echo PHP_EOL.'导入销售合同'.$sales_contract['sales_contract_code'].'更新数据成功!';
  23. }
  24. }
  25. }
  26. }
  27. }
  28. }

  

五.上线

上传excel到制定目录:

运行命令如下:

  1. 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. How to get Docker

    Docker 通俗的理解就是像VM一样的虚拟技术,但是不完全相同. Docker可以打包为镜像文件,在镜像中运行容器. 镜像和容器可以理解成类和对象的关系. 拿VM虚拟机和docker来举例,一个容器 ...

  2. hyperledger中文文档学习-4-构建第一个fabric网络

    接下来的操作都将在hyperledge环境安装构建的虚拟机的环境下进行 参考https://hyperledgercn.github.io/hyperledgerDocs/build_network_ ...

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

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

  4. 分布式事务框架Seata及EasyTransaction架构的比对思考

    本文将会对比Seata与EasyTransaction两个分布式事务的一些高层设计,相信大家会有收获. Seata的概述 Seata(曾用名Fescar,开源版本GTS)是阿里的开源分布式事务框架,其 ...

  5. .Net Core 在 Linux-Centos上的部署实战教程(二)

    上篇我们说了 如何在Linux上部署.net core  但是有心的同学会发现你关闭掉终端网站就不能访问了,这个原因是因为直接 dotnet GetConfigFile.dll --server.ur ...

  6. Python3 与 C# 基础语法对比(就当Python和C#基础的普及吧)

      文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 多图旧排版:https://www.cnblogs.com/dunitian/p/9 ...

  7. 窥探ASP.Net MVC底层原理 实现跨越Session的分布式TempData

    1.问题的引出 我相信大家在项目中都使用过TempData,TempData是一个字典集合,一般用于两个请求之间临时缓存数据或者页面之间传递消息.也都知道TempData是用Session来实现的,既 ...

  8. python第七章:常用模块--小白博客

    yagmail模块 python标准库中发送电子邮件的模块比较复杂,因此,有许多开原的库提供了更加易用的接口来发送电子邮件,其中yagmail是一个使用比较广泛的开原项目,yagmail底层依然使用了 ...

  9. AtCoder Beginner Contest 053

    D - Card Eater Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement Snuke h ...

  10. 543A - Writing Code(二维动态规划)

    题意:现在要写m行代码,总共有n个文件,现在给出第i个文件每行会出现v[i]个bug,问你在bug少于b的条件下有多少种安排 分析:定义dp[i][j][k],i个文件,用了j行代码,有k个bug 状 ...