Я использую библиотеку PHPExcel для чтения файлов Microsoft Office Excel xlsx. У моего xlsx есть только одна строка:
Как я уже пробовал, xlsx — это просто zip-файл, содержащий xml-файлы. Я распаковал свой файл xlsx
:~> unzip w2.xlsx -d w2
Archive: w2.xlsx
inflating: w2/_rels/.rels
inflating: w2/docProps/app.xml
inflating: w2/docProps/core.xml
inflating: w2/xl/_rels/workbook.xml.rels
inflating: w2/xl/worksheets/sheet1.xml
inflating: w2/xl/styles.xml
inflating: w2/xl/workbook.xml
inflating: w2/[Content_Types].xml
и открыл w2 / xl / worksheets / sheet1.xml, который содержит следующий xml (важная часть показана ниже):
<sheetData>
<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r="1">
<c r="A1" s="1" t="n">
<f aca="true">RAND()*10000/100</f>
<v>94.5569227915257</v>
</c>
<c r="C1" s="1"/>
</row>
</sheetData>
Похоже, что Excel хранит уже рассчитанное значение. Есть ли в библиотеке PHPExcel какой-либо метод для чтения этого внутренне рассчитанного значения. Я знаю, что есть такие методы, как getValue (возвращает формулу = RAND * 10000/1000), getCalculatedValue (вычисляет значение), getFormattedValue (также вычисляет значение)
У PHPExcel действительно есть метод для извлечения этого значения для любой ячейки:
$objPHPExcel->getActiveSheet()->getCell('A1')->getOldCalculatedValue();
Обратите внимание, что это не гарантируется …. если автоматический расчет отключен в MS Excel, то он будет действителен только в последний раз, когда MS Excel фактически выполнял вычисление
Это о клеточном формате. Если это общее «число», то Excel будет показывать 8 десятичных знаков. Вы можете настроить пользовательский формат для каждой ячейки в phpexcel следующим образом.
$sheet->getStyle('A1')
->getNumberFormat()
->setFormatCode('0.0000000000');
Я не совсем уверен, что формат (записывающий О) правильный, пока не могу попробовать.
Попробуйте получить значение после установки пользовательского формата с помощью getCalculatedValue.
Кредиты: user2131419 / так
Редактировать:
Хах *. Пока мистер Бейкер превращается в это, вы можете игнорировать мой пост. Его ответ, очевидно, самый правильный, как всегда. 🙂