Оператор «<» нельзя применить к типам «число» и «Обещание <void>» с помощью надстройки Excel. - PullRequest
0 голосов
/ 18 октября 2019

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

Она находится в файле taskpane.js для надстройки Excel. Я попытался .then (), дождусь переменной и позволю, но я не смог заставить ее работать.

import { get } from "http";

/*
 * Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 * See LICENSE in the project root for license information.
 */

import { get } from "http";

/*
 * Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 * See LICENSE in the project root for license information.
 */

Office.onReady(info => {
  // Determine if the user's version of Office supports all the Office.js APIs that are used in the tutorial.
  if (!Office.context.requirements.isSetSupported('ExcelApi', '1.7')) {
    console.log('Sorry. The tutorial add-in uses Excel.js APIs that are not available in your version of Office.');
  }

  // Assign event handlers and other initialization logic.
  document.getElementById("run").onclick = run;
  if (info.host === Office.HostType.Excel) {
    document.getElementById("sideload-msg").style.display = "none";
    document.getElementById("app-body").style.display = "flex";
  }
});

function Create2DArray(rows) {
  var arr = [];

  for (var i = 0; i < rows; i++) {
    arr[i] = [];
  }

  return arr;
}

function sortedData() {
  var rows = getRowCount();
  var arrImport = getData();
  var arrExport = Create2DArray(rows);
  for (var r = 0; r < rows; r++) {
    arrExport[r][0] = arrImport[r][1];//money
    arrExport[r][1] = arrImport[r][5];//Company
    arrExport[r][2] = arrImport[r][0];//date
  }
  return arrExport;
}

async function getRowCount() {
  await Excel.run(async (context) => {
    const sheet = context.workbook.worksheets.getActiveWorksheet();
    var rowCount = 0;

    for (var i = 0; i >= 0; i++) {
      var cell = sheet.getCell(i, 0);
      cell.load("address, values");
      await context.sync();
      if (cell.values[0][0] == "") {
        break;
      }
      else {
        rowCount++;
      }
    }
    await context.sync();
    return rowCount;
  });
}

async function getData() {
  await Excel.run(async (context) => {
    const sheet = context.workbook.worksheets.getActiveWorksheet();
    //let rowCount = await getRowCount();
    var rowCount = getRowCount();
    var arrExport = Create2DArray(rowCount);

    for (var r = 0; r < rowCount; r++) {
      for (var c = 0; c < 5; c++) {
        var cell = sheet.getCell(r, c);
        cell.load("address, values");
        await context.sync();
        arrExport[r][c] = cell.values[0][0];
      }
    }
    await context.sync();
    return arrExport;
  })
}

async function run() {
  await Excel.run(async (context) => {
      var currentWorksheet = context.workbook.worksheets.getActiveWorksheet();
      rows = getRowCount();
  })
  .catch(function (error) {
      console.log("Error: " + error);
      if (error instanceof OfficeExtension.Error) {
          console.log("Debug info: " + JSON.stringify(error.debugInfo));
      }
  });
}

Я хочу получить количество строк из моей таблицы Excel, которые используютсяно я не могу заставить его работать и не могу понять асинхронность. Ошибка в названии.

1 Ответ

1 голос
/ 18 октября 2019

Первая проблема, поскольку getRowCount является асинхронной, она возвращает Promise

Вторая проблема, getRowCount фактически ничего не возвращает

async function getRowCount() {
    let returnValue;
    await Excel.run(async(context) => {
        const sheet = context.workbook.worksheets.getActiveWorksheet();
        var rowCount = 0;

        for (var i = 0; i >= 0; i++) {
            var cell = sheet.getCell(i, 0);
            cell.load("address, values");
            await context.sync();
            if (cell.values[0][0] == "") {
                break;
            } else {
                rowCount++;
            }
        }
        await context.sync();
        returnValue = rowCount;
    });
    return returnValue;
}

Возможно, есть лучший способ сделать это, но я не знаю, как работает этот Excel.run и т. д., но до тех пор, пока Excel.run возвращает Promise - что я предполагаю, потому что вы используете await - тогда вышеприведенное должно работать

и использование в вашем коде будет

async function getData() {
  await Excel.run(async (context) => {
    const sheet = context.workbook.worksheets.getActiveWorksheet();
    let rowCount = await getRowCount();
    var arrExport = Create2DArray(rowCount);

    for (var r = 0; r < rowCount; r++) {
    .
    .
    .

Теперь должно работать

...