Вопрос по java, apache-poi, excel – Как я могу прочитать числовые строки в ячейках Excel как строки (не числа)?

130

I have excel file with such contents:

A1: SomeString

A2: 2

All fields are set to String format.

When I read the file in java using POI, it tells that A2 is in numeric cell format.

The problem is that the value in A2 can be 2 or 2.0 (and I want to be able to distinguish them) so I can't just use .toString().

Что я могу сделать, чтобы прочитать значение в виде строки?

Ваш Ответ

20   ответов
-1

приведите к Int, а затем сделать.toString(), Это некрасиво, но это работает.

Error: User Rate Limit Exceeded joycollector
292

У меня была такая же проблема. я сделалcell.setCellType(Cell.CELL_TYPE_STRING); перед чтением строкового значения, что решило проблему независимо от того, как пользователь отформатировал ячейку.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededApache POI javadocs explicitly say not to do this!Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededpoi.apache.org/apidocs/org/apache/poi/ss/usermodel/…Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0
public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
    String retVal=null;
    try {
        FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
        Workbook wb=WorkbookFactory.create(fis);
        Sheet s=wb.getSheet(sheetname);
        Row r=s.getRow(rownum);
        Cell c=r.getCell(cellnum);
        if(c.getCellType() == Cell.CELL_TYPE_STRING)
        retVal=c.getStringCellValue();
        else {
            retVal = String.valueOf(c.getNumericCellValue());
        }

Я попробовал это, и у меня это сработало

0

Многие из этих ответов ссылаются на старую документацию и классы POI. В новейшей POI 3.16,Ячейка с типами int устарел

Cell.CELL_TYPE_STRING

enter image description here

ВместоПеречисление CellType может быть использован.

CellType.STRING 

Просто убедитесь, что ваш pom обновлен с зависимостью poi, а также с зависимостью poi-ooxml до новой версии 3.16, иначе вы будете продолжать получать исключения. Одним из преимуществ этой версии является то, что вы можете указать тип ячейки во время ее создания, исключив все дополнительные шаги, описанные в предыдущих ответах:

titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
5

Да, это работает отлично

рекомендуемые:

        DataFormatter dataFormatter = new DataFormatter();
        String value = dataFormatter.formatCellValue(cell);

старый:

cell.setCellType(Cell.CELL_TYPE_STRING);

даже если у вас есть проблема с получением значения изcell имея формулу, все еще это работает.

Error: User Rate Limit ExceededApache POI javadocs are very clear that you shouldn't be doing it like that: If what you want to do is get a String value for your numeric cell, stop!. This is not the way to do it. Instead, for fetching the string value of a numeric or boolean or date cell, use DataFormatter instead.
Error: User Rate Limit Exceeded
0

getStringCellValue возвращает NumberFormatException, если тип ячейки числовой. Если вы не хотите менять тип ячейки на строку, вы можете сделать это.

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}
15

Как уже упоминалось в Poi JavaDocs (https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29) не используйте:

cell.setCellType(Cell.CELL_TYPE_STRING);

но используйте:

DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);

Больше примеров наhttp://massapi.com/class/da/DataFormatter.html

-1

Это сработало идеально для меня.

Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
    legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}
44

Приведенный ниже код работал для меня для любого типа клеток.

InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);

Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();

while(objIterator.hasNext()){

    Row row = objIterator.next();
    Cell cellValue = row.getCell(0);
    objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
    String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);

}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededFormulaEvaluatorError: User Rate Limit Exceeded
Error: User Rate Limit ExceededgetCreationHelper().createFormulaEvaluator()Error: User Rate Limit Exceeded
-1

Похоже, что это невозможно сделать в текущей версии POI, основываясь на том факте, что эта ошибка:

https://issues.apache.org/bugzilla/show_bug.cgi?id=46136

все еще выдающийся

0

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

for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...

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

Сноска:     numericColumn Int, который генерируется из чтения обработанного заголовка файла.

86

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

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

Для вашего случая я предполагаю, что к числовым ячейкам применено правило целочисленного форматирования. Если вы попросите DataFormatter отформатировать эти ячейки, он вернет вам строку с целочисленной строкой.

Кроме того, обратите внимание, что многие люди предлагают делатьcell.setCellType(Cell.CELL_TYPE_STRING), ноApache POI JavaDocs совершенно ясно заявляет, что вы не должны этого делать! ДелатьsetCellType вызов потеряет форматирование, так какJavadocs объяснить единственный способ преобразовать в строку с оставшимся форматированием - это использоватьКласс DataFormatter.

Error: User Rate Limit ExceededWhen passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
-1

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

Error: User Rate Limit Exceeded joycollector
24

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

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}

NumberToTextConverter может правильно преобразовывать двойное значение в текст с использованием правил Excel без потери точности.

0

У меня также была похожая проблема с набором данных из тысяч номеров, и я думаю, что нашел простой способ решения. Мне нужно было вставить апостроф перед числом, чтобы отдельный импорт БД всегда рассматривал числа как текст. До этого число 8 будет импортировано как 8.0.

Решение:

  • Keep all the formatting as General.
  • Here I am assuming numbers are stored in Column A starting at Row 1.
  • Put in the ' in Column B and copy down as many rows as needed. Nothing appears in the worksheet but clicking on the cell you can see the apostophe in the Formula bar.
  • In Column C: =B1&A1.
  • Select all the Cells in Column C and do a Paste Special into Column D using the Values option.

Привет Престо все числа, но хранятся в виде текста.

-1

cell.setCellType (Cell.CELL_TYPE_STRING); у меня работает нормально

Error: User Rate Limit Exceededexplicitly listed in the JavaDocs as not the right way to do it!
-1

У нас возникла та же проблема, и мы заставили наших пользователей форматировать ячейки как «текст».before ввод значения Таким образом, Excel правильно сохраняет четные числа в виде текста. Если впоследствии формат изменяется, Excel только изменяет способ отображения значения, но не меняет способ сохранения значения, пока значение не будет введено снова (например, путем нажатия клавиши возврата в ячейке).

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

Error: User Rate Limit Exceeded
1

Пока ячейка находится в текстовом формате, прежде чем пользователь введет число, POI позволит вам получить значение в виде строки. Одним из ключей является то, что если в верхнем левом углу ячейки, отформатированной как текст, есть маленький зеленый треугольник, вы сможете извлечь его значение в виде строки (зеленый треугольник появляется всякий раз, когда что-то выглядит как число приведен в текстовый формат). Если у вас есть ячейки в формате Text, которые содержат числа, но POI не позволит вам извлекать эти значения в виде строк, есть несколько вещей, которые вы можете сделать с данными электронной таблицы, чтобы:

  • Double click on the cell so that the editing cursor is present inside the cell, then click on Enter (which can be done only one cell at a time).
  • Use the Excel 2007 text conversion function (which can be done on multiple cells at once).
  • Cut out the offending values to another location, reformat the spreadsheet cells as text, then repaste the previously cut out values as Unformatted Values back into the proper area.

И последнее, что вы можете сделать: если вы используете POI для получения данных из электронной таблицы Excel 2007, вы можете использовать класс Cell & apos; getRawValue () & apos; метод. Это не волнует, что формат. Он просто вернет строку с необработанными данными.

4

Пытаться:

new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )

Должен правильно отформатировать номер.

Error: User Rate Limit Exceeded2Error: User Rate Limit Exceeded2.0Error: User Rate Limit Exceeded
0

Когда мы читаем числовое значение ячейки MS Excel, используя библиотеку Apache POI, оно читается как числовое. Но иногда мы хотим, чтобы он читался как строка (например, номера телефонов и т. Д.). Вот как я это сделал:

  1. Insert a new column with first cell =CONCATENATE("!",D2). I assume D2 is cell id of your phone-number column. Drag new cell up to end.

  2. Now if you read the cell using POI, it will read the formula instead of calculated value. Now do following:

  3. Add another column

  4. Select complete column created in step 1. and choose Edit->COPY

  5. Go to top cell of column created in step 3. and Select Edit->Paste Special

  6. In the opened window, Select "Values" radio button

  7. Select "OK"

  8. Now read using POI API ... after reading in Java ... just remove the first character i.e. "!"

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

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