Извлечение значений диапазона в электронной таблице Кендо изменяет даты на целые числа

Я использую электронную таблицу Kendo для импорта данных из файла Excel, чтобы я мог подключить ее к базе данных SQL Server, используя обратные вызовы Ajax. Обратные вызовы Ajax работают нормально, но я определил, что любые строки даты преобразуются в целочисленное смещение от базовой даты 30.12.1899. Я отправил запрос в службу поддержки Telerik, но они, похоже, не понимают проблемы.

Данные отображаются в электронной таблице кендо соответствующим образом в виде даты. Кендо преобразует ввод даты как «1/12/2015» в «12-1-2015».

Я использую последнюю версию оболочки ASP.NET MVC 5, но код JavaScript — это версия JavaScript 2016-1-226-545. Версия оболочки, кажется, не имеет значения, но в более поздних версиях JavaScript есть gulpfile.js, и это конфликтует с интерфейсом Bundleconfig в моем проекте ASP.NET MVC 5, поэтому я просто работаю с последней версией JavaScript, которая работает для моя установка.

Электронная таблица, с которой я работаю, довольно проста для начала:

@(
Html.Kendo().Spreadsheet()
.Name("SiteSlotDataSS")
  .Rows(10)
  .Columns(4).ColumnWidth(100)
  .Sheets(sheets =>
  {
   sheets.Add()
     .Name("Study Data");
  }
  )
)

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

Рассматриваемый код, который выбирает значения:

values = sheet.range("A" + headerRows.toString() + ":" + endRange + (headerRows + rows).toString()).values();

Это дает правильный перевод всех остальных столбцов, кроме столбцов, содержащих даты.

Я пробовал следующее, чтобы решить проблему, но безуспешно:

for (var x = 0; x <= rows; x++) {
    sheet.range("K" + (headerRows + x).toString()).format(kendo.spreadsheet.formatting.date);
}

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

Каково решение?

Похоже, что Kendo Spreadsheet хранит значения дат в виде целочисленного смещения от 30.12.1899 в днях. Я определил значение «0», введя дату 01.01.1901, чтобы увидеть, что вернулось, затем 01.01.1900. Результатом последнего было «2», что делает базовую дату 30.12.1899. Получение данных и преобразование их на сервере кажется лучшим вариантом. Я действительно не ожидаю особого ответа от Телерика.


person Timothy Dooling    schedule 13.07.2016    source источник


Ответы (2)


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

На данный момент решение состоит в том, чтобы возвращать массив значений по одной строке обратно на сервер и выполнять преобразование данных на стороне сервера. Целое число, которое возвращается в массиве значений для дат, — это то, как электронная таблица кендо хранит информацию на стороне клиента. Форматирование столбца ничего не изменит, кроме отображения на стороне клиента. Это не изменит того, как Кендо возвращает матрицу значений из выбранного диапазона электронной таблицы.

person Timothy Dooling    schedule 15.07.2016

Во-первых, я думаю, вы имеете в виду 31.12.1899. Нет смысла что-либо относить к 30.12.1899.

Даты в Excel начинаются с 01.01.1900, как и даты в кендо (по-японски: «путь меча»). Если вы получаете целое число, принудительно приведите его к соответствующей дате при получении, просто ФОРМАТИРОВАНИЕ СТОЛБЦА. Нет необходимости в специальной функции для «преобразования» количества дней с 1900 года в текстовые даты (ММ/ДД/ГГГГ), поскольку они ОДИНАКОВЫ, отличаясь только удобочитаемым представлением.

Конечно, из вашего описания не было ясно, была ли Excel на стороне ввода или на стороне вывода проблемы.

person Bruce David Wilner    schedule 13.07.2016
comment
Я проверил это. Я преобразовал целое число обратно в дату, используя open_date=basedate.AddDays(offset), где смещение — это Double.Parse целого числа. Это работает нормально. Базовая дата 30.12.1899. Проверьте свою математику еще раз. 1/1/1900 имеет целочисленное значение 2. Я использовал начальную дату как DateTime basedate = new DateTime(1899, 12, 30); - person Timothy Dooling; 13.07.2016
comment
Вопрос очень ясен: я создаю простую пустую таблицу кендо и импортирую файл Excel. Затем я вызываю процедуру javascript с обратным вызовом ajax, чтобы отправить содержимое электронной таблицы на сервер для хранения в базе данных. Некоторые детали упущены, но они могут отличаться в зависимости от импортируемой базы данных Excel. Данные отправляются на сервер в виде простого массива строк. Что касается вещей, имеющих смысл с Кендо, вам нужно больше работать с вещами Telerik, чтобы понять, что очень немногое имеет смысл, начиная с их документации. - person Timothy Dooling; 13.07.2016
comment
@TimothyDooling, не могли бы вы ответить на следующий вопрос «электронная таблица кендо преобразует время в десятичное число при анализе значений строки»> stackoverflow.com/questions/66219449/ - person Shanto Siddiq; 16.02.2021