Блог. Скрипты

Перевод Excel в транслит и сохранение в формате CSV

Многие пользователи рано или поздно сталкиваются с задачей как конвертировать файл Excel в web формат CSV для дальнейшего использования на сайте.

Это достаточно просто сделать. Существует множество библиотек для расширения возможностей PHP и взаимодействия с икселевскими таблицами и не только.

Куда сложнее получить на выходе данные с нормальной кодировкой, а не кракозябрами, особенно, если в таблице есть кириллица (русские буквы).

Также, порой к этой задаче добавляется ещё одна - перевод кириллицы в транслитерацию или наоборот, например, заменить в фамилиях, прописанных в Excel русскими буквами, на английские.

Итак, давайте составим задачу и разобьём её по пунктам:

Решение:

Вот, собственно и всё, если в кратце. Ниже представлена форма, где можно посмотреть наглядно, как это работает. Внимание! Прежде, чем проводить конвертацию - убедитесь, что все нужные пункты («radio - круглешки») отмечены.

{:content1:}

Также здесь можно получить транслит текста, вписанного в поле textarea и транслит всего содержимого страницы, ссылку на которую пожно вписать в поле URL. Данная форма позволяет менять кодировки и есть выбор переводить ли буквы или нет.

Я специально не стала расписывать подробно весь процесс конвертации и перевода, ибо просто не смею лишать Вас удовольствия самостоятельно решить данные задачи. Однако, ниже выкладываю полностью рабочий код. Разве что нужно будет поменять пути к библиотеке и файлам.

Смотрите, пробуйте, разбирайтесь, Удачи!

ini_set ('file_uploads','On');
ini_set ('upload_tmp_dir','tmp');
ini_set ('upload_max_filesize','2M');

if($_POST['submit']) {

	if(isset($_POST['transl'])) {
		if($_POST['transl'] == "yes") {
			$trnsl = "yes";
		} else if($_POST['transl'] == "no") {
			$trnsl = "no";
		}
	}

	if($_POST['codirovka1'] == "auto") {
		$codfrom = 'auto';
		$codto = $_POST['list_cod'] ? $_POST['list_cod'] : '';
	} else if ($_POST['codirovka1'] == "manually") {
		$codfrom = $_POST['list_cod_from'] ? $_POST['list_cod_from'] : 'auto';
		$codto = $_POST['list_cod1'] ? $_POST['list_cod1'] : 'UTF-8';
	} else if ($_POST['codirovka1'] == "none_iconv") {
		$none_iconv = "none_iconv";
	}
	

	if($_POST['codirovka2'] == 'fileload') {
		if(!is_dir("load_f")) mkdir("load_f", 0777);
		
		$only_namefile = $_FILES['uploadexsel']['name'];
		$ext_file = pathinfo($only_namefile, PATHINFO_EXTENSION);
		
		if($ext_file == 'xlsx' or $ext_file == 'xls') {
			$uploadfile = 'load_f/'.basename($only_namefile);
			if(copy($_FILES['uploadexsel']['tmp_name'], $uploadfile)) { $rezult_csv = "Конвертация проведена!"; } else { $rezult_csv = 'Конвертация не проведена'; }
		} else { echo 'Вы можете загрузить только .xls или xlsx файлы!'; }
	}
	else if($_POST['codirovka2'] == 'bottom') {		
		$text_converts = strip_tags($_POST["text_cod"]);
		if(isset($none_iconv) and $none_iconv == "none_iconv") {
			$text_converts = translit_csv($text_converts);
		} else {
			$text_converts = translit_csv(iconv($codfrom, $codto, strip_tags($text_converts)));
		}
	}
	else if($_POST['codirovka2'] == 'url') {		
		$urlhtml_converts = $_POST["url_cod"];
		$urlhtml_converts = file_get_contents($urlhtml_converts);
		if(isset($none_iconv) and $none_iconv == "none_iconv") {
			$urlhtml_converts = translit_csv(strip_tags($urlhtml_converts));
		} else {
			$urlhtml_converts = translit_csv(iconv($codfrom, $codto, strip_tags($urlhtml_converts)));
		}
		$text_converts = $urlhtml_converts;
	}
	
	
}

function translit_csv($a) {
	if ($trnsl == "no") {
		$a = $a;
	} else if (!isset($trnsl) || $trnsl == 'yes') {
		$a = strtr($a, array(
			'Yo' => 'Ё', 'Zh' => "Ж", 'Ts' => "Ц", 'Ch' => "Ч", 'Sh' => "Ш", 'Shch' => "Ш", 'Ye' => "Э", 'Yu' => "Ю", 'Ju' => "Ю", 'Ya' => "Я",
			'YO' => 'Ё', 'ZH' => "Ж", 'TS' => "Ц", 'CH' => "Ч", 'SH' => "Ш", 'SHCH' => "Щ", 'YE' => "Э", 'YU' => "Ю", 'JU' => "Ю", 'YA' => "Я",
			'yo' => 'ё', 'zh' => "ж", 'ts' => "ц", 'ch' => "ч", 'sh' => "ш", 'shch' => "щ", 'ye' => "э", 'yu' => "ю", 'ju' => "ю", 'ya' => "я", 'sc' => 'cк', 'Ж' => 'ZH', 'ж' => 'zh', 'Ц' => 'TS', 'ц' => 'ts', 'Ч' => 'CH', 'ч' => 'ch', 'Ш' => 'SH', 'ш' => 'sh', 'Щ' => 'SHH', 'щ' => 'shh', 'Ю' => 'JU', 'ю' => 'ju', 'Я' => 'YA', 'я' => 'ya',
			'j' => "ж", 'J' => "Ж", 'w' => 'в', 'a' => "а", 'b' => "б", 'v' => "в", 'g' => "г", 'd' => "д", 'e' => "е", 'z' => "з", 'i' => "и", 'c' => "ц", 'C' => "Ц", 'y ' => "й ", 'y' => "ы", 'k' => "к", 'l' => "л", 'm' => "м", 'n' => "н", 'o' => "о", 'p' => "п", 'r' => "р", 's' => "с", 't' => "т", 'u' => "у", 'f' => "ф", 'h' => "х", 'A' => "А", 'B' => "Б", 'V' => "В", 'G' => "Г", 'D' => "Д", 'E' => "Е", 'Z' => "З", 'I' => "И", 'Y' => "Й", 'K' => "К", 'L' => "Л", 'M' => "М", 'N' => "Н", 'O' => "О", 'P' => "П", 'R' => "Р", 'S' => "С", 'T' => "Т", 'U' => "У", 'F' => "Ф", 'H' => "Х", 'Y' => "Й",
			
			'А' => 'A', 'а' => 'a', 'Б' => 'B', 'б' => 'b', 'В' => 'V', 'в' => 'v', 'Г' => 'G', 'г' => 'g', 'Д' => 'D', 'д' => 'd', 'Е' => 'E', 'е' => 'e', 'Ё' => 'E', 'ё' => 'e', 'З' => 'Z', 'з' => 'z', 'И' => 'I', 'и' => 'i', 'Й' => 'J', 'й' => 'j', 'К' => 'K', 'к' => 'k', 'Л' => 'L', 'л' => 'l', 'М' => 'M', 'м' => 'm', 'Н' => 'N', 'н' => 'n', 'О' => 'O', 'о' => 'o', 'П' => 'P', 'п' => 'p', 'Р' => 'R', 'р' => 'r', 'С' => 'S', 'с' => 's', 'Т' => 'T', 'т' => 't', 'У' => 'U', 'у' => 'u', 'Ф' => 'F', 'ф' => 'f', 'Х' => 'H', 'х' => 'h', 'Ъ' => '', 'ъ' => '', 'Э' => 'E', 'э' => 'e', 'Ь' => '', 'ь' => '', 'Ы' => 'Y', 'ы' => 'y'
		));
	}
	
	return $a;
}

if($uploadfile) {
$pos = strpos($only_namefile, ".");
$only_namefile = substr($only_namefile, 0, $pos);

$files = "load_f/".$only_namefile.".csv";
chmod("/".$files, 0777);

   require('Class_excel/spreadsheet-reader-master/php-excel-reader/excel_reader2.php');

    require('Class_excel/spreadsheet-reader-master/SpreadsheetReader.php');

    $Reader = new SpreadsheetReader($uploadfile);
	
	$handle = fopen($files, 'w+');
	
    foreach ($Reader as $Row)
    {
		foreach ($Row as $R => $v) {
			if($R === false) { } 
			else { 
					if(isset($none_iconv) and $none_iconv == "none_iconv") {
						$v = translit_csv($v);
					} else {
						$v = iconv($codfrom, $codto, $v);
						$v = translit_csv($v);
					}
				$Rowq[$R] = $v;
			}
		}
		$all = implode('; ',$Rowq)."
";

		fwrite($handle, $all);

    }
        fclose($handle);
	$rezult_csv1 = $rezult_csv." Скачать: /".$files;
}

 

Сама форма

<form class="codir" action="" method="post" enctype="multipart/form-data">
<h3 style="text-align: center;">Перевести русский текст в транслит и наоборот.<br />С конвертацией файла из excel в csv.</h3>
<div class="kodir_block">
<p class="da_net"><label>Перевести в транслит:</label> <input type="radio" name="transl" value="yes" checked="checked" /> Да </p>
<p><input type="radio" name="transl" value="no" /> Нет</p>
</div>
<div class="kodir_block">
<p><label>Перевести в:</label> <input type="radio" name="codirovka1" value="auto" checked="checked" /> автоматически, в
<select name="list_cod">
<option value="KOI8-U">KOI8</option>
<option value="UTF-8" selected="selected">UTF-8</option>
<option value="WINDOWS-1251">WINDOWS-1251</option>
<option value="CP-1251">UTF8</option>
</select>
</p>
<p><input type="radio" name="codirovka1" value="manually" /> Из
<select name="list_cod_from">
<option value="KOI8-U">KOI8</option>
<option value="UTF-8">UTF8</option>
<option value="WINDOWS-1251" selected="selected">WINDOWS-1251</option>
<option value="CP-1251">UTF8</option>
</select>
в
<select name="list_cod1">
<option value="KOI8-U">KOI8</option>
<option value="UTF-8" selected="selected">UTF-8</option>
<option value="WINDOWS-1251">WINDOWS-1251</option>
<option value="CP-1251">UTF8</option>
</select>
</p>
<p><input type="radio" name="codirovka1" value="none_iconv" /> не переводить кодировку</p>
</div>
<div class="kodir_block">
<p class="p_csv"><label>Что перевести:</label> <input type="radio" name="codirovka2" value="bottom" checked="checked" /> Нижеследующий текст <br />
<input type="radio" name="codirovka2" value="fileload" /> Файл: <input type="file" name="uploadexsel" /> <span class="komm_span">(При загрузке Excel файла с кириллицей рекомендуем выставить кодировку из UTF-8 в WINDOWS-1251)</span><br />
<input type="radio" name="codirovka2" value="url" /> URL: <input type="text" name="url_cod" style="width: 274px!important; max-width: none;" value="" /></p><span class="komm">'.$rezult_csv1.'</span></div>
<div class="kodir_block"><label>Введите ваш текст:</label>
<textarea name="text_cod" rows="7" cols="40" style="width: 365px!important;">'.$text_converts.'</textarea>
</div>
<p class="submit_p"><label><input type="hidden" name="q" value="" /></label>
<input type="submit" name="submit" class="submit" value="Конвертировать" /></p>
</form>

Смотреть все статьи