采用xlnt开源库的实现,声明如下:
#define XLNT_STATIC 1
#include "./xlnt/xlnt.hpp"
#ifdef _DEBUG
//#pragma comment(lib, "./xlnt/lib/xlntd.lib")
#pragma comment(lib, "./xlnt/xlntd.lib")
#else
#pragma comment(lib, "./xlnt/lib/xlnt.lib")
#endif // _DEBUG
namespace xlnt
{
class CXlsxExcelReader
{
public:
CXlsxExcelReader(CString strpath);
~CXlsxExcelReader();
// 工作簿
xlnt::workbook* getWorkBook();
// 工作表
xlnt::worksheet* selectWorkSheet(int sheetIndex);
//获取工作表数量
int getSheetsCount();
//获取工作表名称
CString getSheetName(int sheetIndex);
//获取工作表单元格内容
CString getCellValue(int row, int column);
//获取单元表行数
int getRowsCount();
//获取单元表列数
int getColsCount();
private:
// 工作簿
xlnt::workbook m_workbook;
// 工作表
xlnt::worksheet m_worksheet;
};
};定义如下:
namespace xlnt
{
CXlsxExcelReader::CXlsxExcelReader(CString strpath)
{
#ifdef UNICODE
CStringA strFileName = CStrUtils::UnicodeToUtf8(strpath);
#else
CStringA strFileName = CStrUtils::AnsiToUtf8(strpath);
#endif // UNICODE
m_workbook.load(strFileName.GetBuffer(0));
m_worksheet = m_workbook.active_sheet();
}
CXlsxExcelReader::~CXlsxExcelReader()
{
}
// 工作簿
xlnt::workbook* CXlsxExcelReader::getWorkBook() {
return &m_workbook;
}
// 工作表
xlnt::worksheet* CXlsxExcelReader::selectWorkSheet(int sheetIndex)
{
m_worksheet = m_workbook.sheet_by_index(sheetIndex);
return &m_worksheet;
}
//获取工作表数量
int CXlsxExcelReader::getSheetsCount()
{
return m_workbook.sheet_count();
}
//获取工作表名称
CString CXlsxExcelReader::getSheetName(int sheetIndex)
{
#ifdef UNICODE
USES_CONVERSION;
return A2W(pWB.sheet_titles()[sheetIndex].c_str());
#else
return m_workbook.sheet_titles()[sheetIndex].c_str();
#endif // UNICODE
}
//获取工作表单元格内容
CString CXlsxExcelReader::getCellValue(int row, int column)
{
// 单元格
try
{
if (row == 2722 && column == 2) {
xlnt::cell pCell = m_worksheet.cell(column + 1, row + 1);
std::string rsString = pCell.to_string();
#ifdef UNICODE
CString rString = CStrUtils::Utf8ToUnicode(rsString.c_str());
return rString;
#else
CString rString = CStrUtils::Utf8ToAnsi(rsString.c_str());
return rString;
#endif // UNICODE
}
else {
xlnt::cell pCell = m_worksheet.cell(column + 1, row + 1);
std::string rsString = pCell.to_string();
#ifdef UNICODE
CString rString = CStrUtils::Utf8ToUnicode(rsString.c_str());
return rString;
#else
CString rString = CStrUtils::Utf8ToAnsi(rsString.c_str());
return rString;
#endif // UNICODE
}
}
catch (...) {
return _T("error");
}
}
//获取单元表行数
int CXlsxExcelReader::getRowsCount()
{
return m_worksheet.rows().length();
}
//获取单元表列数
int CXlsxExcelReader::getColsCount()
{
return m_worksheet.columns().length();
}
}源码里面涉及到几处字符串编码的转换(往期代码有介绍),这种代码网上很多,自己找找看。
代码调用:
xlnt::CXlsxExcelReader excelReader("1.xlsx");
excelReader.selectWorkSheet(0);
int rows = excelReader.getRowsCount();
int cols = excelReader.getColsCount();
for (UINT row = 0; row < rows; row++) {
for (UINT col = 0; col < cols; col++) {
CStringA sValue = excelReader.getCellValue(row, col);
}
}
版权声明:本文为u012156872原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。