कुछ समय पहले मैं EE साइट पर एक बहुत ही इसी तरह के सवाल का जवाब दे, और पर्ल के निम्नलिखित ब्लॉक की पेशकश की, तुम कैसे सीधे MySQL में एक एक्सेल शीट लोड कर सकता है की एक त्वरित और गंदे उदाहरण के रूप में। सीएसवी के माध्यम से निर्यात/आयात करने की आवश्यकता को छोड़कर और उम्मीद है कि उन विशेष पात्रों में से अधिक को संरक्षित करना, और सामग्री से बचने के बारे में चिंता करने की आवश्यकता को समाप्त करना।
#!/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) स्ट्रिंग सूट करने के लिए, और यदि आवश्यक हो बहस करने के लिए एक उपयोगकर्ता के आईडी और पासवर्ड जोड़ें।
- यदि आपको XLSX समर्थन की आवश्यकता है तो स्प्रेडशीट :: XLSX पर त्वरित स्विच सभी आवश्यक है। वैकल्पिक रूप से यह केवल कोड की कुछ पंक्तियां लेता है, फ़ाइल प्रकार का पता लगाने और उपयुक्त पुस्तकालय को कॉल करें।
- ऊपर एक सरल हैक है, मान लिया गया एक सेल में सब कुछ एक स्ट्रिंग /अदिश है, अगर संरक्षण प्रकार महत्वपूर्ण है, एक कुछ regexp साथ एक छोटी सी समारोह में कुछ के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है, तो के बयानों संख्या सुनिश्चित/दिनांक, लागू प्रारूप में रहते हैं जब डीबी
उपरोक्त कोड, CPAN मॉड्यूल की एक संख्या पर निर्भर करता है आप, स्थापित कर सकते हैं कि आउटबाउंड एफ़टीपी पहुँच संभालने की अनुमति दी है के लिए लिखा एक के माध्यम से:
cpan YAML डेटा :: डम्पर स्प्रेडशीट :: ParseExcel टाई :: IxHash Encode Scalar :: फ़ाइल तक :: बेसनाम डीबीडी :: mysql
निम्नलिखित लाइनों के साथ कुछ लौट जाना चाहिए (TIS बल्कि धीमी गति से, ऑटो की वजह से प्रतिबद्ध):
# ./Excel2mysql.pl test.xls
FILE: test.xls
DB: test
Collection Count: 1
Table(WorkSheet name):Sheet1
Rows inserted(Rows):9892
कुछ कोड मददगार होगा – Ole
यह करने के लिए बहुत समान प्रतीत होता है डेटा के 5,000 पंक्तियों तक फ़ाइलों के लिए नि: शुल्क है [3,621,798] (http://stackoverflow.com/questions/3621798) – arober11
संभावित डुप्लिकेट [MySQL डेटाबेस में एक्सेल फ़ाइल को कैसे आयात करें] (http://stackoverflow.com/questions/1310166/how-to-import-a-excel-file-in-to-mysql-डेटाबेस) –