Perl (CPANモジュール) SpreadSheet::XLSX で読みがなまで読み出されてしまう問題

Excelファイル(.xlsx)をPerlで処理するモジュール「SpreadSheet::XLSX」ですが、(少なくとも)日本語環境で入力(IMEを使って仮名漢字変換)して作成したワークブックには、入力したカナ(変換前)が保存されており、それが SpreadSheet::XLSX で処理すると一緒に結合されて読み出されてしまいます。
例えばセルに、
『えくせる』→(変換)→『Excel』
と入力してあった場合、
『Excelエクセル』
というデータが読み出されます。

これはSpreadSheet::XLSXがそのような書類を想定していないためと思われます。Excelファイルのデータに保存されている、IMEの仮名漢字変換の入力を読み出さないようにパッチをあてます。(バージョン0.13用のパッチ)

--- XLSX.pm.orig	2010-05-16 18:07:33.000000000 +0900
+++ XLSX.pm	2013-08-30 18:08:12.000000000 +0900
@@ -12,6 +12,7 @@
 use Spreadsheet::XLSX::Fmt2007;
 use Data::Dumper;
 use Spreadsheet::ParseExcel;
+use CGI;
 
 ################################################################################
 
@@ -42,10 +43,12 @@
 	
 		my $mstr = $member_shared_strings->contents; 
 		$mstr =~ s/<t\/>/<\/t>/gsm;  # this handles an empty t tag in the xml 
+		$mstr =~ s%<rPh.*?>(.*?)%%gsm;  # ignores phonetic properties
 		foreach my $si ($mstr =~ /<si.*?>(.*?)<\/si/gsm) {
 			my $str;
 			foreach my $t ($si =~ /<t.*?>(.*?)<\/t/gsm) {
 				$t = $converter -> convert ($t) if $converter;
+				$t = CGI::unescapeHTML($t);
 				$str .= $t;
 			}
 			push @shared_strings, $str;

これで意図通りに動くはず。(ですがあくまで自己責任で。)

Bug #43247 for Spreadsheet-XLSX: two problems in treating shared string table
こちらを参考にさせていただきました。(バージョン0.09用のパッチもこちらにあります。)

ちなみに、このIME入力のデータは、ExcelのPHONETIC()関数で確認することができます。

Leave a Reply