2011-11-06 95 views
7

我有一個電子表格,它只有一個複雜的表格。我基本上將電子表格轉換爲cvs並使用groovy腳本來生成INSERT腳本。從Excel電子表格或CVS導入數據到MySQL

但是,我無法做到這一點,在電子表格的某些字段中有28個字段的數據表導致CVS導入CVS變得更加複雜。所以新CVS中的字段沒有正確區分,或者我的腳本沒有考慮到它。

有沒有人有更好的方法來做到這一點的任何建議?謝謝。

+0

一些代碼將是有益的 – Ole

+0

這似乎是非常相似,[3621798](http://stackoverflow.com/questions/3621798 ) – arober11

+0

可能的重複[如何導入excel文件到MYSQL數據庫](http://stackoverflow.com/questions/1310166/how-to-import-a-excel-file-in-to-mysql-database) –

回答

0

後來我回答了一個關於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(); 

注:

  1. 更改連接($ oConn)字符串,以適應,並在必要時添加 用戶ID和密碼的參數。
  2. 如果您需要XLSX支持,快速切換到Spreadsheet :: XLSX全部需要 。或者,它只需要幾行代碼,即 檢測文件類型並調用相應的庫。
  3. 以上是一個簡單的黑客,假設一切都在一個小區是一個字符串 /標量,如果保存類型是很重要的,具有 幾個正則表達式一個小功能可以配合使用一些if語句來 確保數字/日期留在適用格式寫入 到DB
  4. 上面的代碼是依賴於許多的CPAN模塊,可以安裝,假定站FTP訪問被允許時,通過:

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

應該返回大意如下的東西(TIS相當緩慢,由於自動提交):

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

這是一個計算器反覆發作的問題。這是一個更新的答案。

實際上有幾種方法可將不同程度的複雜性和成功導入到MySQL數據庫中的excel文件。

  1. Excel2MySQLNavicat工具。充分披露,我是Excel2MySQL的作者。這兩個實用程序不是免費的,但它們是最簡單的選項,並且具有最少的限制。它們還包含其他功能來幫助將Excel數據導入MySQL。例如,Excel2MySQL會自動創建表並自動優化字段數據類型,如日期,時間,浮點數等。如果您急於或無法使用其他選項來處理數據,那麼這些實用程序可能會滿足您的需求。

    screenshot of Excel2MySQL

  2. LOAD DATA INFILE:這個流行的選擇也許是最技術和需要MySQL命令執行有一定的瞭解。您必須在加載之前手動創建表並使用適當大小的VARCHAR字段類型。因此,您的字段數據類型未經優化。 LOAD DATA INFILE無法導入超過「max_allowed_pa​​cket」大小的大文件。需要特別注意避免導入特殊字符和外來Unicode字符的問題。以下是我用來導入名爲test.csv的csv文件的最近示例。

    enter image description here

  3. phpMyAdmin:首先選擇你的數據庫,然後選擇導入選項卡。 phpMyAdmin會自動創建你的表並調整VARCHAR字段的大小,但是它不會優化字段類型。 phpMyAdmin無法導入超過「max_allowed_pa​​cket」大小的大文件。

    enter image description here

  4. MySQL for Excel:這是一個免費的Excel加載從Oracle。這個選項有點繁瑣,因爲它使用了一個嚮導,並且導入速度很慢,並且有大文件的問題,但對於具有VARCHAR數據的小文件來說,這可能是一個不錯的選擇。字段沒有優化。

    enter image description here

+0

Excel2Mysql能否直接處理csv文件?我的csv太大而無法轉換爲Excel。 – ccleve

0

對於逗號分隔值(CSV)文件,結果查看面板在工作臺具有選項直接進口CSV數據到結果集的「從外部文件導入記錄」。執行該操作並單擊「應用」提交更改。

對於Excel文件,請考慮使用官方MySQL for Excel plugin

3

我使用名爲SQLizer https://sqlizer.io的產品,它將Excel(和CSV)文件轉換爲可插入數據的MySQL插入語句,或者粘貼到各種數據庫管理系統中。

SQLizer

它是免費的文件長達5000行數據

+0

不幸的是,由於我公司的隱私問題,不能選擇在線工具。 – RandomGuy

+0

@RandomGuy瞭解 - 這裏是我們的安全帖子http://blog.sqlizer.io/posts/privacy-at-sqlizer/我們現在也有一個API。 –

相關問題