[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHPExcel чтение формул
sl4mmer
Как в это либе при чтении интерпретировать формулы? Использую метод GetCalculatedValue и один черт из ячеек где были формулы получаю значения вида (СЦЕПИТЬ A5,B5) ((



З.Ы. Гуглил - не помогло(



Спустя 9 часов, 4 минуты, 16 секунд (20.07.2010 - 11:13) SlavaFr написал(а):
пробовал PHPExcel_Settings::setLocale('ru');
зделать?

Спустя 16 минут, 20 секунд (20.07.2010 - 11:29) Joker написал(а):
ему скоее всего нужен результат этих формул)

Спустя 40 минут, 22 секунды (20.07.2010 - 12:09) SlavaFr написал(а):

<?php
error_reporting(E_ALL);
include 'PHPExcel-1.7.3/PHPExcel.php';
include 'PHPExcel-1.7.3/PHPExcel/Writer/Excel2007.php';

$objPHPExcel = new PHPExcel();


$objPHPExcel->setActiveSheetIndex(0);
$s=$objPHPExcel->getActiveSheet();
$s->SetCellValue('A1', '1');
$s->SetCellValue('B2', '2');
$s->SetCellValue('C1', '3');

$s->SetCellValue('D2', '=CONCATENATE(A1,B2,C1)');
echo $s->getCell('D2')->getCalculatedValue().'<br />';

PHPExcel_Settings::setLocale('ru');
$s->SetCellValue('D2', '=СЦЕПИТЬ(A1,B2,C1)');
echo $s->getCell('D2')->getCalculatedValue();

работает.

Спустя 8 минут, 28 секунд (20.07.2010 - 12:18) SlavaFr написал(а):
забыл сказать, формула должна в utf-8 быть написана, тогда ненадо setLocale делать.

Спустя 2 дня, 8 часов, 53 минуты, 24 секунды (22.07.2010 - 21:11) sl4mmer написал(а):
вобщем я решил проблему круче - я сказал манагерам, что перед анализом прайсов надо делать Копировать ->Специальная Вставка->Вставить Значения )))


а вообще написал муторный быдлоскрипт.... вот выложу - кто поймет зачем он нужен - тому может пригодиться))


вобщем выложу сначала ТЗ - даб объяснить зачем это надо
Цитата
Дано:
Несколько XLS таблиц в отдельных файлах, одна из таблиц – эталонная, остальные рабочие. Во всех таблицах есть ключевое поле (столбец), содержащее некоторые однотипные данные, частично или полностью совпадающие.

Задача.
Написать программу, которая выполняет следующие функции:
1. Проходится по значениям ключевого поля эталонного файла, находит такое же значение в рабочем файле и копирует данные (из указанных в настройке колонок) соответствующие найденному ключевому полю из рабочего файла в копию эталонного файла, который считается результирующим фалом.
2. Если в рабочем файле (который первоначально есть копия эталонного) уже существует соотв. колонка, в которую копируются данные, то новые значения переписывают старые.
3. При этом во время поиска по ключевым полям допускается незначительные различия в значениях.
4. Алгоритм поиска (капитализация игнорируется, пробелы в начале и в конце строчки игнорируются):
a. Обычный режим поиска:
i. Если значения в ключевых полях полностью совпадают и найдено только одно совпадение, то молча копируем указанные данные.
ii. Если значения в ключевых полях не совпадают полностью, но отличаются в пределах допустимого количества ошибок (задается в файле настроек для каждого рабочего файла отдельно), либо найдено несколько совпадений, то выводим значение и номер строчки из эталонного файла и список найденных похожих значений с номерами строк из рабочего файла и предоставляем возможность пользователю выбрать правильный вариант. Для выбранного варианта копируем данные.
iii. Если значения в ключевых полях различаются больше чем на допустимое кол-во ошибок, то считаем что значения разные.
b. Специальный режим поиска. В файле настроек для отдельного рабочего файла можно задать специальный режим поиска, при котором программа работает по описанному выше алгоритму, с тем отличием, что ключевые поля сравниваются не полностью, а проверяется, что значение ключевого поля из эталонного файла полностью или в пределах допустимого кол-ва ошибок присутствует в значении поля из рабочего файла. Например:
значение в эталонном файле – «абра-кадабра1»
в рабочем файле есть следующие записи по строчкам:
1. «абра-кадабра1 еклмн 2»
2. «абря-кадабра1 еклмн упрст»
3. «абря-кадабря1 еклмн упрст»
в настройках задан специальный алгоритм поиска с допустимым количеством ошибок = 1. Тогда критериям поиска удовлетворяют строчки 1 и 2.
5. Настройки программы хранятся и загружаются из легко редактируемого *.ini файла (в текстовом формате), в котором задаются следующие параметры:
a. имя эталонного файла, имя результирующего файла, имя (одно или несколько) рабочего файла.
b. название ключевого поля в эталонном файле, название ключевого поля в рабочем файле.
c. критерии поиска по ключевому полю: режим поиска и допустимое кол-во ошибок. Если ничего не указано, то работаем по обычному режиму поиска  с допустимым количеством ошибок = 0.
d. список полей, которые нужно копировать из рабочего файла с указанием названия для этих полей (столбов таблицы) в результирующем файле.
в случае нескольких рабочих фалов, для каждого из них создается отдельная секция в *.ini файле с описанными выше настройками.
6. Программа должна уметь работать в командно-строчном режиме. В этом режиме на вход программе подается только файл с настройками и имя файла отчета о работе. Вся работа выполняется срыто без сообщений пользователю, все неоднозначности (ситуации, где требуется вмешательство пользователя) выводятся в текстовой файл отчета о работе без приостановки работы (при этом для неоднозначных вариантов в результирующий файл ничего не записывается).




А вот и Быдлокод )))



<?
ini_set('memory_limit', '1024M');
set_time_limit(0);
error_reporting(55);
set_include_path(get_include_path().
PATH_SEPARATOR . 'Classes/');
include_once 'PHPExcel/IOFactory.php';
include_once "PHPExcel/Writer/Excel5.php";
if (!$_GET['file']) $inif=1; else $inif=$_GET['file'];
$config=parse_ini_file('conf'.$inif.'.ini',TRUE);

$data=get_row($config['FILE']['template'],$config['KEY']['template']);
$data2=get_row($config['FILE']['work'],$config['KEY']['work']);

$result=find_matches ($data,$data2);
#print_r ($result);
$next=$config['REPLACE'];
foreach ($next as $key){
$kk++;
$pos=strpos($key,'-');
$gett[$kk]=substr($key,++$pos);
$ins[$kk]=substr($key,0,--$pos);

$for_insert[]=get_row($config['FILE']['work'],$gett[$kk]);
}
if ($_POST['decide']){
$i_all=0;
foreach ($_POST as $decided) {
if (($decided==1)||($decided=='')) continue;
$result[]=$decided;
}
}

if (($config['KEY']['auto_mode']==0)&($i_all>0)) make_choise($strange);

if (($config['KEY']['auto_mode']==1)||($i_all==0)) $flag=1;
if ($flag==1){
$pasted=paste_data ($next,$result,$config,$for_insert);
if ($config['KEY']['auto_mode']==1){
$pasted.='<br>Проигнорированы следующие неоднозначности';
if (!empty($strange)){
foreach ($strange as $str) {
$pasted.='<br>';

foreach ($str as $str2){
$pos=strpos($str2,'_');
$in_work=substr($str2,0,$pos);
$in_temp=substr($str2,++$pos);
$k=$data[$in_work];
$pasted.=" <b>$str2</b> (".$k." - $data2[$in_temp]) ";
}
}
}
}


echo form_report($pasted);
}

function make_choise($strange){
global $data,$data2,$config;
$kkk=0;
$i_prev=0;
$i_next=0;
foreach ($config['HELPER'] as $helper){
if ($helper<$config['KEY']['work']) {$prev[$i_prev]=get_row($config['FILE']['work'],$helper);
$i_prev++;}
if ($helper>$config['KEY']['work']) $next[$i_next]=get_row($config['FILE']['work'],$helper);
$i_next++;
}

echo '<form action=index.php method=POST>';

foreach ($strange as $str) {
$output.='<select name='.$kkk.'> <option value="">Не производить действий</option>';

foreach ($str as $str2){
$pos=strpos($str2,'_');
$in_work=substr($str2,0,$pos);
$in_temp=substr($str2,++$pos);
$k=$data[$in_work];
for($i=0;$i<$i_prev;$i++) $pprev.=" ".$prev[$i][$in_temp];
for($i=0;$i<$i_next;$i++) $pnext.=" ".$next[$i][$in_temp];
$output.=" <option value=$str2>$str2    ($pprev)   $data2[$in_temp]  ($pnext)</option> ";
unset ($pprev);
unset ($pnext);
}
$output.='</select>';
echo "<br> Неоднозначность! (В Шаблоне -$data[$in_work] (строка $in_work)) ".$output;
unset ($sfk);
unset($output);
$kkk++;
}
echo "<br><input type=hidden name=decide value='1'><input type=submit value=Вперед ></form> ";
}
function paste_data ($next,$result,$config,$for_insert){
global $gett,$ins;
$objPHPExcel = PHPExcel_IOFactory::load($config['FILE']['template']);
$objPHPExcel->setActiveSheetIndex(0);
$aSheet = $objPHPExcel->getActiveSheet();
#print_r ($result);
if (empty($result)) $flag=1;
if ($flag!=1){
foreach ($result as $key){
$pos=strpos($key,'_');
$in_work=substr($key,0,$pos);
$in_temp=substr($key,++$pos);
$kk=0;
$pasted.="<br> Вставляем значения по строке $in_work";
foreach ($ins as $flag){
# echo "<br>в $flag.$in_work ".$for_insert[$kk][$in_temp];
$aSheet->setCellValue($flag.$in_work, $for_insert[$kk][$in_temp]);
$kk++;
}
}
}

$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
$objWriter->save($config['FILE']['result']);
$objPHPExcel->__destruct;
return $pasted;
}

function form_report($pasted){
global $config, $strange,$inif,$result;
$file=fopen('report.htm','w');
fputs ($file,$pasted);
fclose($file);
$ninif=$inif;
$ninif=$ninif+1;
if (file_exists('conf'.$ninif.'.ini')) $nfl='<br><a href=index.php?file='.$ninif.'>Перейти к обработке следующего файла </a> <br>';
if ((empty($result))||(($config[KEY][auto_mode]==1)&(empty($strange)))) $kdx='Ни одного совпадения не найдено'; else $kdx="если желаете, ознакомтесь с <a href=report.htm target=_blank>файлом отчета</a> ";
echo "Обработка рабочего файла № $inif завершена, $kdx $nfl<br> <a href=index.php> Старт с начала </a>";
}
function find_matches ($first,$second){
global $strange,$i_all;
$i_all=0;
foreach ($first as $prime){
$stroka1++;
if ($stroka1==1) continue;
$stroka2=0;
$f_first= strtolower($prime);
$f_first=trim ($f_first);
$i=0;
$i_choise=0;
if ($f_first=='') continue;
foreach ($second as $slave){
$prohod++;
$stroka2++;
$f_second= strtolower($slave);
$f_second=trim ($f_second);
$res=compare($f_first,$f_second);
$dan=$stroka1.'_'.$stroka2;
if ($res==1) {
$choise[$i]=$dan;
$i++;
}
if ($res==2)
{

$choise_i[$i_choise]=$dan;
$i_choise++;
}
}

if ($i==1) {
$result[]=$choise[0];
} else {
if ($i>1){ foreach ($choise as $chs) $strange[$stroka1][]=$chs;
$i_all++;
unset ($chs);
unset($choise);
}
}

if (($i==0)&($i_choise==1)) {
$result[]=$choise_i[0];
unset($i_choise);
$i_all++;
}
if ($i_choise>0){ foreach ($choise_i as $chsi) $strange[$stroka1][]=$chsi;
$i_all++;
unset($choise_i);
}
}

return $result;
}

function compare ($a,$b){
global $config;

if ($a==$b) {
return 1;
} else {
$len=strlen($a);
if ($config['KEY']['special_mode']==0){
$code=2;
if (levenshtein($a,$b)<=$config['KEY']['simular']) {
return $code;
}
}
else {
for ($f=0;$f<=(strlen($b)-strlen($a));$f++){
if (strpos($b,$a)!=FALSE) {
return 1;
break;
}
$try=substr($b,$f,strlen($a));
if (levenshtein($a,$try)<=$config['KEY']['simular']){
return 2;
break;
}
}
}
}
}

function get_row($file,$therow){
$objPHPExcel = PHPExcel_IOFactory::load($file);
$objPHPExcel->setActiveSheetIndex(0);
$aSheet = $objPHPExcel->getActiveSheet();
$stroka=1;
foreach($aSheet->getRowIterator() as $row){
$stroka++;
}
$objPHPExcel->__destruct;
$objPHPExcel = PHPExcel_IOFactory::load($file);
$objPHPExcel->setActiveSheetIndex(0);
$aSheet = $objPHPExcel->getActiveSheet();
for($i=1;$i<=$stroka;$i++){
$data[$i]=$aSheet->getCell($therow.$i)->getValue();
}
$objPHPExcel->__destruct;
return $data;
}
?>



Спустя 4 часа, 11 минут, 26 секунд (23.07.2010 - 01:23) SlavaFr написал(а):
Код короче совсем не хороший и может служить примером того, как не надо программировать. При этом я не имею в виду стиль программирования, а то что ты конкретно напрограммировал.

get_row, это вообще полный улет, 2 раза ексель открывать чтобы столбец в масив загнать!

Не знаю даже что тебя побудлило выставить этот код в форуме, кому он в таком виде может быть нужен?


_____________
Неявное преобразование типов - это когда на вопрос "Нахрен?" вы отвечаете "Что значит зачем?!" ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.