Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Чтение excel файлов 
:(
    Опции темы
math64
Дата 17.7.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Для платформенно-независимого чтения excel файлов скачал библиотеку libxls 
Написана на чистом С, без учёта С++, поэтому приходится делать include так:
Код
extern "C" {
#include <libxls/xls.h>
}

Вместо struct st_row_data писать st_row::st_row_data.
Не считывает русские символы, поэтому приходится добавлять исходинки в проект и заменить функцию перекодировки: 
Код

char* unicode_decode(const BYTE *s, int len, int *newlen, const char* to_enc)
{
    Q_UNUSED(to_enc);
    QString qs((QChar*)s, len / sizeof(QChar));
    QByteArray ba = qs.toUtf8();
    const char* res1 = ba.data();
    int sz = ba.length();
    char* res = (char*)calloc(sz + 1, sizeof(char));
    strcpy(res, res1);
    if(newlen != NULL)
        *newlen = sz;
    return res;
}

char *str = row->cells.cell[tt].str;
QString qstr = QString::fromUtf8(str);

Для чтения файлов используется stdio, при открытии нужно задавать имя файла в char*,
Код

    char* fileName;
    xlsWorkBook* pWB=xls_open(fileName, "iso-8859-15//TRANSLIT");

Как получить char* fileName из QString, если там есть русские буквы?


Это сообщение отредактировал(а) math64 - 17.7.2011, 13:07
PM   Вверх
kunashir
Дата 19.7.2011, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



math64, Вы дальше продвинулись, я так и не решил проблемы со считыванием русских букв.
Про путь тоже не скажу.
Но на сколько я понял сейчас автор libxls участвует в разработке другой библиотеки - xlslib, она уже на C++ написана,  у меня получилось ее собрать под Linux довольно легко, а вот под Виндовс нет (наверное  я что-то не так делаю).
Вот ссылка
PM MAIL   Вверх
Artemon
Дата 19.7.2011, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 2
Всего: 20



Возможно данная тема вам поможет: http://www.prog.org.ru/topic_2643_0.html




--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
math64
Дата 19.7.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



kunashir, 
xlslib - только для записи (как я понял)
libxls - только для чтения
Artemon, 
Как получить строку в Windows-1251 кодировке как раз понятно, но для Linux нужно KOI-8 (впрочем, зависит от дистрибутива), как определить нужную кодировку?
Код

bool MainWindow::load(const QString& fileName)
{
    QTextCodec* codec = QTextCodec::codecForName("Windows-1251");
    //Нельзя писать так:
    //xlsWorkBook* pWB=xls_open(codec->fromUnicode(fileName).data(), "");
    QByteArray ba = codec->fromUnicode(fileName);
    // параметр charset я игнорирую, можно писать что угодно. Но в библиотеке поправить выделение памяти для него + 1 для '\0'
    xlsWorkBook* pWB=xls_open(ba.data(), "");
    ...
}


PM   Вверх
math64
Дата 19.7.2011, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Для правильного чтения названий страниц измените xls.c:
Код

char* xls_addSheet(xlsWorkBook* pWB,BOUNDSHEET *bs)
{
...
        //name=get_string(bs->name,unicode,0,pWB->charset);    // TODO: unicode relevant here?
        name=get_string(bs->name,0,unicode,pWB->charset);    // TODO: unicode relevant here?
...
}

PM   Вверх
Vizir1989
Дата 12.12.2012, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.3.2010

Репутация: нет
Всего: нет



пытаюсь прочитать xls файлы, скачал библиотеку xlsreader.
Пишу
extern "C" {
#include <libxls/xls.h>
}

приложение собирается, но при запуске пишет "Программа неожиданно завершилась". Завершилась с кодом 0.
PM MAIL   Вверх
bsa
Дата 12.12.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Vizir1989, запусти под отладчиком.
Цитата(math64 @  19.7.2011,  12:23 Найти цитируемый пост)
Как получить строку в Windows-1251 кодировке как раз понятно, но для Linux нужно KOI-8 (впрочем, зависит от дистрибутива), как определить нужную кодировку?
QString::toLocal8Bit()
PM   Вверх
Vizir1989
Дата 12.12.2012, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.3.2010

Репутация: нет
Всего: нет



отладчик показал что программа падает на 
this->setLayout(vLayout);
Причем падает на этом месте если есть QTableWidget или QTableView. Кроме них у меня есть QComboBox и QButton. Если убрать QTableWidget/QTableView то программа норм собирается.
Если убрать
extern "C" {
#include <libxls/xls.h>
}

то программа нормально запускается с QTableWidget/QTableView запускается.

Падает программа с сегмент фаултинг
PM MAIL   Вверх
bsa
Дата 12.12.2012, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Vizir1989, у тебя случаем нет статических переменных?
PM   Вверх
Vizir1989
Дата 13.12.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.3.2010

Репутация: нет
Всего: нет



Цитата(bsa @ 12.12.2012,  11:57)
Vizir1989, у тебя случаем нет статических переменных?

Статических нет.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.