Значение строки чтения от Excel с HSSF, но это является двойным

Вы давали Mox взгляд? Это должно сделать все, в чем Вы нуждаетесь. Вот простая интерактивная сессия, иллюстрирующая решение, в котором Вы нуждаетесь:

>>> import urllib
>>> # check that it works
>>> urllib.urlopen('http://www.google.com/')

>>> # check what happens when it doesn't
>>> urllib.urlopen('http://hopefully.doesnotexist.com/')
#-- snip --
IOError: [Errno socket error] (-2, 'Name or service not known')

>>> # OK, let's mock it up
>>> import mox
>>> m = mox.Mox()
>>> m.StubOutWithMock(urllib, 'urlopen')
>>> # We can be verbose if we want to :)
>>> urllib.urlopen(mox.IgnoreArg()).AndRaise(
...   IOError('socket error', (-2, 'Name or service not known')))

>>> # Let's check if it works
>>> m.ReplayAll()
>>> urllib.urlopen('http://www.google.com/')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python2.5/site-packages/mox.py", line 568, in __call__
    raise expected_method._exception
IOError: [Errno socket error] (-2, 'Name or service not known')

>>> # yay! now unset everything
>>> m.UnsetStubs()
>>> m.VerifyAll()
>>> # and check that it still works
>>> urllib.urlopen('http://www.google.com/')

15
задан justcurious 7 April 2016 в 10:05
поделиться

6 ответов

Вы имеете в виду, что HSSF-POI говорит

cell.getCellType () == Cell.CELL_TYPE_NUMERIC

НЕ

Cell.CELL_TYPE_STRING как должно быть?

Я бы подумал, что это ошибка в POI, но каждая ячейка содержит вариант, а вариант имеет тип. Здесь довольно сложно сделать ошибку, поэтому я думаю, что Excel использует некоторые дополнительные данные или эвристику, чтобы сообщить поле как текст. Увы, обычный способ MS.

PS Вы не можете использовать какой-либо getString () для Variant, содержащего числовые значения, поскольку двоичное представление данных Variant зависит от его типа и пытается получить строку из того, из чего на самом деле число приведет к мусору - отсюда и исключение.

6
ответ дан 1 December 2019 в 01:30
поделиться

Excel преобразует все, что выглядит как число, дата или время, из строки. См. статью базы знаний MS , в которой предлагается вводить число с дополнительным символом, который превращает его в строку.

2
ответ дан 1 December 2019 в 01:30
поделиться

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

Когда вы позже меняете формат ячейки на Текст, вы просто меняете значение по умолчанию. Excel не меняет тип каждой ячейки автоматически. Я не нашел способа сделать это автоматически.

Чтобы убедиться в этом, вы можете перейти в Excel и повторно ввести одно из чисел и посмотреть, есть ли это текст в HSSF.

Вы также можете посмотреть реальный тип ячейки при использовании этой функции

  @Cell("type", A1)

A1 является ячейкой для числа. Он показывает "l" для текста, "v" для чисел.

1
ответ дан 1 December 2019 в 01:30
поделиться

Если документы, которые вы анализируете, всегда имеют определенный макет, вы можете «на лету» изменить тип ячейки на «строку» и затем получить значение. Например, если столбец 2 всегда должен быть строковыми данными, установите для него тип ячейки строковый, а затем прочтите его с помощью методов get строкового типа.

cell.setCellType(Cell.CELL_TYPE_STRING);

В моем тестировании изменение типа ячейки не приводило к изменению содержимого ячейки, но позволил получить его любым из следующих подходов:

cell.getStringCellValue();

cell.getRichStringCellValue().getString();

Без примера значения, которое не преобразуется должным образом, трудно понять, будет ли оно вести себя иначе, чем описанный вами подход cell.toString () в описании.

10
ответ дан 1 December 2019 в 01:30
поделиться

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

С новым BigDecimal (cell.getNumericCellValue ()). ToString () у вас все еще будет много проблем. Например, если у вас есть идентификационные номера (например, номера деталей или классификационные номера), у вас, вероятно, есть случаи, в которых есть ведущие нули, что будет проблемой при использовании подхода getNumericCellValue ().

Я пытаюсь подробно объяснить, как правильно создать Excel для сторона, создающая файлы, которые я должен обрабатывать с помощью POI. Если файлы загружаются конечными пользователями, я даже создал программу проверки для проверки ожидаемых типов ячеек, если я заранее знаю столбцы. В качестве побочного продукта вы также можете проверить различные другие вещи из предоставленных файлов (например,

1
ответ дан 1 December 2019 в 01:30
поделиться

"Проблема в том, что у меня есть значения в ячейке, которые выглядят как число" => выглядят как числа при просмотре в Excel?

"но на самом деле это строки" => что это значит ? Как вы ЗНАЕТЕ, что это действительно строки?

«Если я посмотрю на ячейку формата» => что такое «ячейка формата» ???

'... в Excel, он говорит, что тип - «текст» "'=> Пожалуйста, объясните.

" Ячейка HSSF по-прежнему считает, что это число ". => вы имеете в виду, что the_cell.getCellType () возвращает Cell.CELL_TYPE_NUMERIC?

«Как я могу получить значение в виде строки?» => , если это ЧИСЛО, получите числовое значение с помощью the_cell. getNumericCellValue (), а затем отформатируйте ее как строку любым способом.

«Если я попытаюсь использовать cell.getRichStringValue, я получу исключение;» => так что это не строка.

«если cell.toString, это не то же самое значение, что и в листе Excel». => поэтому cell.toString () не форматирует его так, как форматирует Excel.

Независимо от того, какой эвристический метод Excel использует для определения типа, вам не важно. Имеет значение РЕЗУЛЬТАТ этого решения, который хранится в файле и раскрывается функцией getCellType ().

t отформатируйте его так, как это форматирует Excel.

Какой бы эвристический метод Excel ни использовал для определения типа, это не имеет отношения к вам. Важен РЕЗУЛЬТАТ этого решения, который хранится в файле и раскрывается функцией getCellType ().

t отформатируйте его так, как это форматирует Excel.

Какие бы эвристические методы Excel ни использовали для определения типа, это не имеет отношения к вам. Важен РЕЗУЛЬТАТ этого решения, который хранится в файле и раскрывается функцией getCellType ().

0
ответ дан 1 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: