名前付き範囲に参照切れがあるとXMLSSのインポートに失敗する(Excel-Xml Library)
Excelはセルの範囲に名前をつけて管理することができるが、それが他のブックやシートで、仮にアクセスできない場所に移動してしまった場合、範囲の値は参照が切れてしまう。
Excel 2007で「名前の管理」で見た時に、参照が切れている場合
名前 | 値 | 参照範囲 |
hoge | #REF! | =\\foobar\work\[foo.xls]... |
以前に紹介した、XMLSSのインポート/エクスポートを.NET C#だけで実現できるExcel Xml Libraryを使って、このような「切れた参照」があるシートをXMLSS形式で読み込むと例外を発生してしまうようだ。
オブジェクト参照がオブジェクト インスタンスに設定されていません。 場所 Yogesh.ExcelXml.FormulaParser.ParseRange(Cell cell, Match match, Range& range, Boolean absolute) 場所 Yogesh.ExcelXml.Range.ParseUnresolvedReference(Cell cell) 場所 Yogesh.ExcelXml.ExcelXmlWorkbook.ResolveNamedRangeReferences() 場所 Yogesh.ExcelXml.ExcelXmlWorkbook.Import(Stream stream) 場所 TransformSamples.Program.Main(String args) 場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String args) 場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 場所 System.Threading.ThreadHelper.ThreadStart()
調べてみると、以下の"名前付き範囲"の要素の属性"=#REF!"で例外が発生しているようだ。
取り敢えず参照が切れている場合は、Yogesh.ExcelXml.FormulaParser.ParseRangeを呼び出さないように修正したが、これはシート側の問題だけに、何かログを吐いた方が良いのかもしれない。というのも、この例外が出たXMLSSは保存してもExcelで開けないからだ。
Excelの名前付き範囲(range names)は作ったはいいけど、このように忘れてしまって、後で参照切れに気がつくことが多いんで、今回の用途には使わないほうがよいだろうな。せいぜい、"Print_Area"位か。