
AI辅助 DeepSeek程序编写 1.直接让AI生成一个比较现实的例程
我在VC2019项目里面,采用了OpenXLSX库,全部源代码编译,这样编译出来的代码,不需要依赖EXCEL的安装。最近在给客户写一个自动生成NC宏程序的小程序,因为我一直使用VC的,这次因为要用到Excel,但是在很多时候,C++直接调用Excel的方式都极其依赖系统和Microsoft Excel 软件。这样我的第一步,在VS2019的MFC项目里面添加不依赖EXCEL,而可以轻松访问XLSX
一,给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项目或需要开源解决方案的场景。
3. xlnt
-
特点:
-
开源(MIT协议),现代C++11/14编写,遵循ECMA-376标准。
-
支持读写XLSX,跨平台,无第三方依赖(除标准库)。
-
-
优点:
-
轻量级,代码可读性高。
-
社区活跃,持续维护。
-
-
缺点:
-
对复杂样式支持有限。
-
部分高级功能(如加密文件)尚未实现。
-
-
适用场景:跨平台项目,需现代C++特性的场景。
4. OpenXLSX
-
特点:
-
开源(MIT协议),仅头文件库(Header-only)。
-
专注于XLSX读写,API简洁。
-
-
优点:
-
无外部依赖,集成简单。
-
适合读取基础数据和表格内容。
-
-
缺点:
-
功能较基础,不支持复杂操作(如公式计算)。
-
项目较新,社区规模较小。
-
-
适用场景:快速读取简单XLSX文件的需求。
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;
}
}
更多推荐
所有评论(0)