Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Чтение excel файлов


Автор: math64 17.7.2011, 10:12
Для платформенно-независимого чтения 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, если там есть русские буквы?

Автор: kunashir 19.7.2011, 08:19
math64, Вы дальше продвинулись, я так и не решил проблемы со считыванием русских букв.
Про путь тоже не скажу.
Но на сколько я понял сейчас автор libxls участвует в разработке другой библиотеки - xlslib, она уже на C++ написана,  у меня получилось ее собрать под Linux довольно легко, а вот под Виндовс нет (наверное  я что-то не так делаю).
Вот http://sourceforge.net/projects/xlslib/

Автор: Artemon 19.7.2011, 09:10
Возможно данная тема вам поможет: http://www.prog.org.ru/topic_2643_0.html


Автор: math64 19.7.2011, 11:23
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(), "");
    ...
}


Автор: math64 19.7.2011, 11:52
Для правильного чтения названий страниц измените 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?
...
}

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

приложение собирается, но при запуске пишет "Программа неожиданно завершилась". Завершилась с кодом 0.

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

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

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

Падает программа с сегмент фаултинг

Автор: bsa 12.12.2012, 11:57
Vizir1989, у тебя случаем нет статических переменных?

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

Статических нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)