Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Apache POI : Проблема с обновлением Excel / 8 сообщений из 8, страница 1 из 1
09.07.2017, 17:13
    #39485348
Hehabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apache POI : Проблема с обновлением Excel
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
10.07.2017, 09:29
    #39485492
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apache POI : Проблема с обновлением Excel
Hehabr,

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

автор// Здесь из ячеек вычитываются новые значения,
после того как Excel перерешает с новыми значениями
Вы Formula Evaluation видели? Может лучше так?
...
Рейтинг: 0 / 0
10.07.2017, 11:29
    #39485598
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apache POI : Проблема с обновлением Excel
собссно. ага. если там стринга то что ж вы хотите? а там точно стринга или нумерик? я имею ввиду в таблице.
...
Рейтинг: 0 / 0
10.07.2017, 23:55
    #39486166
Hehabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apache POI : Проблема с обновлением Excel
Конвертировать строку в число не представляется возможным, потому что эта строка - это текст формулы в ячейке. До обновления одной из других ячеек из проблемной ячейки 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
10.07.2017, 23:55
    #39486167
Hehabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apache POI : Проблема с обновлением Excel
Код: 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
10.07.2017, 23:56
    #39486168
Hehabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apache POI : Проблема с обновлением Excel
<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
11.07.2017, 09:18
    #39486241
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Apache POI : Проблема с обновлением Excel
Hehabr,

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

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


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