一,给DeepSeek提合适的要求

最近在给客户写一个自动生成NC宏程序的小程序,因为我一直使用VC的,这次因为要用到Excel,但是在很多时候,C++直接调用Excel的方式都极其依赖系统和Microsoft Excel 软件。这次,我就想在不依赖Excel的情况下,用C++来实现。

1.寻找合适的开源库

我直接将这个问题交给DeepSeek,我如下提问:

有哪些比较好的读取XLSX文件的C++库

经过DS不停的搜索,查询很快就给出了回复:

以下是一些推荐的用于读取XLSX文件的C++库及其特点,可根据需求选择:


1. LibXL
  • 特点

    • 商业库(免费版功能受限),支持读写XLS/XLSX。

    • 纯C接口,提供C++封装,跨平台(Windows、Linux、macOS)。

    • 支持公式、样式、合并单元格等复杂操作。

  • 优点

    • 高性能,适合处理大文件。

    • 文档完善,商业项目可购买授权。

  • 缺点

    • 免费版功能有限(无水印但仅支持部分API)。

    • 商业授权费用较高。

  • 适用场景:商业项目、需要稳定性和高性能的场景。

  • 官网链接


2. Qt Xlsx (QXlsx)
  • 特点

    • 开源库(MIT协议),基于Qt框架,无需Excel依赖。

    • 支持读写XLSX,提供简单的API,依赖Qt Core模块。

  • 优点

    • 适合Qt项目,集成方便。

    • 支持样式、图表、公式等基础功能。

  • 缺点

    • 依赖Qt,非Qt项目可能增加冗余。

    • 处理超大文件时性能一般。

  • 适用场景:Qt项目或需要开源解决方案的场景。

  • GitHub仓库


3. xlnt
  • 特点

    • 开源(MIT协议),现代C++11/14编写,遵循ECMA-376标准。

    • 支持读写XLSX,跨平台,无第三方依赖(除标准库)。

  • 优点

    • 轻量级,代码可读性高。

    • 社区活跃,持续维护。

  • 缺点

    • 对复杂样式支持有限。

    • 部分高级功能(如加密文件)尚未实现。

  • 适用场景:跨平台项目,需现代C++特性的场景。

  • GitHub仓库


4. OpenXLSX
  • 特点

    • 开源(MIT协议),仅头文件库(Header-only)。

    • 专注于XLSX读写,API简洁。

  • 优点

    • 无外部依赖,集成简单。

    • 适合读取基础数据和表格内容。

  • 缺点

    • 功能较基础,不支持复杂操作(如公式计算)。

    • 项目较新,社区规模较小。

  • 适用场景:快速读取简单XLSX文件的需求。

  • GitHub仓库


5. 其他选项
  • libxlsxwriter(C库 + C++封装):

    • 主要用于写入XLSX,读取功能有限,需结合其他工具。

  • Excel格式解析器

    • 直接解析XLSX的ZIP+XML结构,适合极简需求,但开发成本高。

  • ODBC驱动

    • 通过数据库接口读取,需安装Excel驱动,跨平台配置复杂。


选择建议:
  • 需要高性能和商业支持 → LibXL

  • 已使用Qt框架 → QXlsx

  • 现代C++ + 开源 → xlnt

  • 轻量级读取需求 → OpenXLSX

根据项目需求(如许可协议、功能复杂度、性能)权衡选择。

经过权衡,我在VC2019项目里面,采用了OpenXLSX库,全部源代码编译,这样编译出来的代码,不需要依赖EXCEL的安装。特别适合小型化程序,并且是工业项目。因为工业项目主要是写文件和读文件,对不需要非常多的EXCEL本身的操作。同时EXCEL也作为很我工作节点的交接界面,是很好的载体。对于Linux,MAC项目

2.在我的项目结构

将OpenXLSX git到本地,建立自己的第三方库文件目录。在库目录中解压,将路径放入自己项目中,我一般喜欢放入:

2.1外部包含目录

H:\cxxlib\OpenXLSX\OpenXLSX;   注意,正常情况下,需要这样的结构我,一共有两个:OpenXLSX。

2.2在链接的:

附加依赖项一定要加上:OpenXLSX生成的库文件

H:\cxxlib\OpenXLSX\OpenXLSX\lib\x86\OpenXLSX.lib
H:\cxxlib\OpenXLSX\OpenXLSX\lib\x86\nowide.lib

这样我的第一步,在VS2019的MFC项目里面添加不依赖EXCEL,而可以轻松访问XLSX文件,注意:OpenXLSX库,只支持XLSX。

3.一些引用的代码

3.1OpenXLSX 读取XLSX文件,并以Report方式写入一个CListCtrl,并展示出来。

	int iidx = 0;
	int irow = 0;
	wchar_t *deeps;

	CString fullName;
	CFileDialog fileDialog(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All NC Files (*.xlsx)|*.*"), NULL);
	if (fileDialog.DoModal() == IDOK)
	{
		fullName = fileDialog.GetPathName(); // 获取完整的文件路径

		try {
			XLDocument doc;
			doc.open(string(CW2A(fullName.GetString())));

			auto wks = doc.workbook().worksheet("Sheet1");
			int irows = wks.rowCount();

			m_list_DataSource.DeleteAllItems();

			for (irow = 2; irow <= irows; ++irow) {		//过滤掉标题行
				m_list_DataSource.InsertItem(iidx, CString(wks.cell(irow, 1).getString().c_str()));
				m_list_DataSource.SetItemText(iidx, 1, CString(wks.cell(irow, 2).getString().c_str()));
				m_list_DataSource.SetItemText(iidx, 2, CString(wks.cell(irow, 3).getString().c_str()));
				m_list_DataSource.SetItemText(iidx, 3, CString(wks.cell(irow, 4).getString().c_str()));
				m_list_DataSource.SetItemText(iidx, 4, CString(wks.cell(irow, 5).getString().c_str()));
				m_list_DataSource.SetItemText(iidx, 5, CString(wks.cell(irow, 6).getString().c_str()));
				m_list_DataSource.SetItemText(iidx, 6, CString(wks.cell(irow, 7).getString().c_str()));
				m_list_DataSource.SetItemText(iidx, 7, CString(wks.cell(irow, 8).getString().c_str()));
				m_list_DataSource.SetItemText(iidx, 8, CString(wks.cell(irow, 9).getString().c_str()));

				for (int i = 9; i < 21; i = i + 2) {        //确定值,这相当于跟应用沟通的结果
					if (!wks.cell(irow, i).empty()) {
						m_list_DataSource.SetItemText(iidx, i, CString(wks.cell(irow, i + 1).getString().c_str()));

						deeps = Utf8ToUnicode(wks.cell(irow, i + 2).getString().c_str());
						m_list_DataSource.SetItemText(iidx, i + 1, deeps);
					}
					else
						break;
				}
				iidx++;
			}
		}
		catch (const std::exception& e) {
			m_strTemp.Format(_T("打开文件出错:%s 文件名:%s"), e.what() , fullName.GetString());
			LogText(m_strTemp);
			return;
		}
	}

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐