Не усложняйте без необходимости. Нужна конкретная тренировка - получайте ее объект без всяких коллекций. Либо самостоятельно (Training::findOne(['training_id' => $trainingId])), либо через клиента ($client->getTraining($trainingId))
HTML вне <?php ?> в шаблоне - это нормально.
HTML в виде строки PHP - признак говнокода. Потому что такой код сложно валидировать и гарантировать корректность.
Excel-файл нельзя записать частично, он будет невалидным.
А вот CSV-файл можно. А если правильно написать код и избежать утечек памяти, то записывать CSV-файл можно почти неограниченного размера даже при небольшой оперативной памяти.