Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
1

LibXL - на определённой ячейке таблицы ломается чтение из таблицы программа

10.12.2020, 17:34. Показов 1596. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Суть функции в чтении ячеек excel и помещении в JSON. Но на определённой ячейке таблицы ( на скрине выделил красным ) - программа ломается - выдаёт пустой текст в функцию конвертации Unicode to UTF - 8 (нужно для работы с JSON).
ОС: Win 10 Pro
Microsoft Visual Studio 2019
Библиотека Excel: https://www.libxl.com/home.html
Библиотека JSON: https://github.com/nlohmann/json
Функция чтения таблицы:
C++
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
void client::CreateJSONARR_Characteristics_of_soils_by_the_content_of_mobile()
{
    Book* book = xlCreateBook();
    if (book->load(path))
    {
        Sheet* sheet = book->getSheet(0);
        if (sheet)
        {
            json tmp =
            {
                {u8"Область", ""}, //0
                {u8"Обстежена_площа", ""}, //1
                {u8"Дуже_сильно_та_сильно_кислі", ""}, //2
                {u8"Дуже_сильно_та_сильно_кислі_%", ""}, //3
                {u8"Середньо_кислі", ""}, //4
                {u8"Середньо_кислі_%", ""}, //5
                {u8"Слабо_кислі", ""}, //6
                {u8"Слабо_кислі_%", ""}, //7
                {u8"Усього_кислих", ""}, //8
                {u8"Усього_кислих_%", ""}, //9
                {u8"Близькі_до_нейтральних", ""}, //10
                {u8"Близькі_до_нейтральних_%", ""}, //11
                {u8"Нейтральні", ""}, //12
                {u8"Нейтральні_%", ""}, //13
                {u8"Слабо_лужні", ""}, //14
                {u8"Слабо_лужні_%", ""}, //15
                {u8"Середньо_лужні", ""}, //16
                {u8"Середньо_лужні_%", ""},//17
                {u8"Дуже_сильно_та_сильно_лужні", ""}, //18
                {u8"Дуже_сильно_та_сильно_лужні_%", ""}, //19
                {u8"Середньозважений_показник", ""}, //20
            };
            for (size_t row = sheet->firstRow(); row < sheet->lastRow(); row++)
            {
                for (size_t col = sheet->firstCol(); col < sheet->lastCol(); col++)
                {
                    CellType cellType = sheet->cellType(row, col);
                    switch (cellType)
                    {
                    case CELLTYPE_STRING:
                    {
                        if (col == 0)
                        {
                            const wchar_t* s = sheet->readStr(row, col);
 
                            const auto key = tools::utf8::convert(L"Область");
                            const auto val = tools::utf8::convert(s);
                            tmp[key] = val;
                        }
                        
                        break;
                    }
                    case CELLTYPE_NUMBER:
                    {
                       ....
                        if (col == 12) //Нейтральні       // тут ошибка
                        {
                            const wchar_t* s = sheet->readStr(row, col);
                            wcout << s << endl;
                            const auto key = tools::utf8::convert(L"Нейтральні");
                            const auto val = tools::utf8::convert(s);
                            tmp[key] = val;
                        }
                        break;
                    }
                    }
                }     //for (size_t col = sheet->firstCol(); col < sheet->lastCol(); col++)
                const auto key = tools::utf8::convert(L"elements");
                const auto key1 = tools::utf8::convert(L"element");
                const auto key2 = tools::utf8::convert(L"date");
                jarr[key][key1].push_back(tmp);
                tmp.clear();
            }     //for (size_t row = 3; row < sheet->lastRow(); row++) 
            book->release();
        }
    }
}
Функция конвертирования:
C++
1
2
3
4
5
6
7
8
9
  ::std::string convert(const wchar_t* text)
        {
 
                assert(text); // тут ошибка
                if (text[0] == 0)
                    return ::std::string();
                const size_t len = ::str_length(text);
                return ::tools::utf8::convert(text, len);
        }
Подскажите пожалуйста, в чём ошибка?
Миниатюры
LibXL - на определённой ячейке таблицы ломается чтение из таблицы программа   LibXL - на определённой ячейке таблицы ломается чтение из таблицы программа  
Вложения
Тип файла: xls tabl-10-tur-makroel.xls (120.5 Кб, 0 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2020, 17:34
Ответы с готовыми решениями:

Автоматически изменить значение в определенной ячейке таблицы
Добрый день, уважаемые пользователи ! Скажите пожалуйста, можно ли средствами MySQL реализовать...

Как из Таблицы содержащейся в датасет получить информацию находящуюся в определённой ячейке
Имеется датасет с одной таблицей, как получить значение определённой ячейки из таблицы ?

Как привязать конкретный combobox компонента к определённой ячейке таблицы Excel?
Имеется 4 Combobox'а. В каждом из них имеется определённый список, который можно выбрать...

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

12
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
10.12.2020, 17:39  [ТС] 2
.xls
Миниатюры
LibXL - на определённой ячейке таблицы ломается чтение из таблицы программа  
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
10.12.2020, 17:51 3
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Подскажите пожалуйста, в чём ошибка?
Наверное в том, что когда sheet->readStr(row, col) возвращает nullptr, ты не проверяешь и вызываешь convert, в котором срабатывает assert
0
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
10.12.2020, 18:02  [ТС] 4
oleg-m1973, я писал проверки, даже внутри convert:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 try
                            {
                                const wchar_t* s = sheet->readStr(row, col);
                                const auto key = tools::utf8::convert(L"Нейтральні");
                                const auto val = tools::utf8::convert(s);
                                tmp[key] = val;
                            }
                            catch (const exception ex)
                            {
                                const auto key = tools::utf8::convert(L"Нейтральні");
                                tmp[key] = "";
                            }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const wchar_t* s = sheet->readStr(row, col);
                                if (s != nullptr)
                                {
                                    const auto key = tools::utf8::convert(L"Нейтральні");
                                    const auto val = tools::utf8::convert(s);
                                    tmp[key] = val;
                                }
                                else
                                {
                                    const auto key = tools::utf8::convert(L"Нейтральні");
                                    tmp[key] = "";
 
                                }
но результат тот же
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
10.12.2020, 18:05 5
Цитата Сообщение от SkYMaaN Посмотреть сообщение
oleg-m1973, я писал проверки, даже внутри convert:
C++
1
2
3
4
5
6
7
8
 ::std::string convert(const wchar_t* text)
        {
 if (!text)
       return {};
 
                assert(text); // тут ошибка
                if (text[0] == 0)
                    return ::std::string();
Добавлено через 49 секунд
Не везде, значит писал
1
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
10.12.2020, 18:07  [ТС] 6
Благодарю, получилось.
Могу поинтересоваться почему проверки которые я писал в сообщении выше не сработали на пару с:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
::std::string convert(const wchar_t* text)
        {
          
            try
            {
                if (text[0] == 0)
                    return ::std::string();
                const size_t len = ::str_length(text);
                return ::tools::utf8::convert(text, len);
            }
            catch(const std::exception ex)
            {
                text = L"";
                if (text[0] == 0)
                    return ::std::string();
                const size_t len = ::str_length(text);
                return ::tools::utf8::convert(text, len);
            }
        }
И почему возвращается nullptr если ячейка в таблице заполнена?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
10.12.2020, 18:12 7
Цитата Сообщение от SkYMaaN Посмотреть сообщение
И почему возвращается nullptr если ячейка в таблице заполнена?
Returns NULL if the specified cell doesn't contain a string or error occurs.
https://www.libxl.com/spreadsheet.html#readStr

Добавлено через 37 секунд
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Могу поинтересоваться почему проверки которые я писал в сообщении выше не сработали на пару с:
Где у тебя здесь проверка на nullptr?
0
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
10.12.2020, 20:26  [ТС] 8
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Где у тебя здесь проверка на nullptr?
Вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const wchar_t* s = sheet->readStr(row, col);
                                if (s != nullptr)
                                {
                                    const auto key = tools::utf8::convert(L"Нейтральні");
                                    const auto val = tools::utf8::convert(s);
                                    tmp[key] = val;
                                }
                                else
                                {
                                    const auto key = tools::utf8::convert(L"Нейтральні");
                                    tmp[key] = "";
 
                                }
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
10.12.2020, 20:28 9
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Вот
В том коде, который ты показал вначале, этого нет. И у тебя там несколько вызовов sheet->readStr
0
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
10.12.2020, 20:49  [ТС] 10
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В том коде, который ты показал вначале, этого нет.
Да, нету. Но я пробовал именно с таким фрагментом кода :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const wchar_t* s = sheet->readStr(row, col);
                                if (s != nullptr)
                                {
                                    const auto key = tools::utf8::convert(L"Нейтральні");
                                    const auto val = tools::utf8::convert(s);
                                    tmp[key] = val;
                                }
                                else
                                {
                                    const auto key = tools::utf8::convert(L"Нейтральні");
                                    tmp[key] = "";
 
                                }
и выбивает туже ошибку
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2020, 21:43 11
Цитата Сообщение от SkYMaaN Посмотреть сообщение
с таким фрагментом кода :
с таким фрагментом кода всё в порядке.

Цитата Сообщение от SkYMaaN Посмотреть сообщение
и выбивает туже ошибку
если с таким фрагментом кода у тебя всё равно срабатывает ассерт,
значит дело не в этом фрагменте кода.
значит ассерт срабатывает где-то в другом месте.
значит ты где-то ещё накосячил с указателем.
1
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
10.12.2020, 22:00 12
Цитата Сообщение от SkYMaaN Посмотреть сообщение
выбивает туже ошибку
Значит convert где-то еще вызывается с nullptr помимо этой вашей проверки.

Добавлено через 15 минут
SkYMaaN, вообще говоря ассерт в такой ситуации показывает где вы накосячили в логике программы. Тем, что вы заглушили его явной if-проверкой
C++
1
2
 if (!text)
       return {};
делу не помогает. Теперь вы не знаете где именно у вас появляется nullptr, и, соответственно, ничего с этим не делаете. Может быть оно так и надо, но учитывая ваши последующие вопросы, вы понятия не имеете что у вас происходит в программе, но уже применили решение, которое еще больше добавляет неизвестности.

Разберитесь сначала где именно точно должны быть nullptr, ассерт вам в этом поможет. И только потом при необходимости глушите их проверкой.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2020, 22:09 13
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
if (!text)
       return {};
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Не везде, значит писал
конкретно в функции convert такая проверка не нужна, и только вредит.
0
10.12.2020, 22:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2020, 22:09
Помогаю со студенческими работами здесь

Как указать в запросе имя таблицы, записанное в ячейке этой таблицы
Добрый день. Помогите пожалуйста решить проблему: Есть таблица 'budget' со следующей...

Написать обработчик событий, чтобы при клике на ячейке таблицы в ячейке появилась картинка.
Здравствуйте,прошу, помогите пожалуйста((( написать обработчик событий, чтобы при клике ячейке...

Таблица в ячейке таблицы
Хочю предупредить сразу. В веб програмировании я новичек и от обьяснений какой я ... и .... прошу...

Запрос в ячейке таблицы
Добрый День! Такой вопрос я создаю таблицы в phpPgAdmin - администрирование PostgreSQL. Можно ли...

Доступ к ячейке таблицы
Скрипт на яваСкрипте находится отдельно от страницы. подскажите как ччерез этот скрипт...

Картинка в ячейке таблицы
Здравствуйте! Подскажите пожалуйста, как вставить картинку в поле OLE, чтобы её было видно прямо в...


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

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