将XLS文件导成Sqlite数据库文件
发布时间:2020-12-12 20:28:46 所属栏目:百科 来源:网络整理
导读:使用的XLS解析库 BasicExcel 头文件: // 王智泉#pragma oncenamespace YExcel{class BasicExcelWorksheet;}struct sqlite3;class XlsToSqlite{public:XlsToSqlite(void);virtual ~XlsToSqlite(void);void convert(const char* xlsFile,const char* sqlLiteFi
使用的XLS解析库 BasicExcel
头文件: // 王智泉 #pragma once namespace YExcel { class BasicExcelWorksheet; } struct sqlite3; class XlsToSqlite { public: XlsToSqlite(void); virtual ~XlsToSqlite(void); void convert(const char* xlsFile,const char* sqlLiteFile); private: void parserSheet(YExcel::BasicExcelWorksheet* sheet); int createTable(YExcel::BasicExcelWorksheet* sheet); int insertValue(YExcel::BasicExcelWorksheet* sheet); private: sqlite3* db; size_t maxRows; size_t maxCols; }; cpp: // 王智泉 #include "StdAfx.h" #include "XlsToSqlite.h" #include "BasicExcel.hpp" #include "sqlite3.h" #include <vector> #include <string> std::wstring s2ws(const std::string& s) { int len; int slength = (int)s.length() + 1; len = MultiByteToWideChar(CP_ACP,s.c_str(),slength,0); std::wstring r(len,L' '); MultiByteToWideChar(CP_ACP,&r[0],len); return r; } std::string ws2s(const std::wstring& s) { string result; //获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的 int len = WideCharToMultiByte(CP_ACP,s.size(),NULL,NULL); char* buffer = new char[len + 1]; //宽字节编码转换成多字节编码 WideCharToMultiByte(CP_ACP,buffer,len,NULL); buffer[len] = ' '; //删除缓冲区并返回值 result.append(buffer); delete[] buffer; return result; } std::string s2utf8(const std::string & str) { int nwLen = ::MultiByteToWideChar(CP_ACP,str.c_str(),-1,0); wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴 ZeroMemory(pwBuf,nwLen * 2 + 2); ::MultiByteToWideChar(CP_ACP,str.length(),pwBuf,nwLen); int nLen = ::WideCharToMultiByte(CP_UTF8,NULL); char * pBuf = new char[nLen + 1]; ZeroMemory(pBuf,nLen + 1); ::WideCharToMultiByte(CP_UTF8,nwLen,pBuf,nLen,NULL); std::string retStr(pBuf); delete []pwBuf; delete []pBuf; pwBuf = NULL; pBuf = NULL; return retStr; } using namespace YExcel; XlsToSqlite::XlsToSqlite(void) : maxRows(0),maxCols(0) { } XlsToSqlite::~XlsToSqlite(void) { } void XlsToSqlite::convert(const char* xlsFile,const char* sqlLiteFile) { BasicExcel e; // 加载excel if (!e.Load(xlsFile)) { MessageBox(NULL,(std::string("打开XLS文件:'") + xlsFile + std::string("'错误,请确认文件是否存在,或者被其它程序打开")).c_str(),"错误",MB_OK); return; } DeleteFile(sqlLiteFile); // 加载SQLite int res = sqlite3_open(sqlLiteFile,&db); if( res ){ MessageBox(NULL,(std::string("Can't open database: ") + sqlite3_errmsg(db)).c_str(),"",MB_OK); sqlite3_close(db); return; } size_t maxSheets = e.GetTotalWorkSheets(); for (size_t i = 0; i < maxSheets; ++i) { this->parserSheet(e.GetWorksheet(i)); } sqlite3_close(db); } // ====================================================================================== void XlsToSqlite::parserSheet(YExcel::BasicExcelWorksheet* sheet) { if (NULL == sheet) { return; } if (this->createTable(sheet)) { this->insertValue(sheet); } } // ====================================================================================== int XlsToSqlite::createTable(YExcel::BasicExcelWorksheet* sheet) { // 得到表名 std::string tableName = ws2s(sheet->GetUnicodeSheetName()); // 得到行和列的数量 maxRows = sheet->GetTotalRows(); maxCols = sheet->GetTotalCols(); char* errMsg = NULL; // 删除 std::string SQL = "DROP TABLE "; SQL += tableName; int res= sqlite3_exec(db,SQL.c_str(),&errMsg); if (res != SQLITE_OK) { std::cout << "执行SQL 出错." << errMsg << std::endl; } SQL.clear(); SQL = "CREATE TABLE " + tableName + " ("; std::string slipt; for (size_t c = 0; c < maxCols; ++c) // 得到字段名 { BasicExcelCell* cell = sheet->Cell(0,c); if(cell->Type() == BasicExcelCell::UNDEFINED || c >= maxCols) { slipt.empty(); maxCols = c; // 表格的宽度只到最后一个非空字段 break; } else { SQL += slipt; slipt = ","; } SQL += ws2s(cell->GetWString()) + " varchar(0)"; } SQL += ")"; //MessageBox(NULL,"哈哈",MB_OK); res = sqlite3_exec(db,&errMsg); if (res != SQLITE_OK) { std::string errorInfo = "执行创建table的SQL 出错."; errorInfo += errMsg; MessageBox(NULL,errorInfo.c_str(),MB_OK); return FALSE; } else { std::cout << "创建table的SQL成功执行."<< std::endl; } return TRUE; } // ====================================================================================== int XlsToSqlite::insertValue(YExcel::BasicExcelWorksheet* sheet) { // 得到行和列的数量 std::string tableName = ws2s(sheet->GetUnicodeSheetName()); char* errMsg = NULL; ASSERT(maxCols > 0); // 得到键值 std::string cellString; char tmpStr[256] = {0}; for (size_t r=1; r<maxRows; ++r) { std::string SQL = "INSERT INTO " + tableName + " VALUES ("; for (size_t c = 0; c < maxCols; ++c) { BasicExcelCell* cell = sheet->Cell(r,c); cellString.clear(); switch (cell->Type()) { case BasicExcelCell::UNDEFINED: printf(" "); break; case BasicExcelCell::INT: sprintf(tmpStr,"%10d",cell->GetInteger()); cellString = tmpStr; break; case BasicExcelCell::DOUBLE: sprintf(tmpStr,"%10.6lf",cell->GetDouble()); cellString = tmpStr; break; case BasicExcelCell::STRING: { sprintf(tmpStr,"%10s",cell->GetString()); cellString = tmpStr; cellString = s2utf8(cellString); // 如果是字符串,将其转换成UTF-8编码 } break; case BasicExcelCell::WSTRING: { cellString = ws2s(cell->GetWString()); cellString = s2utf8(cellString); // 如果是字符串,将其转换成UTF-8编码 } break; } cellString = c < maxCols - 1 && !cellString.empty() ? "'" + cellString + "'," : "'" + cellString + "'"; SQL += cellString; } SQL += ")"; int res = sqlite3_exec(db,&errMsg); if (res != SQLITE_OK) { std::string errorInfo = "执行 SQL 出错."; errorInfo += errMsg; MessageBox(NULL,MB_OK); return FALSE; } } return TRUE; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 关于NAND flash的MTD分区与uboot中分区的理解
- ruby-on-rails – 不同rvm gemsets中的rake版本
- 常用正则表达式
- ruby-on-rails – Cloud9警告我只是忽略?
- 关于NAND flash的MTD分区与uboot中分区的理解
- 精益 React 学习指南 (Lean React)- 1.3 React
- c# – 使用RabbitMQ的MassTransit – RecieveFro
- iphone – 如何在UINavigationController的RootV
- 当多个进程以只读模式访问db时,SQLite C’数据库
- VB.NET CheckedListBox标签?
热点阅读