2012-03-15 86 views
1

Spreadsheet::ParseExcel可以正常工作,但是我需要一種方法來讀取沒有它的文件,可以說「隨帶Perl」,因爲我無法安裝任何PM或CPAN模塊。有沒有人有建議讓我開始?如何用Perl讀取excel文件?

+1

[Are](http://shadow.cat/blog/matt-s-trout/but-i-cant -use-cpan /)[you](http://www.perlmonks.org/?node=693828)[sure](http://twiki.org/cgi-bin/view/TWiki/HowToInstallCpanModules#Setting_a_private_CPAN_librar)[你](http://twiki.org/cgi-bin/view/TWiki/HowToInstallCpanModules#Installing_CPAN_modules_manually)[can not](http://linuxgazette.net/139/okopnik.html)[use](http:/ /www.thegeekstuff.com/2008/09/how-to-install-perl-modules-manually-and-using-cpan-command/)[CPAN](http://www.activestate.com/blog/2010/ 10 /如何安裝,CPAN模塊-的activeperl)? – mob 2012-03-15 17:16:12

+0

完全確定...不是超級用戶,請求被拒絕 – isJustMe 2012-03-15 17:17:44

+4

您可以使用模塊而不需要以根用戶身份進行安裝。 – 2012-03-15 17:22:16

回答

5

什麼是使用CPAN模塊相對輕鬆的工作實際上是沒有他們非常困難。

對於打開Excel二進制數據(BIFF)存儲在另一個二進制文件格式稱爲OLE複合文件,這就像一個文件內的文件系統,BIFF數據可能不會被順序存儲,所以開始時你必須編寫一個解析器來獲取數據。

一旦提取了原始BIFF數據,您必須解析它才能找到單元數據。這樣稍微簡單一點,但仍然存在諸如將字符串存儲在離開單元數據的散列表中的困難。和日期無法區分純數字。和合並單元格中的數據。而且一切仍然是二進制的,位掩碼控制着數據結構的含義。

幸運的是,所有這些令人頭疼的事情已經被其他人所困擾,並且被包裹在module之中,所以沒有其他人必須忍受它們。

因此,即使您的管理員不會爲您安裝模塊,也有很多方法可以在本地使用install modules或甚至install perl,這樣您就不必打擾他們。最後,這可能會是一個更簡單的解決方案。

*我部分地。

+0

麥克納馬拉先生,我是你的工作的粉絲,我會聽取你的意見和追求模塊的安裝。 – isJustMe 2012-03-15 18:36:12

2

OpenDocument is an ISO standard所以你可能閱讀規範並編寫你自己的解析器。

CPAN模塊的存在是因爲有很多事情(一些簡單的,一些複雜的),人們想做的事情不適合成爲核心語言的一部分。解析Excel電子表格就是其中之一(更復雜的一個)。

您應該修復阻礙您安裝模塊的障礙。它可能是管理性的(在這種情況下,您需要遊說以更改策略),它可能是技術性的(在這種情況下,您可能需要了解local::lib

+0

感謝您的建議,而不是我正在尋找的答案。 – isJustMe 2012-03-15 18:25:38

+0

對不起,我以爲我看到在之前的評論中導出爲CSV是一個選項。我現在看到我錯了。 – 2012-03-19 05:46:37

0

將電子表格導出到csv文件並解析它有或沒有Text::CSV

+0

感謝您的建議,這實際上是我想要做的..讀取文件並通過Perl導出爲CSV。我需要這個以編程方式進行。 – isJustMe 2012-03-15 17:35:23

+0

你可以下載[XLS2CSV](http://download.cnet.com/XLS2CSV/3000-2079_4-10718456.html)嗎? – mob 2012-03-15 17:54:18

+0

是的,我可以但最新的用途呢?不妨將單擊文件另存爲excel中的csv。 – isJustMe 2012-03-15 18:12:11

0

我將基於@mob關於Text :: CSV的上述回答。前一段時間,我在CPAN上發現Text:CSV::Slurp,並且是即時轉換。它採用帶有標題行的CSV文件並返回hashref的arrayref,其中的鍵是標題行中的名稱。很明顯,這在所有情況下都不起作用,但如果它確實代碼很簡單:

my $slurp = Text::CSV::Slurp->new; 
my $data = $slurp->load(file => $filename); 
for my $record (@$data) { 
    ... 
} 
+0

謝謝,問題是我必須解析一個XLS文件而不是CSV – isJustMe 2012-03-17 19:39:34