将 Excel 电子表格或 CSV 中的数据导入 MySQL

Posted

技术标签:

【中文标题】将 Excel 电子表格或 CSV 中的数据导入 MySQL【英文标题】:Import Data from Excel Spreadsheet or CVS into MySQL 【发布时间】:2011-12-23 06:58:12 【问题描述】:

我有一个实际上只有一个复杂表格的电子表格。我基本上将电子表格转换为 cvs 并使用 groovy 脚本生成 INSERT 脚本。

但是,我无法使用包含 28 个字段的表格来执行此操作,这些字段包含电子表格上某些字段中的数据,这使得导入 CVS 变得更加复杂。所以新 CVS 中的字段没有正确区分或者我的脚本没有考虑到它。

有人对更好的方法有什么建议吗?谢谢。

【问题讨论】:

这似乎与3621798非常相似 How to IMPORT a excel file in to mysql DATABASE的可能重复 这能回答你的问题吗? How to import an excel file in to a MySQL database 【参考方案1】:

查看LOAD DATA INFILE 声明。它将帮助您将数据从 CSV 文件导入到表中。

【讨论】:

【参考方案2】:

这是关于 *** 的一个反复出现的问题。这是一个更新的答案。

实际上有几种方法可以将 Excel 文件导入 MySQL 数据库,但复杂程度和成功程度各不相同。

    Excel2MySQLNavicat 实用程序。完全披露,我是 Excel2MySQL 的作者。这 2 个实用程序不是免费的,但它们是最简单的选择并且具有最少的限制。它们还包括帮助将 Excel 数据导入 MySQL 的附加功能。例如,Excel2MySQL 会自动创建您的表格并自动优化日期、时间、浮点数等字段数据类型。如果您赶时间或无法获得其他选项来处理您的数据,那么这些实用程序可能会满足您的需求。

    LOAD DATA INFILE:这个流行的选项可能是最技术性的,需要对 MySQL 命令执行有一定的了解。您必须在加载和使用适当大小的 VARCHAR 字段类型之前手动创建表。因此,您的字段数据类型未优化。 LOAD DATA INFILE 在导入超过“max_allowed_pa​​cket”大小的大文件时遇到问题。需要特别注意避免导入特殊字符和外来 unicode 字符时出现问题。这是我最近用来导入名为 test.csv 的 csv 文件的示例。

    phpMyAdmin:首先选择您的数据库,然后选择导入选项卡。 phpMyAdmin 将自动创建您的表格并调整您的 VARCHAR 字段的大小,但它不会优化字段类型。 phpMyAdmin 无法导入超过 'max_allowed_pa​​cket' 大小的大文件。

    MySQL for Excel:这是来自 Oracle 的免费 Excel 插件。这个选项有点乏味,因为它使用向导并且导入速度很慢并且对于大文件有问题,但是对于带有 VARCHAR 数据的小文件,这可能是一个不错的选择。字段未优化。

【讨论】:

Excel2Mysql可以直接处理csv文件吗?我的 csv 太大,无法转换为 Excel。 @panofish 您的 Excel2MySql 是唯一对我有用的解决方案。 Navicat 出现错误,Access 出现错误,尝试了一切。但是您的软件运行完美,只是在我运行导入很长时间之前没有提到试用版将一些行留空。希望我提前知道,哈哈。 @notacouch 感谢您的反馈。也许,我会在许可之前添加一个关于空白记录的通知,以避免其他人的混淆。 Excel2MySQL 非常稳固可靠。 @panofish 不客气。是的,我确实在同一天购买了许可证,它为我节省了......大量的时间、精力、头痛,完美地工作。谢谢!【参考方案3】:

对于逗号分隔值 (CSV) 文件,Workbench 中的结果视图面板具有“从外部文件导入记录”选项,可将 CSV 数据直接导入结果集中。执行该操作并单击“应用”以提交更改。

对于Excel文件,可以考虑使用官方MySQL for Excel plugin。

【讨论】:

【参考方案4】:

不久前,我在EE 站点上回答了一个非常相似的问题,并提供了以下 Perl 块,作为如何将 Excel 工作表直接加载到 MySQL 中的快速而肮脏的示例。绕过通过 CSV 导出/导入的需要,因此希望保留更多这些特殊字符,并且无需担心转义内容。

#!/usr/bin/perl -w
# Purpose: Insert each Worksheet, in an Excel Workbook, into an existing MySQL DB, of the same name as the Excel(.xls).
#          The worksheet names are mapped to the table names, and the column names to column names.
#          Assumes each sheet is named and that the first ROW on each sheet contains the column(field) names.
#

use strict;
use Spreadsheet::ParseExcel;
use DBI;
use Tie::IxHash;

die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV;

my $sDbName              = $ARGV[0];
   $sDbName              =~ s/\.xls//i;
my $oExcel               = new Spreadsheet::ParseExcel;
my $oBook                = $oExcel->Parse($ARGV[0]);
my $dbh                  = DBI->connect("DBI:mysql:database=$sDbName;host=192.168.123.123","root", "xxxxxx", 'RaiseError' => 1,AutoCommit => 1);
my ($sTableName, %hNewDoc, $sFieldName, $iR, $iC, $oWkS, $oWkC, $sSql);

print "FILE: ", $oBook->File , "\n";
print "DB: $sDbName\n";
print "Collection Count: ", $oBook->SheetCount , "\n";

for(my $iSheet=0; $iSheet < $oBook->SheetCount ; $iSheet++)

 $oWkS                   = $oBook->Worksheet[$iSheet];
 $sTableName             = $oWkS->Name;
 print "Table(WorkSheet name):", $sTableName, "\n";
 for(my $iR   = $oWkS->MinRow ; defined $oWkS->MaxRow && $iR <= $oWkS->MaxRow ;  $iR++)
 
  tie ( %hNewDoc, "Tie::IxHash");
  for(my $iC = $oWkS->MinCol ; defined $oWkS->MaxCol && $iC <= $oWkS->MaxCol ; $iC++)
  
   $sFieldName           = $oWkS->Cells[$oWkS->MinRow][$iC]->Value;
   $sFieldName           =~ s/[^A-Z0-9]//gi;  #Strip non alpha-numerics from the Column name
   $oWkC                 = $oWkS->Cells[$iR][$iC];
   $hNewDoc$sFieldName = $dbh->quote($oWkC->Value) if($oWkC && $sFieldName);
  
  if ($iR == $oWkS->MinRow)
        #eval  $dbh->do("DROP TABLE $sTableName") ;
        $sSql             = "CREATE TABLE IF NOT EXISTS $sTableName (".(join " VARCHAR(512), ", keys (%hNewDoc))." VARCHAR(255))";
        #print "$sSql \n\n";
        $dbh->do("$sSql");
   else 
        $sSql = "INSERT INTO $sTableName (".(join ", ",keys (%hNewDoc)).") VALUES (".(join ", ",values (%hNewDoc)).")\n";
        #print "$sSql \n\n";
        eval  $dbh->do("$sSql") ;
  
 
 print "Rows inserted(Rows):", ($oWkS->MaxRow - $oWkS->MinRow), "\n";

# Disconnect from the database.
$dbh->disconnect();

注意:

    更改连接 ($oConn) 字符串以适合,如果需要添加一个 参数的用户 ID 和密码。 如果您需要 XLSX 支持,请快速切换到 Spreadsheet::XLSX 即可 这是需要的。或者,它只需要几行代码,即可 检测文件类型并调用相应的库。 以上是一个简单的 hack,假设单元格中的所有内容都是字符串 / 标量,如果保留类型很重要,则带有一个小函数 很少的正则表达式可以与一些 if 语句一起使用 确保数字/日期在书写时保持适用的格式 到数据库

    以上代码依赖于许多 CPAN 模块,您可以安装这些模块,假设允许通过以下方式进行出站 ftp 访问:

    cpan YAML Data::Dumper Spreadsheet::ParseExcel Tie::IxHash Encode Scalar::Util File::Basename DBD::mysql

应该按照以下几行返回一些内容(由于自动提交,速度相当慢):

# ./Excel2mysql.pl test.xls 
FILE: test.xls
DB: test
Collection Count: 1
Table(WorkSheet name):Sheet1
Rows inserted(Rows):9892

【讨论】:

Excel2mysql.pl perl 源代码不应与应用程序 Excel2MySQL 混淆。该应用程序更快、更容易,但它不是免费的。

以上是关于将 Excel 电子表格或 CSV 中的数据导入 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

如何将access中的数据导出为EXCEL文件?

如何将R语言中的表格数据输出为Excel文件

csv数据导入Hadoop中的HDFS

如何将R语言中的表格数据输出为Excel文件

csv从excel导入phpmyadmin缺少数据

csv文件格式问题