Я использую модуль PowerShell ImportExcel для преобразования файлов Excel в файлы csv:
экспортCSV.ps1:
Param(
[string]$cInput,
[string]$cOutput,
[string]$cSheet
)
if (!$cInput -Or !$cOutput -Or !$cSheet) { Write-Host "failed" }
else {
try {
Import-Excel -WorksheetName $cSheet -Path $cInput -NoHeader | Export-Csv $cOutput -NoTypeInformation -encoding utf8
Write-Host "done"
} catch {
Write-Host $error
}
}
команда для запуска скрипта:
powershell -File "D:\test\exportCSV.ps1" -cInput "D:\test\testFile.xlsx" -cOutput "D:\test\testFile.csv" -cSheet "Sheet 1"
Когда я запускаю этот скрипт прямо в cmd, он работает без проблем. Но когда я запускаю php с помощью shell_exec(), я получаю следующую ошибку:
Exception calling "Load" with "1" argument(s): "Exception of type 'System.OutOfMemoryException' was thrown."
testFile.xlsx имеет размер 91 094 КБ. Когда я использую файл размером всего 27 307 КБ, он также работает с PHP shell_exec(). Я уже проверил memory_limit в php.ini (256M), так что это не должно быть проблемой.






Объем памяти, который файл занимает на диске, не обязательно будет соответствовать размеру объектов данных после импорта. Особенно, если файлы xslx сжаты (не знаю, сжаты ли они)
Я бы рекомендовал временно увеличить memory_limit до 1024M и повторить попытку с testFile.xlsx, чтобы убедиться, что не требуется просто больше места для хранения импортированных данных в памяти.
Если это не сработает, это может быть ошибка в импортере, которая тратит память впустую.
Последняя часть этого ответа кажется правильной. проверил использование памяти, запустив скрипт непосредственно в powershell, и во время работы он занимает более 1000 МБ памяти...
изменен на 1024M, и ошибка все еще возникает.