C++之xlsx文件操作之读操作

采用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版权协议,转载请附上原文出处链接和本声明。