Может, мне проще сделать это вообще на php на сервере, чтобы не было привязки к excel
Так я и сделал бы.
Через функцию, код которой приведу ниже, - прочитать CSV в массив, и потом в переборе массива генерировать нужные XML через, к примеру, SimpleXML.
Пример функции чтения CSV - можно читать только нужные столбцы, экономить память:
// чтение CSV в удобный массив
if (!function_exists('csv2array')) {
// $only_fields - массив с названиями нужных столбцов
function csv2array($file, $charset_in = 'windows-1251', $charset_out = 'utf-8', $only_fields = [])
{
$handle = fopen($file, 'r');
if ($handle === false) {
echo 'Не удалось открыть файл '.$file;
return false;
}
$data = $fields = [];
$i = 0;
if ($handle) {
while (($row = fgetcsv($handle, 0, ';')) !== false) {
if (empty($fields)) {
foreach ($row as $k => $r) {
$row[$k] = iconv($charset_in, $charset_out.'//IGNORE', $r);
}
$fields = $row;
continue;
}
foreach ($row as $k => $value) {
if (!empty($fields[$k])) {
if (!empty($only_fields) && is_array($only_fields) && !in_array($fields[$k], $only_fields)) {
continue;
}
$value = iconv($charset_in, $charset_out.'//IGNORE', $value);
$data[$i][$fields[$k]] = $value;
}
}
$i++;
}
if (!feof($handle)) {
echo 'Error: unexpected fgets() fail'.PHP_EOL;
}
fclose($handle);
}
return $data;
}
}