Рейтинг:2

Как вернуть файл XLS для загрузки при отправке формы

флаг je

Я пытаюсь создать файл XLS и отправить его в браузер при отправке формы, но не могу понять, как это сделать. Я использую модуль сериализации XLS, но я открыт для всех других предложений.С помощью этого модуля я успешно создал несколько представлений с функцией экспорта XLS. Но теперь у меня есть форма, и файл excel должен быть создан при отправке формы в зависимости от отправленных данных.

Я создал следующий код, но если я отправлю форму, я не получу файл excel для загрузки:

класс MyForm расширяет FormBase {
  частный SerializerInterface $serializer;

  общедоступная статическая функция create(ContainerInterface $container) {
    вернуть новый статический ($ контейнер-> получить ('сериализатор'));
  }

  публичная функция __construct (SerializerInterface $ сериализатор) {
    $this->сериализатор = $сериализатор;
  }

  // Удалены buildForm() и т. д. для простоты

  публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
    $response = (новый StreamedResponse(функция () использования ($selected_values) {
      $this->serializer->serialize([[1, 2, 3], [4, 5, 6]], 'xlsx');
    }))->отправить();

    $form_state->setResponse($response);
  }
}
флаг fr
"didn't work" ? Not sure what that means exactly ... The only weird thing I can see is the ->send(), but you left out some code and you don't say what the error or problem is.
Елин Й. avatar
флаг je
это означает, что когда я отправляю форму, я не получаю файл excel для загрузки
Рейтинг:4
флаг in

Во-первых, вам нужен сериализатор для xls(x), я использовал https://www.drupal.org/project/xls_serialization

Следующий пример кода должен доставить то, что вам нужно:

публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
  $values ​​= $form_state->getValues();
  $filename = "случайный_файл_" . ранд() . ".xlsx";

  $response = новый StreamedResponse(функция () использование ($values) {
    echo $this->serializer->serialize([[1, 2, 3], [4, 5, 6]], 'xlsx');
  });
  $response->headers->set('Content-Type', 'application/vnd.ms-excel');
  $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');

  $form_state->setResponse($response);
}

Я попробовал это с предоставленным кодировщиком XLS https://www.drupal.org/project/xls_serialization и это сработало.

Удачи!

Использованная литература:

Елин Й. avatar
флаг je
Спасибо, я разработал рабочее решение. Но с немного другой и более простой функцией обратного вызова в StreamedResponse. Вы не возражаете, если я обновлю ваш код?
Stefanos Petrakis avatar
флаг in
Если это тот же подход, да, пожалуйста. В противном случае на этот вопрос нужен другой ответ, чем мой. Любопытно в любом случае! Код обратного вызова, который я написал, был основан на вашем вопросе, возможно, вы можете обновить вопрос, и тогда я смогу обновить свой ответ.
Елин Й. avatar
флаг je
Обновил код на тот, который работал у меня. Пожалуйста, проверьте мои изменения: https://drupal.stackexchange.com/posts/308007/revisions. Если вы хотите, вы все равно можете вернуться к своей версии. Спасибо.
Stefanos Petrakis avatar
флаг in
Итак, все, что вам нужно, это часть заголовков, чтобы заставить ваш код работать, верно?
Елин Й. avatar
флаг je
Не только заголовки. Я также добавил `echo` к обратному вызову StreamedResponse и удалил метод `send()`, который использовал вначале.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.