zoukankan      html  css  js  c++  java
  • 数据库MySQL与xls文件的互导

          最近的一个项目需要将xls表导入到MySQL数据库中和将MySQL数据表导出到xls表中,在网上搜了很多资料,经过多次尝试终于实现了功能,废话不多说,在这粘贴出代码,希望可以帮到需要的朋友。

         一、将.xls表导入到MySQL数据表中。

              这里我用的是一个类库,下载地址:http://sourceforge.net/projects/phpexcelreader/  可以这个下载的不能直接使用,要做相应的修改(参照:http://www.cnblogs.com/phpzxh/archive/2009/09/16/1568133.html)。下载以后,我们需要的只是那个Excel文件夹,其他是自带的案例,因为不能运行所以可以删除不管。打开这个Excel文件夹,里面有两个文件,oleread.inc和reader.php,其中这个readre.php是应该包含oleread.inc的,显然下载的是没有,只要改动将其包含进去就可以了。接下来就可以直接使用了,看代码

     1         $Import_TmpFile = $_FILES['file']['tmp_name'];  
     2         require_once '../utils/reader.php'; //引入刚才的reader.php
     3         $data = new Spreadsheet_Excel_Reader(); 
     4         $data->setOutputEncoding('UTF-8'); 
     5         $data->read($Import_TmpFile); 
     6         //$data是对象数据,将其遍历成数组
     7         $array =array(); 
     8         for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) { 
     9             for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) { 
    10                  $array[$i][$j] = $data->sheets[0]['cells'][$i][$j]; 
    11                     } 
    12             }                  //这一步就是讲xls文件的内容遍历出来了,是一个数组的形式,下面的就是如何插入数据库了。
    13         //将数据写入trade交易数据表中   
    14         $sql = "insert into dou_trade(trade_time,institution,mediacy,trade_account,user_name,goods_type,trade_number,trade_pay,level_benefit,hold_benefit,benefit_total,exchange_poundage,membership_poundage,user_poundage) values(:trade_time,:institution,:mediacy,:trade_account,:user_name,:goods_type,:trade_number,:trade_pay,:level_benefit,:hold_benefit,:benefit_total,:exchange_poundage,:membership_poundage,:user_poundage)"; 
    15         $stmt = $pdo->prepare($sql);
    16         for($i=1;$i<=count($array);$i++){
    17                     $stmt->bindParam(':trade_time', $array[$i]['2']); 
    18                     $stmt->bindParam(':institution', $array[$i]['3']); 
    19                     $stmt->bindParam(':mediacy', $array[$i]['4']); 
    20                     $stmt->bindParam(':trade_account', $array[$i]['5']); 
    21                     $stmt->bindParam(':user_name', $array[$i]['6']); 
    22                     $stmt->bindParam(':goods_type', $array[$i]['7']); 
    23                     $stmt->bindParam(':trade_number', $array[$i]['8']); 
    24                     $stmt->bindParam(':trade_pay', $array[$i]['9']); 
    25                     $stmt->bindParam(':level_benefit', $array[$i]['10']); 
    26                     $stmt->bindParam(':hold_benefit', $array[$i]['11']); 
    27                     $stmt->bindParam(':benefit_total', $array[$i]['12']); 
    28                     $stmt->bindParam(':exchange_poundage', $array[$i]['13']); 
    29                     $stmt->bindParam(':membership_poundage', $array[$i]['14']); 
    30                     $stmt->bindParam(':user_poundage', $array[$i]['15']); 
    31                     $tag = $stmt->execute();   
    32          }

    这样就可以将xls文件的内容导入到数据表中了。

         二、将MySQL数据表内容导出到xls表中。

    这得益于一篇文章,地址:http://krasimirtsonev.com/blog/article/php-export-mysql-data-to-xls-file。其核心代码如下

     1 function xlsBOF() {
     2     echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
     3 }
     4 function xlsEOF() {
     5     echo pack("ss", 0x0A, 0x00);
     6 }
     7 function xlsWriteNumber($Row, $Col, $Value) {
     8     echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
     9     echo pack("d", $Value);
    10 }
    11 function xlsWriteLabel($Row, $Col, $Value) {
    12     $L = strlen($Value);
    13     echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
    14     echo $Value;
    15 } 
    16 // prepare headers information
    17 header("Content-Type: application/force-download");
    18 header("Content-Type: application/octet-stream");
    19 header("Content-Type: application/download");
    20 header("Content-Disposition: attachment; filename="export_".date("Y-m-d").".xls"");
    21 header("Content-Transfer-Encoding: binary");
    22 header("Pragma: no-cache");
    23 header("Expires: 0");
    24 // start exporting
    25 xlsBOF();
    26 // first row 
    27 xlsWriteLabel(0, 0, "id");
    28 xlsWriteLabel(0, 1, "name");
    29 xlsWriteLabel(0, 2, "email");
    30 // second row 
    31 xlsWriteNumber(1, 0, 230);
    32 xlsWriteLabel(1, 1, "John");
    33 xlsWriteLabel(1, 2, "john@yahoo.com");
    34 // third row 
    35 xlsWriteNumber(2, 0, 350);
    36 xlsWriteLabel(2, 1, "Mark");
    37 xlsWriteLabel(2, 2, "mark@yahoo.com");
    38 // end exporting
    39 xlsEOF();

    只要将其中的first row /second row等换成表的内容就可以了。其中注意的是是编码问题,数据库中的数utf-8,而xls中式gbk编码的,为防止出现乱码,最好的办法是在写入xls表之前用iconv进行转码就可以了。

  • 相关阅读:
    【原创】自己动手写工具----签到器[Beta 1.0]
    都2020了,还不好好学学泛型?
    ThreadLocal = 本地线程?
    从BWM生产学习工厂模式
    你还在用BeanUtils进行对象属性拷贝?
    JDK 1.8 之 Map.merge()
    Spring Boot认证:整合Jwt
    以商品超卖为例讲解Redis分布式锁
    如何从 if-else 的参数校验中解放出来?
    分布式全局唯一ID生成策略​
  • 原文地址:https://www.cnblogs.com/webclz/p/3614693.html
Copyright © 2011-2022 走看看