从Excel导出到MySQL

时间:2012-05-10 09:50:15

标签: mysql sql excel

我有一个Excel文件,其中我想要在java小程序中包含问卷的50个问题。这份调查问卷的答案将存储在我创建的MySQL数据库中。

有什么方法可以从我的Excel文件中选择所有(或子集)问题并将它们放入MySQL表格中的字段(我选择)?

我环顾四周并加载数据infile听起来像一个有效的选项,但我想选择哪些问题以及放置它们的位置。有人能指出我正确的方向吗?或者我应该简单地复制和粘贴?

任何帮助都会很棒!

5 个答案:

答案 0 :(得分:4)

将您的Excel数据保存在CSV format中,然后使用LOAD DATA命令将其导入MySQL。

关于后者的信息可以,例如,在这里找到:

答案 1 :(得分:0)

查看Excel将数据保存为CSV文件,然后将其加载到MySQL。尝试根据MySQL结构在Excel中格式化数据。

答案 2 :(得分:0)

这可能现在看起来有点老了,但可以帮助其他寻找解决方案的人。

Excel有官方的MySQL插件可以在Excel中导出,导入,追加和编辑MySQL数据。

以下是链接:http://dev.mysql.com/doc/refman/5.6/en/mysql-for-excel.html

答案 3 :(得分:0)

# wanna be generic implementation of xls to mysql upsert in perl
# by this time you should have your mysql connection open ... 
use Spreadsheet::XLSX;
use Text::Iconv;



#
# -----------------------------------------------------------------------------
# runs the insert sql by passed data part 
# by convention is assumed that the first column is unique and update could 
# be performed on it ... should there be duplicates the update should fail
# -----------------------------------------------------------------------------
sub RunUpsertSql {

   my $self             = shift ; 
   my $table_name   = shift ; 
   my $refHeaders   = shift ; 
   my $refData      = shift ; 
   my $data_str         = '' ; 
   my @headers      = @$refHeaders ; 
   my @data             = @$refData ; 

   print ( "\@data : @data" ) ; 
   print ( "\@headers: @headers" ) ; 

   my $sql_str = " INSERT INTO $table_name " ; 
   $sql_str .= '(' ; 
   for ( $i=0; $i<scalar (@headers);$i++ ) {
      $sql_str .= " $headers[$i] " . ' , ' ; 

   } #eof for

   for (1..3) { chop ( $sql_str) } ; 
   $sql_str .= ')' ; 

   foreach my $cellValue ( @data ) {
      # replace the ' chars with \'
      $cellValue        =~ s|\'|\\\'|g ; 
      $data_str .= "'" . "$cellValue" . "' , " ; 
   }
   #eof foreach ' replacement

   # remove the " , " at the end 
   for (1..3) { chop ( $data_str ) } ; 

   $sql_str .=  " VALUES (" . "$data_str" . ')' ; 
   $sql_str .= ' ON DUPLICATE KEY UPDATE ' ; 

   for ( $i=0; $i<scalar(@headers);$i++ ) {
      $sql_str .= "$headers[$i]" . ' = ' . "'" . "$data[$i]" . "' , " ; 
   } #eof for

   for (1..3) { chop ( $sql_str) } ; 

   print ( "sql_str : $sql_str " ); 

   $sth = $dbh->prepare($sql_str ) ; 
   $sth->execute( );

}
#eof sub RunUpsertSql


#
# -----------------------------------------------------------------------------
# walk trough the Excel and build the data part of the insert sql
# -----------------------------------------------------------------------------
sub ParseExcel {

   my $self = shift ; 
   print (  " == START == " ) ; 
   # not sure if it could work without the next line
   # for utf8 strings - slavic , japanese etc. 
   my $converter = Text::Iconv -> new ("utf-8", "utf-8");

   # http://search.cpan.org/~dmow/Spreadsheet-XLSX-0.13-withoutworldwriteables/lib/Spreadsheet/XLSX.pm
   my $objExcelParser = Spreadsheet::XLSX -> new ("$FileInputExcel", $converter);

   # iterate the sheets
   foreach my $objSheet (@{$objExcelParser-> {Worksheet}}) {

      print("Sheet: " . $objSheet->{'Name'});

      my $rowCount = 0 ; 
      # iterate the rows 
      my @headerData                    = ();
      foreach my $row ($objSheet -> {'MinRow'} .. $objSheet -> {'MaxRow'}) {
         my @rowData                    = (); 
         $objSheet -> {'MaxCol'} ||= $objSheet -> {'MinCol'};

         # iterate the coloumns
         foreach my $col ($objSheet -> {'MinCol'} ..  $objSheet -> {'MaxCol'}) {
            my $cell = $objSheet -> {'Cells'} [$row] [$col];
            if ($cell) {
               #debug printf("( %s , %s ) => %s\n", $row, $col, $cell -> {'Val'});
               # the unformatted value
               #my $cellValue = $cell->{'Val'}  ; 
               # push the formatted value
               push ( @rowData , $cell->value() )       if $rowCount != 0 ; 
               push ( @headerData , $cell->value() )    if $rowCount == 0 ; 

            }  #eof if the cell is defined
         } 
         #eof foreach col
      # by convention the name of the xls sheet is the same as the table name
      $self->RunUpsertSql ( $objSheet->{'Name'} , \@headerData , \@rowData) 
         if $rowCount != 0 ; 

         $rowCount++ ; 
      }
      #eof foreach row

   } 
   #eof foreach $objSheet

   print (  " == STOP  == " ) ; 

} #eof sub ParseExcel

答案 4 :(得分:0)

最简单的方法是使用MS Access打开Excel文件(您可以直接执行:文件 - &gt;打开 - &gt; ...)并使用ODBC将数据导出到MySQL(右键单击table - &gt; Export - &gt; ODBC数据库。

顺便说一句,我已经使用&#34; MySQL for Excel&#34;实验了一个bug,输出只有999行。从理论上讲,它将通过下一个1.3.4版本来解决。