当前位置: 首页 > 知识库问答 >
问题:

将excel导入多个表- PHP和MYSQL (codeigniter)

齐昊焱
2023-03-14

通过下面的函数,您可以通过PHP将数据从Excel电子表格导入数据库。

客户端包含以下字段:

`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`address` VARCHAR(255) NOT NULL,

但我需要以下列:$发票、$到期、$value以导入另一个发票表,该表将包含以下字段:

`client_id` INT(11) NOT NULL AUTO_INCREMENT,
`invoice` VARCHAR(20) NOT NULL,
`expiry` VARCHAR(20) NOT NULL,
`value` VARCHAR(20) NULL DEFAULT NULL,

其中client_id将接收客户端id。

我使用以下方法导入:

控制器

function import()
    {
        if(isset($_FILES["file"]["name"]))
        {
            $path = $_FILES["file"]["tmp_name"];
            $object = PHPExcel_IOFactory::load($path);


            foreach($object->getWorksheetIterator() as $worksheet)
            {               
                $highestRow    = $worksheet->getHighestRow();
                $highestColumn = $worksheet->getHighestColumn();

                for($row = 2; $row getCellByColumnAndRow(0, $row)->getValue();
                    $address = $worksheet->getCellByColumnAndRow(1, $row)->getValue();
                    $invoice = $worksheet->getCellByColumnAndRow(2, $row)->getValue();
                    $expiry  = $worksheet->getCellByColumnAndRow(3, $row)->getValue();
                    $value   = $worksheet->getCellByColumnAndRow(4, $row)->getValue();

                    $data[] = [
                        'name'    =>    $name,
                        'address' =>    $address,
                        'invoice' =>    $invoice,
                        'expiry'  =>    $expiry,
                        'value'   =>    $value
                    ];
                }
            }
            $this->excel_import_model->insert($data);
            echo 'Data Imported successfully';
        }
    }

模型

function insert($data)
{
    $this->db->insert_batch('client', $data);
    $insert = $this->db->insert_id();
}

共有1个答案

唐骏祥
2023-03-14

我相信你想要这个。

function only_number($str) {
    return preg_replace('/[^0-9]/', '', $str);
}

function import()
{
    if(isset($_FILES['file']['name']))
    {
        $path   = $_FILES['file']['tmp_name'];
        $object = PHPExcel_IOFactory::load($path);


        foreach($object->getWorksheetIterator() as $worksheet)
        {
            $highestRow    = $worksheet->getHighestRow();
            $highestColumn = $worksheet->getHighestColumn();

            for($row = 2; $row <= $highestRow; $row++)
            {
                $cpf_cnpj = $worksheet->getCellByColumnAndRow(0, $row)->getValue();
                $name     = $worksheet->getCellByColumnAndRow(1, $row)->getValue();
                $contract = $worksheet->getCellByColumnAndRow(2, $row)->getValue();
                $invoice  = $worksheet->getCellByColumnAndRow(3, $row)->getValue();
                $expiry   = $worksheet->getCellByColumnAndRow(4, $row)->getValue();
                $value    = $worksheet->getCellByColumnAndRow(5, $row)->getValue();
                $address  = $worksheet->getCellByColumnAndRow(6, $row)->getValue();
                $phone    = $worksheet->getCellByColumnAndRow(7, $row)->getValue();
                $email    = $worksheet->getCellByColumnAndRow(8, $row)->getValue();

                $cpf_cnpj = $this->only_number($cpf_cnpj);
                $cpf_cnpj = str_pad($cpf_cnpj, 11 , '0' , STR_PAD_LEFT);

                $phone = $this->only_number($phone);

                $person = [
                    'cpf_cnpj' =>   $cpf_cnpj,
                ];                                  

                $result_person = $this->db->get_where('tb_person', ['cpf_cnpj' => $cpf_cnpj])->result();

                if(count($result_person) == 0)
                {
                    // insert person
                    $this->db->insert('tb_person', $person);
                    $person_id = $this->db->insert_id();

                    // insert client
                    $_client = [
                        'person_id' => $person_id,
                    ];
                    $this->db->insert('tb_client', $_client);

                    // insert natural person
                    $_natural = [
                        'person_id' => $person_id,
                        'name'      => $name,
                    ];
                    $this->db->insert('tb_natural_person', $_natural);

                    // insert address
                    $_address = [
                        'address'   => $address,
                        'person_id' => $person_id,
                    ];
                    $this->db->insert('tb_address', $_address);
                }

                $person_id = $this->db->select('*')->from('tb_person')->where('cpf_cnpj', $cpf_cnpj)->get()->row()->id;

                // phone
                $result_phone = $this->db->get_where('tb_phone', ['phone' => $phone])->result();
                if(count($result_phone) == 0)
                {
                    $_phone = [
                        'person_id' => $person_id,
                        'phone'  => $phone,
                    ];
                    $this->db->insert('tb_phone', $_phone);
                }

                // email
                $result_email = $this->db->get_where('tb_email', ['email' => $email])->result();
                if(count($result_email) == 0)
                {
                    $_email = [
                        'person_id' => $person_id,
                        'email'  => $email,
                    ];
                    $this->db->insert('tb_email', $_email);
                }                   

                $result_contract = $this->db->get_where('tb_contract', ['contract' => $contract])->result();                    
                if(count($result_contract) == 0)
                {
                    // insert contract
                    $_contract = [
                        'person_id' => $person_id,
                        'contract'  => $contract,
                    ];
                    $this->db->insert('tb_contract', $_contract);
                    $contract_id = $this->db->insert_id();
                }

                $contract_id = $this->db->select('*')->from('tb_contract')->where('contract', $contract)->get()->row()->id;

                $result_invoice = $this->db->get_where('tb_invoice', ['invoice' => $invoice, 'contract_id' => $contract_id])->result();
                // invoice
                $_invoice = [
                    'contract_id' => $contract_id,
                    'person_id' => $person_id,
                    'invoice'   => $invoice,
                    'expiry'    => $expiry,
                    'value'     => $value
                ];

                if(count($result_invoice) == 0)
                {
                    $this->db->insert('tb_invoice', $_invoice);
                }
                else
                {
                    $this->db->where('invoice', $invoice);
                    $this->db->where('contract_id', $contract_id);
                    $this->db->update('tb_invoice', $_invoice);
                }
            }
        }
    }
}

USE `ci_import`;

DROP TABLE IF EXISTS `tb_person`;
CREATE TABLE IF NOT EXISTS `tb_person` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `cpf_cnpj` VARCHAR(20) NOT NULL,
    PRIMARY KEY (`id`))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tb_client`;
CREATE TABLE IF NOT EXISTS `tb_client` (
    `person_id` INT(11) NOT NULL,
    PRIMARY KEY (`person_id`))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tb_natural_person`;
CREATE TABLE IF NOT EXISTS `tb_natural_person` (
    `person_id` INT(11) NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`person_id`))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tb_address`;
CREATE TABLE IF NOT EXISTS `tb_address` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `person_id` INT(11) NOT NULL,
    `address` VARCHAR(20) NOT NULL,
    PRIMARY KEY (`id`))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tb_phone`;
CREATE TABLE IF NOT EXISTS `tb_phone` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `person_id` INT(11) NOT NULL,
    `phone` VARCHAR(20) NOT NULL,
    PRIMARY KEY (`id`))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tb_email`;
CREATE TABLE IF NOT EXISTS `tb_email` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `person_id` INT(11) NOT NULL,
    `email` VARCHAR(160) NOT NULL,
    PRIMARY KEY (`id`))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tb_contract`;
CREATE TABLE IF NOT EXISTS `tb_contract` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `contract` VARCHAR(255) NOT NULL,
    `person_id` INT(11) NOT NULL,
    PRIMARY KEY (`id`))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tb_invoice`;
CREATE TABLE IF NOT EXISTS `tb_invoice` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `contract_id` INT(11) NOT NULL,
    `person_id` INT(11) NOT NULL,
    `invoice` VARCHAR(20) NOT NULL,
    `expiry` VARCHAR(20) NOT NULL,
    `value` VARCHAR(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;
 类似资料:
  • 我在Laravel 7中使用maatsite的Excel导入库将文件分析和支持数据导入到“分析”数据库表中,它工作得很好。但是,在我选择要导入的Excel文件的视图页面上,我有一个选择下拉和输入文本。我在各自的模型中创建了has很多和属性关系。 处理控制器: 利润进口: profiling_import.blade: 在Excel文件中: 视图: 问题是pemohon、品牌和用户数据没有填入数据库

  • 问题内容: 更新 在我发布此问题之后的第二秒,由于对结果查询的语法突出显示,我看到了出了什么问题:该字符串未以闭合斜线开头。现在我将其更改为: 但是,这提出了一个新问题:为什么PDO对象没有为此向我吐出错误?手动执行查询肯定会返回一个错误,指出没有名为的字段,最后是逗号。为什么我没有收到任何错误?有任何想法吗? PS:关于解决我的问题的SO语法突出显示方面有什么想法吗?:-) 我将原始问题留作参考

  • 问题内容: 我试图截断一个表,但是为什么它不起作用?数据库查询中一定有问题吗? 理想情况下,我想一次性截断所有表-有可能吗? 如果您想知道我用来进行数据库查询的类的内容是什么, 谢谢。 编辑: 下面是我如何调用db对象, 问题答案: 谢谢你们的帮助!这是我的答案,

  • 我使用apache poi将数据从excel读取到mysql表。我用excel表格做了这个,有两个字段。我的代码是这样的, 然后将数据放在arraylist上。ten将其插入数据库。。但是现在我需要系统来获取具有可变克隆数的excel文件。我能做到吗?我只是急需帮助。因此,请帮助我一些想法和可能的一些代码。 先谢谢你,苏吉

  • 问题内容: 我正在尝试将MySQL数据保存到Excel文件,但是Excel单元格出现问题。我所有的文本都放在一个单元格中,我希望每个行值都在单独的Excel单元格中。这是我的代码: 问题答案: 尝试以下方法: PHP部分: 我认为这可以帮助您解决问题。

  • 问题内容: 将csv文件上传到mysql表的最佳/最快方法是什么?我想将第一行数据用作列名。 发现了这一点: 如何将CSV文件导入MySQL表 但是唯一的答案是使用GUI而不是Shell? 问题答案: 您无需编写脚本即可从CSV文件中提取信息,而是可以直接将MYSQL链接到该文件并使用以下SQL语法上传信息。 要将Excel文件导入MySQL,请先将其导出为CSV文件。从生成的CSV文件中删除CS