c++编写的OTL库读取.xlsx内容的方法?

不知道如何连接xlsx文件,使用OTL库,要求使用字符连接。

#include <xlnt/xlnt.hpp>
xlnt::workbook wb;
wb.load("example.xlsx");
auto ws = wb.active_sheet();
std::string cell_value = ws.cell("A1").value().as<std::string>();
std::string result;
for (const auto& row : ws) {
    for (const auto& cell : row) {
        result += cell.to_string() + "\t";
    }
    result += "\n";
}

要使用 C++ 编写的 OTC 库读取 .xlsx 内容,您需要使用 Apache POI 库。Apache POI 是一个用于操作 Microsoft Office 文件的开源库,支持读取和写入 .xlsx 文件。首先,您需要下载并安装 Apache POI 库。安装完成后,可以使用以下代码读取 .xlsx 文件:

#include <iostream>  
#include <fstream>  
#include <string>  
#include "poi/poi.h"  
#include "poi/ooxml/ooxml.h"
using namespace std;
// 读取 .xlsx 文件  
void readExcelXlsx(const string& filePath) {  
   // 创建一个 Workbook 对象,用于读取 .xlsx 文件  
   auto workbook = make_unique<XSSFWorkbook>();
   // 打开文件  
   ifstream fin(filePath, ios::binary);  
   if (!fin) {  
       cout << "无法打开文件:" << filePath << endl;  
       return;  
   }
   // 读取文件内容  
   workbook->loadFromDisk(fin);
   // 关闭文件  
   fin.close();
   // 输出文件内容  
   cout << "工作表名称:" << workbook->getNumSheets() << endl;  
   for (auto& sheet : *workbook) {  
       cout << "工作表 " << sheet->getSheetName() << " 的内容:" << endl;  
       for (int row = 0; row < sheet->getLastRow(); row++) {  
           for (int col = 0; col < sheet->getLastColumn(); col++) {  
               cout << sheet->getCell(row, col).getString() << " ";  
           }  
           cout << endl;  
       }  
   }  
}
int main() {  
   string filePath = "example.xlsx";  
   readExcelXlsx(filePath);  
   return 0;  
}

在上面的代码中,Apache POI 库被包含,XSSFWorkbook 类用于读取 .xlsx 文件。readExcelXlsx 函数用于读取 .xlsx 文件并将其内容输出到控制台。
首先,该函数创建一个 XSSFWorkbook 对象,然后打开文件并读取其内容。最后,该函数输出工作表的数量和工作表的内容。
请注意,为了使用此代码,您需要将 Apache POI 库添加到您的项目中。有关如何添加库的详细信息,请参考您的编译器或集成开发环境的文档。

我没听说过 otl,然后 google 了下也没看到,你是不是拼错了。你可以试试 OpenXLSX

要使用 C++ 连接和操作 Excel(.xlsx)文件,可以使用 OTL(ODBC Template Library)库进行数据库访问。OTL 可以通过 ODBC(Open Database Connectivity)驱动程序连接到各种数据库管理系统,包括 Microsoft Excel。

以下是一个使用 OTL 连接和读取 Excel 文件的示例代码:

#include <iostream>
#include <otl/otlv4.h> // OTL 库头文件

int main() {
    otl_connect db; // 创建 OTL 连接对象

    try {
        // 连接到 Excel 数据库
        db.rlogon("DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\\path\\to\\your\\file.xlsx;");
        
        // 执行 SQL 查询语句,选择 Excel 表格中的数据
        otl_stream stream(50,
                          "SELECT * FROM [Sheet1$]", // Excel 表格名称,如 Sheet1
                          db);
        
        // 从查询结果集中获取数据
        while (!stream.eof()) {
            int id;
            std::string name;
            
            // 使用 OTL 提供的运算符重载来提取数据
            stream >> id >> name;
            
            std::cout << "ID: " << id << ", Name: " << name << std::endl;
        }
        
        // 断开与数据库的连接
        db.logoff();
    } catch (otl_exception& e) {
        std::cerr << "OTL exception: " << e.msg << std::endl;
    }

    return 0;
}

在代码中,需要修改 DBQ 参数的值为你的 Excel 文件的绝对路径。注意,需要提前安装合适的 ODBC 驱动程序,并根据安装的驱动程序指定正确的连接字符串。

该示例代码使用 OTL 库的 otl_connect 类创建了一个连接对象 db。然后,使用 rlogon 方法连接到 Excel 数据库。接下来,使用 otl_stream 类执行 SQL 查询语句,选择 Excel 表格中的数据。最后,使用运算符重载从查询结果集中获取数据,并进行处理。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题回答:

    很抱歉,OTL库目前并不支持直接读取xlsx文件的内容。OTL是一个用于数据库访问的库,主要用于连接和操作数据库。

    如果你想要读取xlsx文件的内容,你可以考虑使用其他的库或者工具来实现,比如libxlsxwriter或者Apache POI。

    以下是使用libxlsxwriter和Apache POI的示例代码来读取xlsx文件的内容:

    • 使用libxlsxwriter:
    #include <xlsxwriter.h>
    #include <stdio.h>
    
    int main() {
      /* 创建一个新的xlsx文件 */
      lxw_workbook *workbook = workbook_new("output.xlsx");
    
      /* 添加一个新的worksheet */
      lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
    
      /* 写入数据到worksheet */
      worksheet_write_string(worksheet, 0, 0, "Hello", NULL);
      worksheet_write_number(worksheet, 1, 0, 123, NULL);
    
      /* 关闭xlsx文件 */
      workbook_close(workbook);
    
      /* 打开xlsx文件以便读取 */
      FILE* file = fopen("output.xlsx", "rb");
      if (file) {
        /* 在这里你可以读取并处理xlsx文件的内容 */
        fclose(file);
      }
    
      return 0;
    }
    
    • 使用Apache POI(Java):
    import org.apache.poi.ss.usermodel.*;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class ReadExcel {
        public static void main(String[] args) {
            try {
                // 打开xlsx文件
                FileInputStream file = new FileInputStream(new File("input.xlsx"));
    
                // 创建工作簿对象
                Workbook workbook = WorkbookFactory.create(file);
    
                // 获取第一个工作表
                Sheet sheet = workbook.getSheetAt(0);
    
                // 遍历每一行并输出数据
                for (Row row : sheet) {
                    for (Cell cell : row) {
                        switch (cell.getCellType()) {
                            case STRING:
                                System.out.print(cell.getStringCellValue() + "\t");
                                break;
                            case NUMERIC:
                                System.out.print(cell.getNumericCellValue() + "\t");
                                break;
                            case BOOLEAN:
                                System.out.print(cell.getBooleanCellValue() + "\t");
                                break;
                            default:
                                System.out.print("\t");
                        }
                    }
                    System.out.println();
                }
    
                // 关闭工作簿
                workbook.close();
                // 关闭输入流
                file.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    希望以上示例代码能帮到你,如果你还有其他问题,请随时询问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^