JavaScript: чтение 1 миллиона строк Excel [xlsx] в индексированной таблице поиска - PullRequest
0 голосов
/ 25 января 2019

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

В любом случае, сценарий таков, что у нас есть данные о завершении обучения персонала, размещенные на веб-сервере в виде файла XLSX. Файл содержит 1 077 200 строк и представляет собой дамп обучающих курсов, которые проходят все сотрудники компании по всему миру. Файл XLSX содержит строку заголовка и столбцы: EMPLOYEE (числовой [10]), COURSE_ID (буквенно-цифровой [20]), TITLE (буквенно-цифровой [100]), DATE (дата [дд-ммм-гг]). Мы не контролируем этот файл, не можем изменить его или формат и можем только читать его. Не существует уникальных полей, и у каждого сотрудника может быть 0..n рядов связанных данных обучения. Нам нужно прочитать этот XLSX в справочную таблицу. Таким образом, мы считаем, что нам нужно прочитать этот файл XLSX в двумерную таблицу поиска, идентификатор EMPLOYEE по идентификатору COURSE, то есть отношение 1..n.

Далее у нас есть список учебных курсов, также размещенных на веб-сервере, в виде файла XLSX; это просто два столбца, столбец 1 - это идентификатор курса [такой же, как в окончании обучения], а столбец 2 - это заголовок курса, который является локально переименованным заголовком [отличается от того, что указан в окончании обучения]. Таким образом, мы не используем название курса, как оно указано в файле «Завершение обучения». Опять же, мы считаем, что нам нужно прочитать этот файл XLSX в двумерную таблицу поиска, COURSE_ID от COURSE_TITLE, но это отношение 1..1.

Итак, у нас есть 2 таблицы поиска:

Table 1: Employee ID is unique key
EMPLOYEE_ID   {COURSE_ID, COMPLETION_DATE}, {COURSE_ID, COMPLETION_DATE} , ...
EMPLOYEE_ID   {COURSE_ID, COMPLETION_DATE}, {COURSE_ID, COMPLETION_DATE} , ...
EMPLOYEE_ID   {COURSE_ID, COMPLETION_DATE}, {COURSE_ID, COMPLETION_DATE} , ...

Table 2: Course ID is unique key
COURSE_ID   {COURSE TITLE}, {COURSE TITLE}, , ...
COURSE_ID   {COURSE TITLE}, {COURSE TITLE}, , ...
COURSE_ID   {COURSE TITLE}, {COURSE TITLE}, , ...

В SharePoint мы хотим разместить обучающую матрицу в веб-части контента html [html / css / javascript]. Матрица отобразит для зарегистрированного пользователя и всех прямых отчетов пройденные учебные курсы. Пользователи идентифицируются по номеру их РАБОТНИКА, который совпадает с номером, указанным в размещенном файле xlsx Завершение обучения персонала. Мы хотим отобразить эту матрицу в виде таблицы с именем сотрудника [которое мы получаем из SharePoint] внизу слева и поперек каждого возможного имени учебного курса [таблица поиска 2], а каждое пересечение (ячейка) содержит дату завершения [из поиска таблица 1] или пусто, если не заполнено: -

        {Fire Handling}   {Manual Handling}   {Code of Conduct}   ...
Anne      10/11/2018          10/01/2018       
Fred      04/01/2018          10/01/2019         10/11/2018
Jo        11/12/2018                             10/11/2018
...

В нем около 10 000 сотрудников, но самое большее, только около 20 будет отображаться в матрице, если у пользователя было 20 прямых отчетов, и, как минимум, 1 - пользователь вошел в SharePoint, если у него не было никаких прямых отчетов. И не забывайте, что список пройденных тренировок может составлять более 1 миллиона строк !!

Вот как мы читаем файлы XLSX [хотя на самом деле мы не знаем, какой путь идти после fileReader.readAsArrayBuffer(file);

function handleFile(e) {
  var files = e.target.files,file;
  if (!files || files.length == 0) return;
  file = files[0];
  var fileReader = new FileReader();
  fileReader.onload = function (e) {
    var filename = file.name;
    // pre-process data
    var binary = "";
    var bytes = new Uint8Array(e.target.result);
    var length = bytes.byteLength;
    for (var i = 0; i < length; i++) {
      binary += String.fromCharCode(bytes[i]);
    }
    // call 'xlsx' to read the file
    var oFile = XLSX.read(binary, {type: 'binary', cellDates:true, cellStyles:true});
  };
  fileReader.readAsArrayBuffer(file);
};

Мы знаем, как заставить работать данные SharePoint. У нас все хорошо с HTML и CSS для вывода матрицы. Мы знаем, как читать файлы XLSX, используя одну из библиотек js, таких как xls / xlsx или js-xls Чего мы не знаем, так это как смоделировать две таблицы поиска или, действительно, есть ли лучший способ. Мы не программисты на JavaScript, но учимся быстро. К сожалению, из-за многих проблем мы не можем использовать другие языки, кроме js, css и html. Поэтому решение должно опираться на эти три.

С чего мы начнем?

Спасибо. Надеюсь, этот тизер разогреет серое вещество :) 1023

Спасибо за участие.

...