Чтобы прочитать файл xlsx, расположенный в общей папке проекта vuejs

Я пытаюсь прочитать шаблон теста, содержащийся в файле xlsx, чтобы впоследствии создать тест, содержащийся в шаблоне.

Хранение xlsx как json в базе данных не вариант.

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

Есть ли способ читать файлы xlsx, содержащиеся непосредственно в общедоступном каталоге?

Вот что я попробовал:

handleFile() {
    const workbook = XLSX.readFile('/xlsx/quiztemplate.xlsx')
    const firstSheetName = workbook.SheetNames[0]
    const worksheet = workbook.Sheets[firstSheetName]
    const excelData = XLSX.utils.sheet_to_json(worksheet)
    console.info(excelData)
  }

и вот ошибка:

Необнаруженная ошибка: невозможно получить доступ к файлу /quiz/quiztemplate.xlsx.

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

вам придется адаптировать свой подход из-за ограничений, которые браузеры накладывают на операции чтения файлов. XLSX.readFile() предназначен для использования в серверных средах (Node.js), где доступна файловая система, а не в клиентском JavaScript.

Davi Amaral 12.04.2024 16:23

в каком каталоге ищет XLSX.readFile(), если используется клиентская сторона? Потому что мой код не вернул ошибку, кроме ошибки «файл не найден», что указывает на то, что он все еще где-то ищет?

guilhem saint-gaudin 13.04.2024 01:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

XLSX.readFile() предназначен для использования в серверных средах (Node.js).

Попробуйте использовать это:

npm install xlsx

Поскольку вы не можете использовать readFile() непосредственно в браузере, вам необходимо получить файл как большой двоичный объект, а затем обработать его.

<template>
  <div>
    <button @click = "handleFile">Load Quiz</button>
  </div>
</template>

<script>
import * as XLSX from 'xlsx';

export default {
  methods: {
    async handleFile() {
      try {
        const response = await fetch('/xlsx/quiztemplate.xlsx');
        const data = await response.arrayBuffer();
        const workbook = XLSX.read(data, { type: 'array' });
        const firstSheetName = workbook.SheetNames[0];
        const worksheet = workbook.Sheets[firstSheetName];
        const excelData = XLSX.utils.sheet_to_json(worksheet);
        console.info(excelData);
      } catch (error) {
        console.error("Error reading the Excel file:", error);
      }
    }
  }
}
</script>

Просто чтобы объяснить:

вы можете использовать API-интерфейс выборки для получения файла из общедоступного каталога. поэтому путь к файлу указывается относительно корня вашего общедоступного каталога в структуре вашего проекта Vue.js.

поэтому вы конвертируете полученные данные в ArrayBuffer. но почему? Потому что файл Excel является двоичным файлом, и именно так вы можете обрабатывать двоичные данные в JavaScript на стороне клиента.

Используйте XLSX.read() из библиотеки xlsx для анализа двоичных данных. Параметру типа присвоено значение «массив», чтобы указать, что входные данные представляют собой буфер массива.

а после извлеките необходимый лист и преобразуйте его в формат JSON, как вы уже задумали.

спасибо за быстрый ответ, завтра утром попробую и буду держать вас в курсе

guilhem saint-gaudin 13.04.2024 01:03

Другие вопросы по теме