最近开发使用到 libxl,用的是3.8.0 破解版。
具体过程:
1、将lib.dll放在exe同目录下,在代码中引用 libxl.lib
#pragma comment(lib, ".\\Lib\\libxl.lib")
2、包含头文件 libxl.h
3、实例
//m_strFilePath为excel文件的完整路径
CString ext = ::PathFindExtension(m_strFilePath);
if(ext.CompareNoCase(L".xlsx") == 0)
book = xlCreateXMLBook(); //针对.xlsx
else
book = xlCreateBook(); //针对.xls
if(!book)
{
return;
}
const wchar_t * x = L"Halil Kural";
const wchar_t * y = L"windows-2723210a07c4e90162b26966a8jcdboe";
book->setKey(x, y); //设置key,即破解^_^
if(!book->load(m_strFilePath))
{
return;
}
int sheetCount = book->sheetCount(); //工作表总数量
for (int index = 0; index < sheetCount; ++index)
{
Sheet *sheet =book->getSheet(index++);
if(!sheet)
continue;
int firstRow = sheet->firstRow(); //有数据的第一行行号
int lastRow = sheet->lastRow(); //有数据的最后一行行号
int firstCol = sheet->firstCol(); //有数据的第一列列号
int lastCol = sheet->lastCol(); //有数据的最后一列列号
//找出表头(测试数据)
map<int,wstring> mapColNames;
for(int c = firstCol; c < lastCol; ++c)
{
const wchar_t* str = sheet->readStr(firstRow, c);
if(!str)
continue;
mapColNames[c] = str;
}
//确定每个表头代表的意义(测试数据)
map<int,eFIELD> mapColTypes;
for (auto it = mapColNames.begin(); it != mapColNames.end(); ++it)
{
eFIELD e = GetFieldTypeByName(it->second.c_str());
mapColTypes[it->first] = e;
}
//逐行读取数据
for (int row = firstRow+1; row < lastRow; ++row)
{
for(int c = firstCol; c < lastCol; ++c)
{
CString strValue;
CellType t = sheet->cellType(row, c);
if(t == CELLTYPE_NUMBER)
{
double db = sheet->readNum(row, c);//test
LONG64 number = (LONG64)db;
if(number > 0)
strValue.Format(L"%I64d", number);
}
else
const wchar_t* s = sheet->readStr(row, c); //读取内容
}
}
}
4、读取时间格式的数据
1 CString strValue; 2 bool bDate = sheet->isDate(row, col); 3 if (bDate) 4 { 5 double db = sheet->readNum(row, col); 6 int year=0, month=0, day=0; 7 bool b = book->dateUnpack(db, &year, &month, &day); 8 9 //将读取的时间 转换为时间戳 10 unsigned __int64 ftNow; 11 SYSTEMTIME time; 12 ZeroMemory(&time, sizeof(SYSTEMTIME)), 13 time.wYear = year; 14 time.wMonth = month; 15 time.wDay = day; 16 SystemTimeToFileTime(&time,(LPFILETIME)&ftNow); 17 __int64 timeStamp = (__int64)((ftNow-0x019db1ded53e8000)/10000);//毫秒 18 strValue.Format(L"%I64d", timeStamp); 19 }