帮我用 C++LIBXL库读表格, 每一列的标题不一样,标题分别为"aq","bb","c","d","e", 有10行内容,用每行的第一列内容作为索引,每行的内容存入vector, 再用map 存储起来,写出完整过程
时间: 2023-07-19 10:53:41 浏览: 136
好的,以下是使用 C++LIBXL 库读取表格,将内容存储到 vector 中,再用 map 存储的完整过程:
1. 首先需要安装 C++LIBXL 库,可以到官网下载:https://www.libxl.com/
2. 导入库文件和头文件:
```
#include <iostream>
#include <vector>
#include <map>
#include "libxl.h"
using namespace std;
using namespace libxl;
```
3. 打开 Excel 文件:
```
Book* book = xlCreateBook();
if(book->load("example.xls")) {
cout << "Excel file opened successfully" << endl;
} else {
cout << "Failed to open Excel file" << endl;
return 0;
}
```
4. 获取指定 sheet:
```
Sheet* sheet = book->getSheet(0); // 获取第一个 sheet
```
5. 获取每列的标题,并确定每个标题所在的列:
```
int column_aq = -1; // 列 "aq" 的索引
int column_bb = -1; // 列 "bb" 的索引
int column_c = -1; // 列 "c" 的索引
int column_d = -1; // 列 "d" 的索引
int column_e = -1; // 列 "e" 的索引
for(int i=0; i<sheet->lastCol(); i++) {
string title = sheet->readStr(0, i); // 读取第一行,即标题行
if(title == "aq") {
column_aq = i;
} else if(title == "bb") {
column_bb = i;
} else if(title == "c") {
column_c = i;
} else if(title == "d") {
column_d = i;
} else if(title == "e") {
column_e = i;
}
}
```
6. 读取每行内容,将内容存储到 vector 中:
```
vector<vector<string>> data; // 存储每行内容的 vector
for(int i=1; i<=sheet->lastRow(); i++) { // 从第二行开始读取数据
vector<string> row;
row.push_back(sheet->readStr(i, 0)); // 将每行的第一列作为索引
if(column_aq != -1) {
row.push_back(sheet->readStr(i, column_aq)); // 读取列 "aq" 的内容
}
if(column_bb != -1) {
row.push_back(sheet->readStr(i, column_bb)); // 读取列 "bb" 的内容
}
if(column_c != -1) {
row.push_back(sheet->readStr(i, column_c)); // 读取列 "c" 的内容
}
if(column_d != -1) {
row.push_back(sheet->readStr(i, column_d)); // 读取列 "d" 的内容
}
if(column_e != -1) {
row.push_back(sheet->readStr(i, column_e)); // 读取列 "e" 的内容
}
data.push_back(row); // 将每行内容存储到 vector 中
}
```
7. 将 vector 中的内容存储到 map 中:
```
map<string, vector<string>> map_data; // 存储数据的 map
for(int i=0; i<data.size(); i++) {
string key = data[i][0]; // 获取索引值
vector<string> value(data[i].begin() + 1, data[i].end()); // 获取除索引值以外的内容
map_data[key] = value; // 将索引值和内容存储到 map 中
}
```
8. 关闭 Excel 文件:
```
book->release();
```
完整代码如下:
```
#include <iostream>
#include <vector>
#include <map>
#include "libxl.h"
using namespace std;
using namespace libxl;
int main() {
Book* book = xlCreateBook();
if(book->load("example.xls")) {
cout << "Excel file opened successfully" << endl;
} else {
cout << "Failed to open Excel file" << endl;
return 0;
}
Sheet* sheet = book->getSheet(0); // 获取第一个 sheet
int column_aq = -1; // 列 "aq" 的索引
int column_bb = -1; // 列 "bb" 的索引
int column_c = -1; // 列 "c" 的索引
int column_d = -1; // 列 "d" 的索引
int column_e = -1; // 列 "e" 的索引
for(int i=0; i<sheet->lastCol(); i++) {
string title = sheet->readStr(0, i); // 读取第一行,即标题行
if(title == "aq") {
column_aq = i;
} else if(title == "bb") {
column_bb = i;
} else if(title == "c") {
column_c = i;
} else if(title == "d") {
column_d = i;
} else if(title == "e") {
column_e = i;
}
}
vector<vector<string>> data; // 存储每行内容的 vector
for(int i=1; i<=sheet->lastRow(); i++) { // 从第二行开始读取数据
vector<string> row;
row.push_back(sheet->readStr(i, 0)); // 将每行的第一列作为索引
if(column_aq != -1) {
row.push_back(sheet->readStr(i, column_aq)); // 读取列 "aq" 的内容
}
if(column_bb != -1) {
row.push_back(sheet->readStr(i, column_bb)); // 读取列 "bb" 的内容
}
if(column_c != -1) {
row.push_back(sheet->readStr(i, column_c)); // 读取列 "c" 的内容
}
if(column_d != -1) {
row.push_back(sheet->readStr(i, column_d)); // 读取列 "d" 的内容
}
if(column_e != -1) {
row.push_back(sheet->readStr(i, column_e)); // 读取列 "e" 的内容
}
data.push_back(row); // 将每行内容存储到 vector 中
}
map<string, vector<string>> map_data; // 存储数据的 map
for(int i=0; i<data.size(); i++) {
string key = data[i][0]; // 获取索引值
vector<string> value(data[i].begin() + 1, data[i].end()); // 获取除索引值以外的内容
map_data[key] = value; // 将索引值和内容存储到 map 中
}
book->release(); // 关闭 Excel 文件
// 输出存储的数据
for(auto it=map_data.begin(); it!=map_data.end(); it++) {
cout << it->first << ": ";
for(int i=0; i<it->second.size(); i++) {
cout << it->second[i] << " ";
}
cout << endl;
}
return 0;
}
```
阅读全文