2014-01-24 1 views
1

У меня возникла проблема, которую я раньше не видел при работе с версией javascript Microsoft.JavaScript Excel.Application ActiveX cell.Value возвращает значение типа date, в котором нет toString() в своем прототипе

Я обрабатываю документы Excel через объект jscript ActiveX «Excel.Application». Я запускаю свой сценарий непосредственно на своем компьютере (это не веб-приложение, а скриптовый инструмент).

У меня есть этот кусок кода, который работает отлично подходит для большинства значений я получаю из документа:

var excel_application_object = new ActiveXObject("Excel.Application"); 
(...) 
var excel_workbook_object = excel_application_object.Workbooks.Open("c:\\excel.xls"); 
(...) 
var worksheet_object = excel_workbook_object.Sheets(1); 
(...) 
for (var icnt = 1 ; icnt <= worksheet_object.Cells.SpecialCells(11).Row ; icnt ++) 
{ 
    WScript.Echo(typeof worksheet_object.Cells(kcnt, lcnt).Value); 
    WScript.Echo(worksheet_object.Cells(kcnt, lcnt).Value.toString()); 
} 

Кажется, что для некоторых клеток я получаю сообщение об ошибке при вызове 'ToString(). Эти клетки типа довольно странно:

typeof worksheet_object.Cells(kcnt, lcnt).Value == "date" 

Это не может быть объектом JavaScript Дата,

typeof (new Date()) == "object" 

ли кто-нибудь сталкивался с этим вопросом раньше? Мне нужно проанализировать значение для String, чтобы впоследствии выполнить строковые операции.

Большое спасибо!

ответ

2

Вам нужно иметь в виду, что вы обрабатываете значения, возвращаемые из объекта ActiveXObject. ActiveX не написаны с использованием JavaScript (часто используемые слова являются, например, C, C++ или #C), поэтому они не имеют prototype и не реализуют никаких стандартов ECMA-Script. Тип возвращаемого значения может отличаться, и возвращаемое значение может быть типом, не известным в JS.

В вашем случае похоже, что вы получите значение из ячейки, содержащей объект Excel Date. В отличие от JS, Excel также имеет собственный тип данных Date, который, по-видимому, может считывать оператор типа JS.

Чтобы получить строку из собственности ActiveX, вы можете сделать

var str = new String(ActiveX.property); 

Это не пуленепробиваемые, но он работал для меня везде я использовал его.

+0

Teemu, большое спасибо за этот намек! Итак, вы предполагаете, что существует конструктор String, который будет обрабатывать тип ActiveX.property, или я предполагаю, что вы завершите его в try..catch? – Greg0ry

+0

Ваш ответ позволяет мне разглядеть синтаксический анализ значений excel. Большое спасибо! – Greg0ry

+0

Конструктор String предлагается JS, хотя он может выйти из строя. Было бы хорошей идеей обернуть его в 'try ... catch'. – Teemu