|
формула =_xlfn.CEILING.MATH выдает ошибку |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
With the following MWE:
ExcelPackage package = new ExcelPackage(@"C:Usersmpaulustest.xlsx"); ExcelWorksheet sheet = package.Workbook.Worksheets.Add("Sheet"); sheet.Cells[1, 1].Formula = "CEILING.MATH(1.6)"; package.Save();
I get a #NAME() error when opening the output xlsx. There is no EPPlus exception for unknown function.
When I look at the output XML in the sheetData element, everything looks fine:
<sheetData><row r="1"><c r="A1" s="0"><f>CEILING.MATH(1.6)</f></c></row></sheetData>
If I make a spreadsheet within Excel itself and look at that, it looks like:
<sheetData><row r="1" spans="1:1" x14ac:dyDescent="0.35"><c r="A1"><f>_xlfn.CEILING.MATH(1.6)</f><v>3</v></c></row></sheetData>
When I looked through the code base, it looks like the _xlfn is removed on purpose in a few places.
src/EPPlus/FormulaParsing/ExpressionGraph/FunctionExpression.cs
62: // older versions of Excel (pre 2007) adds "_xlfn." in front of some function names for compatibility reasons.
64: if (funcName.StartsWith("_xlfn.", StringComparison.OrdinalIgnoreCase)) funcName = funcName.Replace("_xlfn.", string.Empty);
src/EPPlus/DataValidation/Formulas/ExcelDataValidationFormula.cs
102: formula = formula.Replace("_xlfn.", string.Empty).Replace("_xlws.", string.Empty);
I did confirm if I manually add that _xlfn back in, there is no error, meaning:
sheet.Cells[1, 1].Formula = "_xlfn.CEILING.MATH(1.6)";
did work.
Is this a case where that prefix is required?
I am using EPPlus version 6.1.1.
Excel version is 2210 (Build 15726.20202)
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 for Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Еще…Меньше
Проблема
Объект _xlfn. Префикс отображается перед функцией в формуле. Когда формула вычисляется, отображается #NAME? (значение ошибки).
Причина
Книга Excel содержит функцию, которая не поддерживается в версии Excel, которая выполняется в данный момент. Например, вы могли открыть книгу, содержащую функцию IFERROR, которая не поддерживается в версиях Excel более ранних версий, чем Excel 2007. Функции, которые не поддерживаются в версиях Excel, предшествующих Excel 2007, включают: AVERAGEIF, AVERAGEIFS, MAXIFS, MINIFS, IFS, CUBEKPIMEMBER, CUBEMEMBER, CUBEMEMBERPROPERTY, CUBERANKEDMEMBER, CUBESET, CUBESETCOUNT, CUBEVALUE, COUNTIFS, IFERROR и SUMIFS.
Решение
Удалите неподдерживаемые функции или, если возможно, замените неподдерживаемые функции поддерживаемыми функциями.
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
См. также
Функции Excel (по алфавиту)
Функции Excel (по категориям)
Нужна дополнительная помощь?
Forum rules
and Helpful information
-
ajlittoz
- Posts: 31
- Joined: Wed Aug 25, 2021 5:26 pm
Re: Spreadsheet Import Failure
Sorry to come back again.
Here is my contorted workflow:
- Prepare worksheet in LibreOffice Calc and save it native format .odt
- Save a copy as .xslx
- Import into FreeCAD using File_Import (evantually with the necessary «pre» delete of existing spreadsheet
I meet a few issues at the end of this procedure:
- During the export to Excel format, function names CEILING and FLOOR are converted to CEILING.MATH and FLOOR.MATH. FreeCAD reads them as _xlfn.CEILING.MATH and _xlfn.FLOOR.MATH and does not recognise them as its CEIL and FLOOR functions.
- Since there are not many occurrences, I can remove _xlfn. and .MATH manually. But I discovered function names are case-sensitive! I must also turn them lower case.
Is there a way to circumvent these two problems?
-
GeneFC
- Veteran
- Posts: 4183
- Joined: Sat Mar 19, 2016 3:36 pm
- Location: Punta Gorda, FL
Re: Spreadsheet Import Failure
Post
by GeneFC » Sat Sep 04, 2021 3:19 pm
ajlittoz wrote: ↑Sat Sep 04, 2021 12:40 pm
Is there a way to circumvent these two problems?
A brute-force method is to use grep or grepwin to change all instances of «CEILING.MATH» to «ceiling», for example.
Very fast and easy.
Gene
-
Roy_043
- Veteran
- Posts: 6178
- Joined: Thu Dec 27, 2018 12:28 pm
Re: Spreadsheet Import Failure
Post
by Roy_043 » Sat Sep 04, 2021 3:47 pm
The XLSX import code is written in Python, luckily.
Look for importXLSX.py in the …ModSpreadsheet folder.
Rename the file (just in case).
Place the attached file in the same folder.
Restart FreeCAD.
- Attachments
-
importXLSX.py- (15.11 KiB) Downloaded 11 times
-
Roy_043
- Veteran
- Posts: 6178
- Joined: Thu Dec 27, 2018 12:28 pm
Хитрости »
30 Ноябрь 2022 872 просмотров
Иногда, при работе с «чужими» файлами(т.е. с теми, которые были созданы или отредактированы на другом ПК), в формулах можно встретить формулы, которые начинаются на =_xlfn.(нечто вроде: =_xlfn.MAXIFS, _xlfn.IFERROR и т.п.)

При первом открытии файла такие функции показывают последний успешно вычисленный результат и при вычислении не обновляются, а если попытаться их пересчитать вручную, то в результате можно получить ошибку #ИМЯ!(#NAME!).
Что это и откуда? Для начала попробуем разобраться откуда берется это загадочное _xlfn. и что оно означает. Таким префиксом обозначаются функции, которые были созданы в более новых версиях Excel(чем та, в которой на данный момент открыт файл) и в текущей версии отсутствуют. По сути они читаются как =_xlfn.ИМЯ_ФУНКЦИИ. Например, =_xlfn.MAXIFS – это функция МАКСЕСЛИ(MAXIFS), _xlfn.IFERROR – ЕСЛИОШИБКА(IFERROR), _xlfn.UNIQUE – УНИК(UNIQUE) и т.д. Т.е. после самого префикса _xlfn идет как раз имя недоступной функции на английском. Если Вы увидели такой префикс в своем Excel в какой-либо формуле на листе — значит ваш Excel не поддерживает ту функцию, которая указана после префикса _xlfn.
Ниже перечень некоторых функций с их переводом на русскую локализацию и версии, начиная с которых эти функции будут работать(соответственно для версий ниже функции недоступны):
| Префикс | Функция и доступность |
|---|---|
| _xlfn.IFERROR | ЕСЛИОШИБКА (доступна, начиная с Excel 2007) |
| _xlfn.AGGREGATE | АГРЕГАТ (доступна, начиная с Excel 2010) |
| _xlfn.GAMMA | ГАММА (доступна, начиная с Excel 2013) |
| _xlfn.MAXIFS | МАКСЕСЛИ (доступна, начиная с Excel 2019 и в Excel 365) |
| _xlfn.MINIFS | МИНЕСЛИ (доступна, начиная с Excel 2019 и в Excel 365) |
| _xlfn.CONCAT | СЦЕП (доступна, начиная с Excel 2019 и в Excel 365) |
| _xlfn.SORTBY | СОРТПО (доступна, начиная с Excel 2019 и в Excel 365) |
| _xlfn.XLOOKUP | ПРОСМОТРХ (доступна, начиная с Excel 2021 и в Excel 365) |
| _xlfn.UNIQUE | УНИК (доступна, начиная с Excel 2021 и в Excel 365) |
| _xlfn.LAMBDA | LAMBDA (доступна только в Excel 365) |
| _xlfn.TOCOL | ПОСТОЛБЦ (доступна только в Excel 365) |
| _xlfn.TOROW | ПОСТРОК (доступна только в Excel 365) |
Конечно, в этой таблице перечислены далеко не все функции и их может быть гораздо больше и список будет расти, т.к. Microsoft на данный момент постоянно пополняет коллекцию функций в новых версиях.
Как же появляется это самое _xlfn.ИМЯ_ФУНКЦИИ и откуда Excel вообще понимает, какой именно функции нет и что писать после _xlfn, если в самом текущем Excel такой функции нет? Здесь все достаточно просто — _xlfn.ИМЯ_ФУНКЦИИ создается в тот момент, когда на лист записывается функция, у которой могут быть проблемы с вычислением в более старых версиях. Т.е. создается это в самой исходной книге и еще в той версии Excel, которая эту функцию успешно может вычислить. А записывается в диспетчер имен, как новая именованная формула(вкладка Формулы(Formulas) —Диспетчер имен(Name Manager)). При этом имена эти создаются скрытыми – т.е. просто вызвав диспетчер имен мы эти все _xlfn не увидим. И удалить эти имена тоже нельзя, даже если до них добраться.
Так же можно встретить и чуть иной префикс: _xlfn._xlws.SORT и _xlfn._xlws.FILTER. Это как правило относится к формулам динамических массивов. SORT – СОРТ и FILTER – ФИЛЬТР. Эти функции записываются всегда только в одну ячейку, но результат возвращают сразу в несколько. При этом количество занимаемых ячеек в итоге динамически изменяется в зависимости от того, сколько строк и столбцов передано в качестве исходных данных и сколько после обработки было возвращено функцией.
А еще есть и такие имена: _xlfn.ANCHORARRAY и _xlfn.SINGLE. Они тоже относятся к динамическим массивам, но не являются напрямую именно функциями:
Можно ли исправить?
Как же быть, если одна из таких функций попалась в файле? Можно ли как-то её все же сделать вычисляемой?
Для того, чтобы ответить на эти вопросы разберемся
для чего это придумано
. Сделано такое именование(
_xlfn.ИМЯ_ФУНКЦИИ
) неподдерживаемых функций для того, чтобы можно было безошибочно определить, какая именно функция не доступна и при этом не сломать всю формулу, в которой такая функция используется. Но вычислить её, увы, не получится никак. Ведь раз появилось
_xlfn
— функции просто нет в текущей версии, а значит вычислить именно её невозможно. Но если определить имя функции(которое записано после префикса) — можно обратиться к справке Microsoft, найти эту функцию и попробовать заменить её доступной функцией(или связкой функций), которая будет выполнять ту же задачу. Да, далеко не всегда для этого может хватить знаний, а в некоторых случаях и вовсе придется использовать VBA для восполнения функционала, т.к. какие-то функции будет невозможно воспроизвести встроенными. Но других вариантов все равно нет: либо так, либо устанавливать ту версию Excel, в которой эти функции есть.
В данной статье я, к сожалению, тоже никаких однозначных рекомендаций по замене
_xlfn
не дам, т.к. все зависит от конкретной задачи, которая выполняется функцией. Могу лишь привести пару примеров простой замены. Например, возьмем классическую ситуацию — есть таблица отгрузок товара:

надо определить самую минимальную, но при этом не учитывать нулевые отгрузки, т.к. в выходные отгрузка не производится, но в отчете нулевые отгрузки все же есть. В Excel 2019 и новее можно применить одну функцию:
=МИНЕСЛИ(B2:B10;B2:B10;»>0″)
=MINIFS(B2:B10,B2:B10,»>0″)
в более старых версиях вместо неё появится =
_xlfn.MINIFS(B2:B10;B2:B10;»>0″)
и её придется заменить такой формулой массива:
=МИН(ЕСЛИ(B2:B10>0;B2:B10))
=MIN(IF(B2:B10>0,B2:B10))
Или другая задача, которая в Excel 2019 и новее легко решается функцией
МАКСЕСЛИ(MAXIFS)
. Из таблицы ниже необходимо определить максимальную сумму по операции «приход»:

=МАКСЕСЛИ(A2:A10;B2:B10;»приход»)
=MAXIFS(A2:A10,B2:B10,»приход»)
в более старых версиях придется опять же решать задачу при помощи нескольких функций формулой массива:
=МАКС(ЕСЛИ(B2:B10=»приход»;A2:A10))
=MAX(IF(B2:B10=»приход»,A2:A10))
А такие функции как
СОРТ(SORT)
и
ФИЛЬТР(FILTER)
так просто заменить не получится — там уже необходимо применять достаточно серьезные связки функций, да еще и заранее определять минимально необходимое количество ячеек для вывода результата и обрабатывать ошибки «лишних» строк.
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
| Цитата |
|---|
| noteXcellent написал: … Что именно не так с файлом клиента… |
Проблема возникла из-за использования функции ОКРВНИЗ.МАТ (англ. FLOOR.MATH).
Это относительно новая функция, которая есть только в Excel 2013+ (т.е. начиная с Excel 2013).
Если книгу с такой формулой открыть, например, в Excel 2010, то вместо указанной функции появится _xlfn.FLOOR.MATH.
Это означает, что данная функция новая и не поддерживается в данной версии Excel, при сохранении книги она так и сохранится, но при открытии книги в MS Excel 2013+ формула автоматически восстановится, в других же приложениях а-ля Excel формула не восстанавливается.
Для совместимости со всеми версиями предлагаю такую замену:
1. Русский вариант формулы (запятая – разделитель целой и дробной частей числа)
=ЕСЛИ(D2>G2/0,94;
D2/0,9;
ЦЕЛОЕ(
G2/ВЫБОР(СУММПРОИЗВ(—(G2>{-9E+307;5000;10000;50000;100000;500000}));0,94;0,945;0,95;0,955;0,96;0,965) /ВЫБОР(СУММПРОИЗВ(—(G2>{-9E+307;10;50;100})); 0,01;0,05;0,1;1)
) * ВЫБОР(СУММПРОИЗВ(—(G2>{-9E+307;10;50;100})); 0,01;0,05;0,1;1)
)
2. Английский вариант формулы
=IF(D2>G2/0.94,
D2/0.9,
INT(
G2/CHOOSE(SUMPRODUCT(—(G2>{-9E+307,5000,10000,50000,100000,500000})),0.94,0.945,0.95,0.955,0.96,0.965) /CHOOSE(SUMPRODUCT(—(G2>{-9E+307,10,50,100})), 0.01,0.05,0.1,1)
) * CHOOSE(SUMPRODUCT(—(G2>{-9E+307,10,50,100})), 0.01,0.05,0.1,1)
)
Во вложении старая и новая формулы встроены, чтобы посмотреть их в любой локализации с любым разделителем целой и дробной частей.
Created attachment 125048 [details]
destroy formula
I use windows 10 64 bits LO 5.1.3.2 (x64):
With reference to bug 86575 i have the problem make small.
Reproduce bug:
1) open attachment "afronden.ods"
2) save as *.xlsx
3) the formula in A2, A3, A4, A5 and B2, B3, B4, B5 are destroyed
I have test in LO 3.5 to 4.4.7 and there was it oke.
In LO 5.1.0.1 there was the first where the bug are precent.
I didn't have LO 5.0.0 and 5.1.0 and didnt have test here.
Comment 1
VLB
2016-05-14 19:40:31 UTC
I have test in LO 5.0.6 and there is also the bug precent.
Comment 4
VLB
2016-05-15 07:59:31 UTC
(In reply to m.a.riosv from comment #2)
> Please what do you mean by destroyed?
>
> What I see is FLOOR() changed by FLOOR.MATH() and CEILING() changed by
> CEILING.MATH()
>
> Related information:
> https://wiki.documentfoundation.org/ReleaseNotes/5.
> 0#New_spreadsheet_functions
I have a Dutch version of LO.
There is also change the formula from NL to EN, i didn't know about change in release note.
The change is:
"afronden.beneden()" in "_xlfn.FLOOR.MATH()"
and
"afronden.bboven()" in "_xlfn.CEILING.MATH()"
This shos a error in the result in #name?.
Comment 5
VLB
2016-05-15 08:32:31 UTC
(In reply to vlb from comment #4)
> (In reply to m.a.riosv from comment #2)
> > Please what do you mean by destroyed?
> >
In version LO 4.4.7 is the formula disappeared in cel A2, A3 and B2, B3.
Here is a celname used.
In LO 4.4.2 isn't the formula disappeared.
Comment 7
VLB
2016-05-15 09:36:57 UTC
> The change is:
> "afronden.beneden()" in "_xlfn.FLOOR.MATH()"
> and
> "afronden.bboven()" in "_xlfn.CEILING.MATH()"
> This shos a error in the result in #name?.
This happens when i save the file in *.xlsx and open in excel 2007.
When i open the *.xlsx file in LO 5.1.3.2 the change are:
LO English
FLOOR() -> FLOOR.MATH()
CELING() -> CEILING.MATH()
LO Dutch
afronden.beneden() -> ONDERGRENS.MATH()
afronden.boven() -> BOVENGRENS.WISKUNDIG()
Comment 8
VLB
2016-05-15 10:24:03 UTC
(In reply to vlb from comment #7) > > The change is: > LO Dutch > afronden.beneden() -> ONDERGRENS.MATH() > afronden.boven() -> BOVENGRENS.WISKUNDIG() In Excel 2016 is change in, when open *.xlsx: LO Dutch afronden.beneden() -> afronden.beneden.wisk() with error mention afronden.boven() -> afronden.boven.wisk() with error mention
Comment 9
Markus Mohrhard
2016-05-17 00:52:22 UTC
Can we please try to limit bug reports to one issue and provide one descriptive set of steps how to reproduce the error. For this bug report anything happening before 5.0 is irrelevant as the code around FLOOR import/export changed a lot.
Comment 10
Eike Rathke
2016-05-19 16:42:07 UTC
For the relevant changes see https://wiki.documentfoundation.org/ReleaseNotes/5.0#Formula_engine "New spreadsheet functions". I guess if you use Excel2007 to open .xlsx you're out of luck in this case because Excel2007 doesn't implement FLOOR.MATH() and CEILING.MATH(). If you need compatibility with such old versions then use FLOOR.XCL() and CEILING.XCL() that require 2 parameters, which the others don't, and gets saved as FLOOR() and CEILING() for Excel.
-
01-21-2014, 09:59 PM
#1

Registered User

Changing an CEILING.PRECISION formula to work in Excel 2007
I am having an issue making an excel 2010 formula work with 2007.
=_xlfn.CEILING.PRECISE(IF(H21>30,((H21-30)/40)+2-H28,IF(H21>4.99,2-H28,1)))
I believe it needs to be the CEILING function but I can’t get it to work
Any ideas?
Cheers
-
01-21-2014, 10:37 PM
#2
Re: Changing an CEILING.PRECISION formula to work in Excel 2007
That function must be part of an add-in. It’s not a native Excel function.
What are you trying to do? Maybe we can put something together for you.
-
01-21-2014, 10:49 PM
#3

Registered User

Re: Changing an CEILING.PRECISION formula to work in Excel 2007
Isn’t CEILING.PRECISION a standard excel function in excel 2010 onwards?
-
01-22-2014, 07:37 AM
#4
Re: Changing an CEILING.PRECISION formula to work in Excel 2007
Interesting…The prefix you posted: «_xlfn.» threw me off. So, I assumed it was an add-in. However, when I typed it in a formula, Excel discarded it.
Excel 2013 doesn’t list it in formula auto-complete, but Excel 2010 does.
Excel 2013 can use CEILING.PRECISE, but it has been replaced by CEILING.MATH. (I wonder what Microsoft is up to)Anyway…Does this do the same thing as your posted formula?
-
01-22-2014, 02:58 PM
#5

Registered User

Re: Changing an CEILING.PRECISION formula to work in Excel 2007
Thanks Ron,
Yes that was what I was after.
I missed the final argument off.
It was one of those days.
Функция ОКРВВЕРХ.МАТ округляет число с избытком до ближайшего целого или до ближайшего кратного указанному значению точности.
Описание функции ОКРВВЕРХ.МАТ
Округляет число с избытком до ближайшего целого или до ближайшего кратного указанному значению точности.
Синтаксис
=ОКРВВЕРХ(число; [точность]; [режим])
Аргументы
числоточностьрежим
Обязательный. Должен быть меньше 9,99E+307 и больше -2,229E-308.
Необязательный. Кратное, до которого требуется округлить число.
Необязательный. Определяет, в какую сторону относительно нуля округляются отрицательные числа.
Замечания
- По умолчанию точность равна +1 для положительных чисел и -1 для отрицательных.
- По умолчанию положительные числа с дробной частью округляются до ближайшего целого числа. Например, 6,3 округляется до 7.
- По умолчанию отрицательные числа с дробной частью округляются (в сторону 0) до ближайшего целого числа. Например, -6,7 округляется до -6.
- Указывая аргументы «точность» и «режим», можно изменить направление округления отрицательных чисел. Например, округление -6,3 с точностью 1 и режимом 1 округляет в отрицательную сторону до -7. Существует много сочетаний значений точности и режима, которые по-разному влияют на округление отрицательных чисел.
- Аргумент «режим» не влияет на положительные числа.
- Аргумент «точность» округляет число с избытком до ближайшего целого числа, кратного указанной точности, кроме случаев, когда округляемое число ― целое. Например, с точностью 3 число округляется в сторону увеличения до следующего целого числа, кратного 3.
- Если при делении числа на точность 2 или больше возникает остаток, результат округляется в сторону увеличения.

