Проблемы с генерацией отчета в Excel через shinyapps

Вопрос или проблема

Я пытаюсь следовать этому руководству, и когда я пытаюсь его запустить и нажимаю кнопку загрузки, он выдает мне html-файл, и я не знаю почему. Это касается не только этого скрипта, но и моего личного проекта.

Вот код:

library(shiny)
library(openxlsx)

# создаем некоторые примерные данные для загрузки
my_table <- data.frame(
  Name = letters[1:4],
  Age = seq(20, 26, 2),
  Occupation = LETTERS[15:18],
  Income = c(50000, 20000, 30000, 45000)
)

# добавляем строку с итогами
my_table <- rbind(
  my_table,
  data.frame(
    Name = "Total",
    Age = NA_integer_,
    Occupation = "",
    Income = sum(my_table$Income)
  )
)

# минимальный интерфейс Shiny
ui <- fluidRow(
  column(
    width = 12,
    align = "center",
    tableOutput("table_out"),
    br(),
    downloadButton(
      "download_excel", 
      "Скачать данные в Excel"
    )
  )
)

# минимальный сервер Shiny
server <- function(input, output) {
  output$table_out <- renderTable({
    my_table
  })
  
  
  output$download_excel <- downloadHandler(
    filename = function() {
      "employee_data.xlsx"
    },
    content = function(file) {
      my_workbook <- createWorkbook()
      
      addWorksheet(
        wb = my_workbook,
        sheetName = "Данные сотрудников"
      )
      
      setColWidths(
        my_workbook,
        1,
        cols = 1:4,
        widths = c(6, 6, 10, 10)
      )
      
      writeData(
        my_workbook,
        sheet = 1,
        c(
          "Название компании",
          "Данные сотрудников"
        ),
        startRow = 1,
        startCol = 1
      )
      
      addStyle(
        my_workbook,
        sheet = 1,
        style = createStyle(
          fontSize = 24,
          textDecoration = "bold"
        ),
        rows = 1:2,
        cols = 1
      )
      
      writeData(
        my_workbook,
        sheet = 1,
        my_table,
        startRow = 5,
        startCol = 1
      )
      
      addStyle(
        my_workbook,
        sheet = 1,
        style = createStyle(
          fgFill = "#1a5bc4",
          halign = "center",
          fontColour = "#ffffff"
        ),
        rows = 5,
        cols = 1:4,
        gridExpand = TRUE
      )
      
      addStyle(
        my_workbook,
        sheet = 1,
        style = createStyle(
          fgFill = "#7dafff",
          numFmt = "comma"
        ),
        rows = 6:10,
        cols = 1:4,
        gridExpand = TRUE
      )
      
      saveWorkbook(my_workbook, file)
    }
  )

  
}

shinyApp(ui, server)

Ошибка, которая появляется в консоли, выглядит так:
Предупреждение: Ошибка в : wb должен быть Workbook
1: runApp

Но я уже проверил, и в коде my_workbook <- createWorkbook(), так что я не знаю, что может быть не так.

Ответ или решение

Генерация отчета в Excel через shinyapps: решение проблемы

Введение

Ваша проблема с генерацией отчета в Excel через приложение Shiny достаточно распространена среди разработчиков. Если вы получаете HTML-файл вместо ожидаемого Excel-документа, вероятная причина может скрываться в ошибках кода, связанных с неправильно созданным объектом рабочего файла. Давайте разберем ваш код и найдем решение этой проблемы.

Анализ кода

Ваш код включает основные функции для генерации отчета в Excel. Однако вы столкнулись с ошибкой:

Warning: Error in: wb must be a Workbook

Это указывает на то, что функция saveWorkbook не принимает корректный объект рабочего файла. В вашем случае объект my_workbook, создаваемый через createWorkbook(), может не быть должным образом доступным в момент его использования.

Возможные решения и улучшения

Давайте посмотрим на ваш код и внесем необходимые изменения.

  1. Убедитесь в правильности загружаемых библиотек:
    Убедитесь, что вы правильно загружаете все нужные библиотеки:

    library(shiny)
    library(openxlsx)
  2. Использование функции createWorkbook:
    Проверьте, что функция createWorkbook() вызывается корректно и до обращения к объекту my_workbook в saveWorkbook. Это поможет утвердиться в том, что вы создаете новый объект.

  3. Изменение функции downloadHandler:
    Редактируйте функцию downloadHandler, чтобы убедиться, что объект my_workbook правильно создается перед его сохранением:

    output$download_excel <- downloadHandler(
     filename = function() {
       "employee_data.xlsx"
     },
     content = function(file) {
       my_workbook <- createWorkbook() # Убедитесь, что создаете Workbook
    
       addWorksheet(my_workbook, "Employee Data") # Корректный вызов функции
    
       # Остальной код остается без изменений
    
       # Пример с saveWorkbook
       saveWorkbook(my_workbook, file) # Сохранение в файл
     }
    )

Основные рекомендации

  • Отладка кода: Используйте функции print() или str() для отладки, чтобы следить за объектами в процессе исполнения.
  • Проверка зависимостей: Если вы используете shinyapps, убедитесь, что все необходимые пакеты установлены и загружены на платформе.
  • Документация и примеры: Обратитесь к официальной документации R и shiny, чтобы убедиться, что ваш код использует самые последние версии функций и библиотек.

Заключение

Соблюдение предложенных рекомендаций и структура вашего кода позволят успешно устранить описанную вами ошибку. Если после этих изменений проблема останется, попробуйте проверить другие части приложения на наличие аналогичных ошибок. Удачи в разработке вашего приложения на Shiny!

Оцените материал
Добавить комментарий

Капча загружается...