Как остановить Excel от автоматического форматирования при установке значений с помощью office.js

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

Я использую следующий код:

async function setValue() {
    try {
        await Excel.run(async (context) => {
            const sheet = context.workbook.worksheets.getItem("Sample");

            const range = sheet.getRange("C3");
            range.values = [[ 'June 2018' ]];
            range.format.autofitColumns();

            await context.sync();
        });
    }
    catch (error) {
        OfficeHelpers.UI.notify(error);
        OfficeHelpers.Utilities.log(error);
    }
}

И это приводит к дате Jun-18 в клетке. Я нашел этот ответ, который может быть обходным путем, но с префиксом всех моих данных ' собирается сбить с толку моих пользователей. Проблема также происходит с такими значениями, как 01,

2 ответа

Решение

Отличный вопрос! Во-первых, позвольте мне сделать общее утверждение: программируемость Excel по своей сути относится к автоматизации - что делает то же самое, что и пользователь, но программно. Таким образом, вы часто можете узнать из интерфейса, что вы должны делать в программировании.

Теперь в обычном Excel, если вы наберете June 2018 в пустую ячейку на новом листе, вы получите тот же опыт, который вы только что описали. Это потому, что ячейка отформатирована как "Общая", что означает, что она будет пытаться привязаться к определенному типу. Если вы хотите, чтобы он оставался в виде текста (а не отформатированной даты, как это предлагал Рики в последней строке своего ответа), вам нужно сначала установить форматирование чисел на текст, что в Excel является @ символ, а затем введите значение.

await Excel.run(async (context) => {
    const range = context.workbook.getSelectedRange();
    range.numberFormat = [["@"]];
    range.values = [["June 2018"]];

    await context.sync();
});

Опять же, позвольте мне подчеркнуть, что, как и в пользовательском интерфейсе, вам нужно установить форматирование, прежде чем устанавливать значение. Если сделать это наоборот, вы попадете в ячейку с текстом "43252" (что, по совпадению, число дней с 0 января [да, 0] 1900 года - случайные пустяки за день).

Конечно, говоря Excel "это просто текст", вы теряете возможность делать с ним другие свидания, поэтому ответ Рики повторяется. Форматирование чисел ("мммм гггг") может быть лучше. Но с точки зрения вашего заданного вопроса о том, что Excel ничего не имеет для автоматического форматирования, просто сначала установите форматирование чисел, а затем установите значения.

Если вам действительно нужно, чтобы это была строка, вы должны поместить данные в строку, которая не будет приводить к приведению в Excel строк типа даты к объектам Date. Один из способов сделать это - поменять пробел на неразрывный пробел. Заменить эту строку:

range.values = [[ 'June 2018' ]];

со следующими строками:

let date = 'June 2018';
let dateAsString = date.replace(' ', '\xa0');
range.values = [[dateAsString]];

Кстати, если вы просто хотите, чтобы она выглядела как строка ввода, но хотите разрешить ей быть типом Date, то вы можете просто добавить следующую строку ниже строки, которая создает объект диапазона:

range.numberFormat = [["mmmm yyyy"]];
Другие вопросы по тегам