написание экстеншена для работы с файлами Excel (xls)

_KV_

Новичок
Помогите с написанием экстеншена

Делая парсер xls файлов наткнулся на маханькую траблу.
Одна функция возвращает не то значение что должно если она используется после echo.

Выдержки из текста экстеншена

PHP:
xlsWorkBook* xls_find_workbook(pval *id TSRMLS_DC)
{
	int type;
	xlsWorkBook *wb;


	convert_to_long(id);
	wb = zend_list_find(Z_LVAL_P(id), &type); 

	if(!wb) { 
		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find identifier %d", id);
		return NULL; 
	} 
	if (type!=le_xls_wb) { 
		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Identifier is not WorkBook");
		return NULL; 
	} 

	return wb;
}

....
....

PHP_FUNCTION(xls_getcharset)
{
	pval *id;
	xlsWorkBook *wb;
	char* charset;

	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters(ht, 1, &id)==FAILURE) {
		WRONG_PARAM_COUNT;
	}

	wb=xls_find_workbook(id TSRMLS_CC);
	if(wb==NULL) RETURN_FALSE;

	charset=wb->charset;
	RETURN_STRING(charset,1);
}
текст php скрипта:
PHP:
	$wb=xls_open("e:/wwwroot/xls/test2.xls","KOI8-R");
	$list=0;
	echo "CSS:<pre>".xls_getCSS($wb)."</pre><br>";
	echo "Charset:".xls_getcharset($wb)."<br>";
        echo "Page \"".xls_getsheetname($wb,$list)."\" parsing...<br>";
	$ws=xls_getworksheet($wb,$list);
	if (xls_parseworksheet($ws)) 
	{
		echo "Ok<br>";
		$fws=xls_fetch_worksheet($ws);
		echo "<pre>";
		print_r($fws);
		echo "</pre>";
	}
результат:

CSS:
.xf0{ font-size:10pt;font-family: "Arial";background:#FFFFFF;text-align:left;vertical-align:bottom;}
.xf1{ font-size:10pt;font-family: "Arial Cyr";background:#FFFFFF;text-align:left;vertical-align:bottom;color:#000000;}
.xf2{ font-size:10pt;font-family: "Arial Cyr";background:#FFFFFF;text-align:left;vertical-align:bottom;color:#000000;}
.xf3{ font-size:10pt;font-family: "Arial Cyr";background:#FFFFFF;text-align:left;vertical-align:bottom;color:#000000;}
.xf4{ font-size:10pt;font-family: "Arial Cyr";background:#FFFFFF;text-align:left;vertical-align:bottom;color:#000000;}
.xf5{ font-size:10pt;font-family: "Arial";background:#FFFFFF;text-align:left;vertical-align:bottom;}

....
...
Charset:gzip <--- должно быть KOI8-R
Page "Price" parsing...
Ok

stdClass Object
(
[defcolwidth] => 2048
[rows] => stdClass Object
(
[lastcol] => 5
[lastrow] => 19
[row] => Array

.....
...
 

Yurik

/dev/null
В каком методе устанавливается аттрибут
wb->charset
?
очевидно при вызове других методов (xls_getCSS ?) перезаписывается значение атрибута wb->charset
Это гдето явно за пределами приведенного кода
 

_KV_

Новичок
Автор оригинала: Yurik
В каком методе устанавливается аттрибут
wb->charset
?
очевидно при вызове других методов (xls_getCSS ?) перезаписывается значение атрибута wb->charset
Это гдето явно за пределами приведенного кода
wb->charset устанавливается при вызове xls_open (в xls_open вызывается аналогичная функция из моей библиотеки libxls) и потом не меняет свое значение.

При вызове xls_getCSS, wb->charset не перезаписывается т.к. дальнейшее перекодирование текстов происходит правильно.

И еще одна фишка: если я значение функции xls_getCSS сохраняю в переменной а потом вывожу после echo xls_getcharset, все ок.
PHP:
$st=xls_getcss($wb);
echo "Charset:".xls_getcharset($wb)."<br>";
echo "<pre>".$st."</pre>";
результат:
Charset:KOI8-R
.xf0{ font-size:10pt;font-family: "Arial";background:#FFFFFF;text-align:left;vertical-align:bottom;}

PHP:
$st=xls_getcss($wb);
echo "<pre>".$st."</pre>";
echo "Charset:".xls_getcharset($wb)."<br>";
результат:
.xf68{ font-size:10pt;font-family: "Arial";background:#FFFFFF;text-align:left;vertical-align:middle;}
Charset:gzip


Поэтому я и подумал, что ошибка гдето в xls_getcharset кроется.
 

Popoff

popoff.donetsk.ua
где-то что-то с памятью не так... проверь все-таки внимательно то место, в котором ты заполняешь xlsWorkBook
 

tony2001

TeaM PHPClub
>charset=wb->charset;
>RETURN_STRING(charset,1);

1) смысл заведения charset, если ее просто вернуть надо?
2)
charset = (char *)emalloc(strlen(wb->charset) * sizeof(char));
strcpy(charset,wb->charset);

P.S. потестить дашь?
 

_KV_

Новичок
Автор оригинала: tony2001
>charset=wb->charset;
>RETURN_STRING(charset,1);

1) смысл заведения charset, если ее просто вернуть надо?
2)
charset = (char *)emalloc(strlen(wb->charset) * sizeof(char));
strcpy(charset,wb->charset);

P.S. потестить дашь?
Это я эксперементировал =)
раньше было
RETURN_STRING(wb->charset,1)
теже глюки

P.S. я его на sf.net кину как подправлю
(на днях в CVS залью), название проекта libxls
 

kvn

programmer
м...дя...

cvs -d:pserver:[email protected]:/cvsroot/libxls login
Logging in to :pserver:[email protected]:2401/cvsroot/libxls
CVS password:
cvs login: authorization failed: server cvs.sourceforge.net rejected access to /cvsroot/libxls for user anonymous

странно...
 

_KV_

Новичок
а если не под anonymous а под своим логином?
я нормально с него под своим гружу.
 

tony2001

TeaM PHPClub
под своим - смотри выше.
failed to obtain dir lock in repository `/cvsroot/libxls/libxls'...
при этом со своим проектом я работаю нормально.
 
Сверху