powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Apache POI : Проблема с обновлением Excel
8 сообщений из 8, страница 1 из 1
Apache POI : Проблема с обновлением Excel
    #39485348
Hehabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Apache POI : Проблема с обновлением Excel,
после того как в ячейки записываются новые значения :
java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell

Работаю с 5 файлами, 3 из них работают как надо, а 2 других не хотят.
Пока приходится эти 2 файла стартовать посредством
Runtime.getRuntime().exec("cmd /c start " + excel.getAbsolutePath());
чтобы они открылись и эксель всё там прорешал и только потом из них вычитывать.

В чём может быть проблема? Как исправить?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
// ---------------------------------------------------------------------------

// Здесь в ячейки записываются новые значения

workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
workbook.setForceFormulaRecalculation(true);

OutputStream output = new FileOutputStream(excel.getAbsolutePath());
workbook.write(output);
output.flush();
output.close();

// Здесь из ячеек вычитываются новые значения, 
после того как Excel перерешает с новыми значениями

// ---------------------------------------------------------------------------

// «Ломается» на ячейке в которой стоит: =C34

java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell
	at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:1050)
	at org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:310)
	at quicc.excel.api.ExcelHandlerXSSF.handleCell(ExcelHandlerXSSF.java:275)
	at quicc.excel.api.ExcelHandlerXSSF.readCell(ExcelHandlerXSSF.java:251)
	
...
Рейтинг: 0 / 0
Apache POI : Проблема с обновлением Excel
    #39485492
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hehabr,

Оно же говорит "Cannot get a NUMERIC value from a STRING". Что не понятно?

автор// Здесь из ячеек вычитываются новые значения,
после того как Excel перерешает с новыми значениями
Вы Formula Evaluation видели? Может лучше так?
...
Рейтинг: 0 / 0
Apache POI : Проблема с обновлением Excel
    #39485598
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собссно. ага. если там стринга то что ж вы хотите? а там точно стринга или нумерик? я имею ввиду в таблице.
...
Рейтинг: 0 / 0
Apache POI : Проблема с обновлением Excel
    #39486166
Hehabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конвертировать строку в число не представляется возможным, потому что эта строка - это текст формулы в ячейке. До обновления одной из других ячеек из проблемной ячейки D5 вычитывается число, получающееся там по этой формуле, а после обновления нет.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
package poi.service;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class POITestEva {

    private String excelFilePath = "C:/Test/1.xlsm";
    private FileInputStream inputStream;
    private XSSFWorkbook workbook;

    public static void main(String[] args) {
        POITestEva pOITestEva = new POITestEva();
        pOITestEva.updateCell(3.0);
        System.out.println("D5 = " + pOITestEva.readCellTest("D5"));		// Line 23
    }


    public void updateCell(Double newData) {
        try {
            File excel = new File(excelFilePath);
            inputStream = new FileInputStream(excel);
            workbook = new XSSFWorkbook(inputStream);
            workbook.setForceFormulaRecalculation(true);

            Cell cell = getCell(1, "C8");
            if (cell != null) {
                cell.setCellValue(newData);
            }

            workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
            OutputStream output = new FileOutputStream(excel);
            workbook.write(output);
            output.flush();
            output.close();
            workbook.close();
            inputStream.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


    private Cell getCell(int sheetNr, String cellId) {
        CellReference ref = new CellReference(cellId);
        return getCell(sheetNr, ref.getCol(), ref.getRow());
    }

    private Cell getCell(int sheetNr, int col, int row) {
        XSSFSheet sheet = workbook.getSheetAt(sheetNr);
        if (sheet.getRow(row) != null
                && sheet.getRow(row).getCell(col) != null
                && !(sheet.getRow(row).getCell(col).getCellType() == Cell.CELL_TYPE_BLANK)) {
            return sheet.getRow(row).getCell(col);
        }
        return null;
    }


    public Double readCellTest(String cellId) {
        try {
            File excel = new File(excelFilePath);
            inputStream = new FileInputStream(excel);
            workbook = new XSSFWorkbook(inputStream);
            Double result = ( (Double) (readCell(cellId)) );			// Line 74
            if (workbook != null) {
                workbook.close();
            }
            if (inputStream != null) {
                workbook.close();
            }
            return result;
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private Object readCell(String cellId) {
        Cell cell = getCell(1, cellId);
        return handleCell(cell.getCellType(), cell);					// Line 91
    }


    @SuppressWarnings("deprecation")
    private Object handleCell(int type, Cell cell) {
        switch (type) {
            case XSSFCell.CELL_TYPE_STRING:
                return cell.getStringCellValue();
            case XSSFCell.CELL_TYPE_NUMERIC:
                return cell.getNumericCellValue();
            case XSSFCell.CELL_TYPE_BOOLEAN:
                return cell.getBooleanCellValue();
            case XSSFCell.CELL_TYPE_BLANK:
                return null;
            case XSSFCell.CELL_TYPE_ERROR:
                return null;
            case XSSFCell.CELL_TYPE_FORMULA:
                return cell.getNumericCellValue();					// Line 109
            default:
                return null;
        }
    }

}
...
Рейтинг: 0 / 0
Apache POI : Проблема с обновлением Excel
    #39486167
Hehabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
"C:\Program Files\Java\jdk1.8.0_51\bin\java" -Didea.launcher.port=... ...java.lang.IllegalStateException: Cannot get a NUMERIC value from a STRING cell
D5 = null
	at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:1050)
	at org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:310)
	at service.POITestEva.handleCell(POITestEva.java:109)
	at service.POITestEva.readCell(POITestEva.java:91)
	at service.POITestEva.readCellTest(POITestEva.java:74)
	at service.POITestEva.main(POITestEva.java:23)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 0
...
Рейтинг: 0 / 0
Apache POI : Проблема с обновлением Excel
    #39486168
Hehabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
<apache.poi.version>3.16</apache.poi.version>

------------------------------------------------------------------------

D5 =SUMME(C18:C20)

C18 =IFERROR(SUMME(C31:32)
C19 =SUMME(C33:34)
C20 =SUMME(C35:36)

C31-C36 → next Formel etc.

-----------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Apache POI : Проблема с обновлением Excel
    #39486241
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hehabr,

Потому, что вы в строке 109 из ячейки с формулой читаете число, а не результат вычисления.
Код: java
1.
2.
      case XSSFCell.CELL_TYPE_FORMULA:
               return cell.getNumericCellValue();					// Line 109
...
Рейтинг: 0 / 0
Apache POI : Проблема с обновлением Excel
    #39486263
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HehabrКонвертировать строку в число не представляется возможным, потому что эта строка - это текст формулы в ячейке.

Читайте документацию по POI, и такая возможность чудесным образом представится.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Apache POI : Проблема с обновлением Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]