форматирование ячеек не применяется после формулы

Я пользуюсь NPOI. Я читаю книгу Excel с двумя листами, которая действует как «шаблон» для книги результатов, которую я буду генерировать. Лист 0 пуст, за исключением некоторых строк заголовка, а лист 1 содержит несколько строк формул. Формулы обычно относятся к листу 0 и извлекают из него данные.

Я не могу писать прямо в книгу шаблонов, потому что мне пришлось бы перемещать строки в сторону, и это было бы ужасно быстро, поэтому в коде я создаю новую книгу результатов с двумя листами. На основе предварительно заданного файла конфигурации я заполняю лист 0 этой книги результатов данными, строка за строкой, клонируя стиль и формулы определенных строк из рабочей книги шаблона. Лист 0 оказывается заполненным данными, а лист 1 - это в основном ряд формул, скопированных и скорректированных относительно, обычно извлекающие данные из листа 0 с небольшим вычислением здесь или там. Все мои данные на листе 0 являются текстом и не могут быть интерпретированы как числа, даты и т. Д. Поэтому я установил типы ячеек данных как String.

Затем в коде я перебираю все ячейки на листе 1 и EvaluateInCell. Я делаю это для очевидной оценки формул, но также для того, чтобы удалить формулы и оставить скопированные / рассчитанные результаты. Это просто требование моей работы. Мы доставляем конечный результат, а не формулы. Сохраняю полученную книгу.

В целом все выглядит хорошо, за исключением случаев, когда у меня есть форматирование ячеек, форматирование, похоже, не применяется. Форматирование ЕСТЬ там, когда я получаю свойства форматирования ячеек в Excel. Например, у меня могут быть текстовые данные, которые являются датой и временем в моих данных, которые отображаются как: 7/7/2016 9:54:55 AM это то же самое, что и исходный текст данных, но на моем листе формул у меня есть пользовательский формат ячейки ггггммдд. И тем не менее, ячейка все еще отображается: 7/7/2016 9:54:55 AM. В Excel я делаю что-то вроде ручного редактирования значения, например, удаляю последнюю букву «M», повторно набираю «M» и нажимаю ввод, эта ячейка изменяется на желаемый формат и показывает: 20160707 Итак, форматирование ЕСТЬ, оно просто не применяется.

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

this.ResultWorkbook.GetCreationHelper (). CreateFormulaEvaluator (). EvaluateAll (); ((XSSFWorkbook) this.ResultWorkbook) .SetForceFormulaRecalculation (true);

Но это не помогло. Есть предположения?


person Buzz    schedule 11.12.2017    source источник
comment
Например, у меня могут быть текстовые данные, представляющие собой дату и время: значения даты и времени - это не текст в Excel, а двойные значения, имеющие целую часть даты и дробную часть времени (1/24 = 1 час, 1/24/60 = 1 мин, 1/24/60/60 = 1 с, ...). И Excel не форматирует текст как дату. Поэтому вам нужно вводить значения даты и времени, используя SetCellValue(DateTime value), а не как строку.   -  person Axel Richter    schedule 12.12.2017
comment
К сожалению, моему коду не разрешено интерпретировать данные. Это просто строка моего кода, результат отдельной обработки и не может быть интерпретирован как дата-время во время выполнения. Иногда данные уже отформатированы, а иногда нет. Когда это не так, ожидается, что форматирование ячеек Excel станет решением. Это как-то сработало, прежде чем я извлек код взаимодействия Excel и переключился на NPOI. Я понимаю, что вы говорите о SetCellValue, но для этого потребуется, чтобы мой код знал, что это за данные и в каком формате они уже есть. А это не так.   -  person Buzz    schedule 12.12.2017
comment
К сожалению, моему коду не разрешено интерпретировать данные. К сожалению, тогда я ничем не могу помочь.   -  person Axel Richter    schedule 12.12.2017


Ответы (2)


Можете ли вы попробовать любой из этих подходов при установке формулы для ячейки

Подход 1

ICellStyle dateCellStyle = workbook.CreateCellStyle();
dateCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("yyyymmdd"); // Or prefix single quote for data when writing it to excel file like 'yyymmdd ex: '20160707

Подход 2

 XSSFCellStyle dateCellStyle = (XSSFCellStyle)workbook.CreateCellStyle();
 XSSFDataFormat dateDataFormat = (XSSFDataFormat)workbook.CreateDataFormat();
 dateCellStyle.SetDataFormat(dateDataFormat.GetFormat("yyyymmdd"));
person kumar chandraketu    schedule 13.12.2017

В итоге я посмотрел на ячейку файла Excel, в которую я пишу. Похоже, что если это не DateUtil.IsCellDateFormatted и cellStyle.DataFormat не 0x31 (текст на основе BuiltInFormats), тогда он должен быть числовым. Исходя из этого, я пытаюсь преобразовать свой текст в DateTime или удвоить, если применимо, и вызвать SetCellValue с этими преобразованными переменными. В противном случае я пишу текст. Кажется, это работает для случаев, с которыми я сталкивался.

person Buzz    schedule 14.12.2017