Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 15
1

Парсинг Excel

22.04.2018, 20:01. Показов 5838. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, прошу помощи с проблемой, которая возникла в результате парсинга эксель документа. Он содержит в себе 5 столбцов и строки (4 столбца со значением String и один, третий, со значением Date). Создала цикл, который проходит весь документ, но на второй строке(конкретно на значении в формате Date) цикл почему-то прерывается и выдается ошибка Cannot get a numeric value from a text cell. Заранее спасибо!


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
public class ExcelTable {
    public static void readFromEx(String file) throws IOException, FileNotFoundException, BiffException{
    
        File inputWorkbook = new File(file);
        
         Workbook w = Workbook.getWorkbook(inputWorkbook);
          Sheet sheet = w.getSheet(0);
         
    for (int i = 0; i < sheet.getRows(); i++) {
        String surname="";
        String name="";
        int day=0;
        int month=0;
        String email="";
        String gender="";
        for(int n = 0; n < sheet.getColumns(); n++) { 
        Cell cell = sheet.getCell(n, i);
            switch (n) {
                case 0:
                    surname=cell.getContents();
                    break;
                case 1:
                    name=cell.getContents();
                    break;
                case 2:
                    String date=cell.getContents();
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
                    LocalDate ld = LocalDate.parse(date, formatter);
                    day=ld.getDayOfMonth();
                    month=ld.getMonthValue();
                    break; 
                case 3:
                    email=cell.getContents();
                    break;
                case 4:
                    gender=cell.getContents();
                    if ("M".equals(gender)) gender="male";
                    else {if ("Ž".equals(gender)) gender="female";
                    else gender=""; }
                    break;
                    }
                    }  
}
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2018, 20:01
Ответы с готовыми решениями:

Парсинг excel
Доброго времени суток! Подскажите, пожалуйста, как cпарсить данные c excel документа с помощью...

Быстрый парсинг Excel
Господа, прошу помощи. Суть: есть (и раз в неделю добавляется) сотня файлов *.xls. Содержимое - 1...

Парсинг Excel файла
Добрый день! Занялся парсингом ексель файла. В самом файле екселя есть ячейки у который фотрам...

Парсинг Excel файла
Доброго времени суток, вопрос такой - у меня есть файл с расписанием занятий, как мне вытащить из...

15
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
22.04.2018, 22:24 2
1. Чо за библиотека?
2. СТэктрэйс приложи
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 15
22.04.2018, 23:33  [ТС] 3
Кликните здесь для просмотра всего текста
Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: Cannot get a numeric value from a text cell
at org.apache.poi.hssf.usermodel.HSSFCell.typeMismatch(HSSFCell.java:643)
at org.apache.poi.hssf.usermodel.HSSFCell.getNumericCellValue(HSSFCell.java:668)
at org.apache.poi.hssf.usermodel.HSSFCell.getDateCellValue(HSSFCell.java:689)
at narozeniny.ExcelTable.readFromEx(ExcelTable.java:49)
at narozeniny.MainController.signUpPerson(MainController.java:92)
at narozeniny.MainController.lambda$0(MainController.java:65)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventH andler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManag er.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManag er.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEve ntDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.jav a:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl .java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.jav a:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl .java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.jav a:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl .java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8413)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavio r.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.jav a:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.jav a:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubbli ngEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventH andler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManag er.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManag er.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEve ntDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.jav a:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl .java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.jav a:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl .java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.jav a:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl .java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Glass ViewEventHandler.java:394)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Glass ViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(Glas sViewEventHandler.java:432)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.jav a:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventH andler.java:431)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Unknown Source)


Библиотека jxl

Добавлено через 16 минут
Если просто выводить в консоль индексы клеток по срокам, то в определенный момент обычная последовательность 01234 меняется на 0125
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
22.04.2018, 23:59 4
В доках например рекомендуют кастить Cell в более специфичный тип. Если я конечно смотрел те доки.
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
23.04.2018, 09:24 5
Цитата Сообщение от Biotech Посмотреть сообщение
определенный момент
от чего зависит наступление этого момента?
0
3 / 3 / 2
Регистрация: 30.12.2015
Сообщений: 10
23.04.2018, 10:34 6
Biotech, Как вы знаете Excel-е есть разные типы данных в ячейках. У вас ячейка имеет формат Data. Поэтому вам вначале нужно достать формат ячейки и только потом проводить с ней операции. На сайте Apache POI есть уже готовый пример как это сделать. тыц!
Например, я делал эту проверку примерно так:
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
public static String getCellText(Cell cell){
String result = "";
        switch (cell.getCellTypeEnum()) {
            case STRING:
                System.out.println(cell.getRichStringCellValue().getString());
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                   result = cell.getDateCellValue().toString();
                } else {
                    result = Double.toString(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
               result = Boolean.toString(cell.getBooleanCellValue());
                break;
            case FORMULA:
                result = cell.getCellFormula().toString();
                break;
            case BLANK:
                         break;
            default:
                break;
        }
    return result;
    }
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 15
23.04.2018, 17:41  [ТС] 7
Не знаю, от чего это зависит, но сбой происходит еще до этого.
Когда я пишу CellType type=cell.getCellType() eclipse пишет celltype cant be resolved to a type. Можно ли как-нибудь по-другому проверить тип данных?
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
23.04.2018, 17:48 8
Biotech, у тебя не дает значение из числовой ячейки, так? ты пробовал в эти ячейки, допустим целые числа вставить?
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 15
23.04.2018, 19:26  [ТС] 9
Да, с числовым форматом тоже не получилось
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
23.04.2018, 19:37 10
с целыми числами?

Добавлено через 4 минуты
сделай небольшой Exсel файл или даже несколько, с разными типами чисел и исследуй, пока не поймешь где трабла.
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 15
23.04.2018, 19:37  [ТС] 11
Удалось сделать выборку по типу клеток, но в базе данных, куда, собственно, и идут все значения, в строчке с днем и с месяцем отображаются 0, то есть все равно не происходит чтение числовых данных.

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
 for (Row row : sheet) { String surname="";
        String name="";
        int day=0;
        int month=0;
        String email="";
        String gender="";
              for (Cell cell : row) {
                  CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
                 
                  int type=cell.getCellType();
                if (type == Cell.CELL_TYPE_STRING) {
                if(cell.getColumnIndex()==0) surname=cell.getRichStringCellValue().getString();
                if(cell.getColumnIndex()==1) name=cell.getRichStringCellValue().getString();
                if(cell.getColumnIndex()==3) email=cell.getRichStringCellValue().getString();
                if(cell.getColumnIndex()==4) {
                    gender=cell.getRichStringCellValue().getString();
                    if ("M".equals(gender)) gender="male";
                    else {if ("Ž".equals(gender)) gender="female";
                    else gender=""; 
                }}
                }
                 else { if(type==Cell.CELL_TYPE_NUMERIC) {
                         Date date=cell.getDateCellValue();
                         System.out.println(date);
                                
                          LocalDate ld = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
                            day=ld.getDayOfMonth();
                            month=ld.getMonthValue();
                            System.out.println(day);
                            System.out.println(month);
                          
                          }
                }
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
23.04.2018, 19:43 12
формат дат, возможно не приведен к одному виду!
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 15
23.04.2018, 22:15  [ТС] 13
Aviz__, нет, все данные одного вида. Уже несколько раз проверяла
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
24.04.2018, 05:21 14
14.11.2017 на такой дате не спотыкается? в jxl может быть формат дат американский, по дефолту.
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 15
25.04.2018, 13:52  [ТС] 15
Всем большое спасибо, я поняла, как это делается:
Date date = new SimpleDateFormat("dd.MM.yyyy").parse(cell.getStringCellValue());
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
25.04.2018, 14:08 16
Biotech, какая Вы, молодец
0
25.04.2018, 14:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2018, 14:08
Помогаю со студенческими работами здесь

Парсинг Excel и сохранение в *.xml
Добрый день! Подскажите как правильно реализовать. У меня есть файл екселя. Содержит 3 столбца....

Парсинг Excel в БД посредством php
Добрый день, при парсинге возник вопрос, сам метод парсинга я нашел, но суть в том, что во всех...

VBA парсинг и импорт в столбец excel
Всем привет. Решил сделать парсинг сайта: https://2gis.ru/ekaterinburg/rubrics На данный момент...

Парсинг XML файл в Excel на сервере
Добрый день, Подскажите, пожалуйста, есть задача: На сервере хранится файл .xml ~3Гб, его надо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru