#javascript #excel #office-js #excel-addins
#javascript #excel #office-js #excel-надстройки
Вопрос:
Итак, я сейчас работаю с надстройкой Excel, и у меня есть функция принудительного сохранения документа и загрузки его в хранилище. Это работает, когда вы нажимаете-это в первый раз, но затем открывается новое окно Excel со случайным числом, например «F7E57000», и вместо принудительного сохранения предлагается сохранить где-нибудь на диске. Если я нажму сохранить, то исходное окно с открытой надстройкой исчезнет, а если я нажму отменить, то Excel выйдет из строя.
это код из функции надстройки
$(".uploadBack").click(function (e) {
Excel.run(function (context) {
context.workbook.save(Excel.SaveBehavior.save);
return context.sync().then(() => {
return Office.context.document.getFilePropertiesAsync(function (asyncResult) {
return new OfficeExtension.Promise(function (resolve, reject) {
var fileUrl = asyncResult.value.url;
$.ajax({
url: "/uploadPlantaBack",
data: {
filePath: fileUrl,
id: e.currentTarget.dataset.escenarioid,
descripcion: $("#Descripcion").val(),
comentario: $("#Comentario").val()
},
type: "POST",
success: function (response) {
Swal.fire({
position: 'center',
type: 'success',
title: 'La configuracion se subio con exito',
showConfirmButton: false,
timer: 1500
})
resolve();
},
error: function (error) {
Swal.fire({
position: 'center',
type: 'error',
title: error,
showConfirmButton: true
})
reject();
}
});
})
});
});
});
});
Обновление: прежде чем возникнет эта проблема, я загружаю документ в функцию с помощью функции addfrombase64, которая находится в бета-версии office.js . Вот код, в котором он получает URL-адрес с файлом Excel в хранилище, а затем анализирует весь файл до базы 64
$(".excelReplica").click(function (e) {
$.ajax({
url: '/toBase64',
data: { url: e.currentTarget.dataset.url },
success: function (base64String) {
Excel.run(function (context) {
return new OfficeExtension.Promise(function (resolve, reject) {
var sheets = context.workbook.worksheets;
sheets.load("items/name");
context.sync().then(() => {
var countSheets = sheets.items.length;
sheets.addFromBase64(
base64String,
null, // get all the worksheets
Excel.WorksheetPositionType.after, // insert them after the worksheet specified by the next parameter
sheets.getActiveWorksheet() // insert them after the active worksheet
);
sheets.load("items/name");
context.sync().then(() => {
var firstSheet = sheets.items[countSheets];
firstSheet.activate();
firstSheet.load(firstSheet.name);
for (var i = countSheets - 1; i >= 0; i--) {
sheets.items[i].delete();
}
context.sync().then(() => {
window.location = '/Escenarios/Details/' e.currentTarget.dataset.id;
});
});
});
resolve();
});
});
},
error: function (a) {
}
});
});
Комментарии:
1. мне кажется, что это ошибка, она не должна приводить к сбою Excel в любое время, но, похоже, ваш пример кода не может быть запущен, как ожидалось, на моей стороне. чтобы помочь нам воспроизвести и найти проблему, не могли бы вы помочь нам, экспортировав суть script lab? learn.microsoft.com/en-us/office/dev/add-ins/overview /…
2. Итак, я изложил суть, это прямо здесь gist.github.com/UnForastero/9c3f78d9f02ad22f42f47316f0314bd4 и дело в том, что он отлично работает при создании нового документа. Возможно, это не работает, потому что Excel на первом месте находится в режиме только для чтения при отладке в Visual Studio.
3. Спасибо @Nino, я только что попробовал вашу суть, здесь все работает нормально. исходя из ваших комментариев выше, означает ли это, что вы нашли основную причину этой проблемы?
4. К сожалению, нет. Я пробовал использовать файл Excel, не доступный только для чтения, и у меня все еще есть документ с номером, например 0BF90300. Как я уже сказал, это работает один раз, а затем происходит сбой, мне нужно снова открыть файл Excel для сохранения. Я думаю, что это что-то вроде переполнения памяти. Не знаю, есть ли что-то, чтобы очистить его, если то, что я говорю, верно.
5. Я обновил вопрос, в котором я использую функцию из бета-версии из office.js возможно, проблема в этом.