Qt ODBC 操作excel文件,获取表明中文乱码问题

尘中远 2013-10-17 04:45:21
由于excel文件很大,用QAxObject处理非常非常慢,用的是网上下载的ExcelEngine类。所以打算改用odbc,但是遇到了一个问题。
excel的sheet是中文命名的,如图所示


读取代码如下:
dsn = QStringLiteral( "DRIVER={Microsoft Excel Driver (*.xls)};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;DBQ=%1").arg(strFileName);
m_db.setDatabaseName(dsn);
bool isOpen = m_db.open();
if(isOpen)
{
qDebug()<<"success open excel file:"<<strFileName;
m_sheetLists = m_db.tables(QSql::AllTables);
}

其中
m_db是QSqlDatabase
dsn 和 strFileName是QString
m_sheetLists 是QStringList

结果,用odbc读出来的表格内容变成
引用
("'2013??10??5??15 58$'", "'???????? (root)$'")

所有中文变成乱码

使用的是qt 5.0.2 with vs2010
于是我想是不是编码问题,于是就进行转换,我打算遍历所有编码看看是哪一种

QStringList sheetNameLists = m_db.tables(QSql::AllTables); 
qDebug() << sheetNameLists;
QList<QByteArray> code = QTextCodec::availableCodecs();
for(int j = 0; j < code.size(); ++j)
{
qDebug() << code.value(j) << "-------------------------------------";
for(int i = 0; i < sheetNameLists.size(); ++i)
{
QTextCodec *codec = QTextCodec::codecForName(code.value(j));
QString text_str = codec->toUnicode(sheetNameLists.value(i).toLatin1());
qDebug() << text_str;
}
}


运行后输出结果:
引用
"success load"
("'2013??10??5??15 58$'", "'???????? (root)$'")
"UTF-8" -------------------------------------
"'2013??10??5??15 58$'"
"'???????? (root)$'"
"ibm-1208" -------------------------------------
"'2013??10??5??15 58$'"
"'???????? (root)$'"
"ibm-1209" -------------------------------------
"'2013??10??5??15 58$'"
"'???????? (root)$'"
"ibm-5304" -------------------------------------
"'2013??10??5??15 58$'"
"'???????? (root)$'"
"UTF-32LE" -------------------------------------
"?????????"
"????懈???"
"UTF32_LittleEndian" -------------------------------------
"?????????"
"????懈???"
"GB2312" -------------------------------------
"'2013??10??5??15 58$'"
"'???????? (root)$'"
…………………………


发现没有一个是,现在就不清楚如何处理了。
就是在读取表格这里出了问题,在读取内容里面有中文没有什么影响,能正常显示
...全文
1810 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
godmaycry 2016-06-04
  • 打赏
  • 举报
回复
请问楼主这个问题解决了吗?
jhwtty 2015-05-11
  • 打赏
  • 举报
回复
引用 6 楼 czyt1988 的回复:
[quote=引用 5 楼 jhwtty 的回复:] 这应该是qsql_odbc.cpp中的一个bug。请关注2296这一行QString fieldVal = qGetStringData(hStmt, 2, -1, false); 改为QString fieldVal = qGetStringData(hStmt, 2, -1, true);就行了
改了怎么用呢,重新编译qt源码?[/quote] 只需要编译sqldrivers/odbc这一个插件就行了。 用qtcreater打开src/plugins/sqldrivers/odbc/odbc.pro,编译 我们的项目就是这么解决的。
bluespacezero 2015-05-04
  • 打赏
  • 举报
回复
#pragma execution_character_set("utf-8") 试试这个
尘中远 2015-03-04
  • 打赏
  • 举报
回复
引用 7 楼 IBM123 的回复:
//根本原因是QString::fromAscii的问题。试试main()中加入: QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
Qt5已经没有QTextCodec::setCodecForCStrings这个函数了!
尘中远 2015-03-04
  • 打赏
  • 举报
回复
引用 9 楼 cuzn1024 的回复:
QString utf8Str = QString::fromLocal8Bit(ansiStr.toLatin1().constData()); 试一下这个
不行~亲!
  • 打赏
  • 举报
回复
QString utf8Str = QString::fromLocal8Bit(ansiStr.toLatin1().constData()); 试一下这个
ibm123 2015-01-08
  • 打赏
  • 举报
回复
//根本原因是QString::fromAscii的问题。试试main()中加入: QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
尘中远 2015-01-07
  • 打赏
  • 举报
回复
引用 5 楼 jhwtty 的回复:
这应该是qsql_odbc.cpp中的一个bug。请关注2296这一行QString fieldVal = qGetStringData(hStmt, 2, -1, false); 改为QString fieldVal = qGetStringData(hStmt, 2, -1, true);就行了
改了怎么用呢,重新编译qt源码?
jhwtty 2014-10-28
  • 打赏
  • 举报
回复
这应该是qsql_odbc.cpp中的一个bug。请关注2296这一行QString fieldVal = qGetStringData(hStmt, 2, -1, false); 改为QString fieldVal = qGetStringData(hStmt, 2, -1, true);就行了
尘中远 2014-07-25
  • 打赏
  • 举报
回复
引用 3 楼 e5Max 的回复:
楼主,你好!你的问题后来是怎么解决的? 我用同样的方式也存在这样的问题。另外,这样用好像对EXCEL的版本有要求, 只支持2003版的EXCEL。要支持EXCEL2007和2010,有什么办法?
还没解决,后来就搁置了,但肯定有办法解决的
e5Max 2014-04-17
  • 打赏
  • 举报
回复
楼主,你好!你的问题后来是怎么解决的? 我用同样的方式也存在这样的问题。另外,这样用好像对EXCEL的版本有要求, 只支持2003版的EXCEL。要支持EXCEL2007和2010,有什么办法?
ibm123 2013-10-18
  • 打赏
  • 举报
回复
QStringList都已经是乱码,说明获取表名时转码为QString就已经错误。再怎么转都没有用的. 调试一下qsql_odbc.cpp中的qGetStringData函数返回的buf内容.
尘中远 2013-10-17
  • 打赏
  • 举报
回复
亦或者我的转换编码出了问题

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧