Archive for the ‘javascript’ Category

Excel (XLS) <-> CSV конвертация с помощью javascript-а и php

Saturday, July 26th, 2008

Наверняка любой php программист сталкивался с ситуацией, когда заказчик просит “экспорт товара из экзеля” или чего бы то ни было. И стон идет по всей земле русской (и нерусской)…

Первое, что приходит в голову – это каждый раз запускать Excel и сохранять файл в формате CSV, с которым php уже намного легче работать. Это – замечательное решение, когда число файлов меньше 10 и все они состоят только из одной страницы (поскольку экзель может экспортировать в CSV только страницы, те результат конвертации файла из 10 страниц будет 10 CSV файлов).

Вторая мысль: скачать какую-нибудь софтину, которая бы преобразовывала набор Excel файлов в CSV, включая все страницы. Но, погуглив чуток, сразу видно, что софтины эти все сплошь коммерческие. Можно, конечно, сломать.

Но есть и другой пусть: написать самому. Это очень легко реализуется, если использовать javascript и ActiveX компонент Excel.Application:

xls2csv.js

Этот скрипт необходимо поместить в папку с набором XLS файлов, создать папку output и tmp и набрать в коммандной строке:

cscript xls2csv.js

По завершении работы скрипта в output у нас появятся искомые CSV файлы, папку tmp можно почистить.

Для генерации Excel файлов на сервере я предпочитаю легкий класс ExcelWriter, написанный индусом Harish Chauhan-ом, тяжелому PEAR-овскому пакету Spreadsheet Excel Writer-у.

JavaScript – setTimeout: вызов метода объекта из другого метода c задержкой

Tuesday, July 15th, 2008

Столкнулся с такой проблемой:

есть класс:

CClass = function(){
	this.m_c = "Hello, B!";
	this.A = function(){
		...
	};
	this.B = function(e){
		alert(e);
	};
};

И нужно, чтобы из метода A вызвался метод B с задержкой (например, в 5 секунд).

Первое, что приходит на ум, это вставить в A такой код:

this.A = function(){
	setTimeout(function(){ this.B(this.m_c)}, 5000);
};

Это работать не будет, поскольку функция в setTimeout будет искать this объект в глобальной области.

В этой статье описаны различные варианты, как эту ситуацию можно обойти. Мне больше всего понравился этот способ:

this.A = function(){
	var thisObj = this;
	var toPass = this.m_c;
	setTimeout(function(){ thisObj.B(toPass)}, 5000);
};