我的测试版本Qt 5.6.2 QtCreator4.0.3 VS2013
qtExcelApi.h
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #pragma once 2 3 #include <ActiveQt/QAxObject> 4 #include <QDir> 5 6 using namespace std; 7 8 class qtExcelApi 9 { 10 public: 11 qtExcelApi(void); 12 ~qtExcelApi(void); 13 14 15 /** 16 * @brief 新建Excel 17 */ 18 void CreateExcel(); 19 20 21 /** 22 * @brief 打开Excel 23 * @param[in] filePath 路径 24 * @param[in] type 打开时是否显示EXCEL 25 * @return BOOL 打开成功&失败 26 */ 27 bool OpenFile(const char* filePath, bool type); 28 29 30 /** 31 * @brief 关闭Excel 32 */ 33 void CloseExcel(); 34 35 36 /** 37 * @brief 保存Excel 38 */ 39 void Save(const char* savePath); 40 41 42 /** 43 * @brief 获取所有的工作表数量 44 * @return int 数量 45 */ 46 int GetSheetCount(); 47 48 49 /** 50 * @brief 获取单元格数据 51 * @param[in] row 行 52 * @param[in] column 列 53 * @return string 内容 54 */ 55 string GetRangeData(const int row, const int column); 56 57 58 /** 59 * @brief 读取整个sheet 60 * @return string 内容 61 */ 62 vector<string> GetUsedRange(); 63 64 65 /** 66 * @brief 读取sheet中的一个范围 67 * @return string 内容 68 */ 69 vector<string> GetScopeRange(const char* A1, const char* A5); 70 71 72 /** 73 * @brief 当前sheet单元格写入内容 74 * @param[in] row 行 75 * @param[in] column 列 76 * @param[in] Data 内容 77 */ 78 void SetRangeData(const int row, const int column, const char* Data); 79 80 81 /** 82 * @brief 获得当前sheet使用的行数 83 * @return int 数量 84 */ 85 int GetRowNum(); 86 87 88 /** 89 * @brief 获得当前sheet使用的列数 90 * @return int 数量 91 */ 92 int GetColumnNum(); 93 94 95 /** 96 * @brief 设置当前工作表 97 * @param[in] id 第几个sheet,从1开始 98 * @return BOOL 设置成功&失败 99 */ 100 bool SetCurrentSheetByNum(const int& id); 101 102 103 104 private: 105 106 //Excel应用程序 107 QAxObject *ExcelApp; 108 //Excel工作簿 109 QAxObject *ExcelBooks; 110 QAxObject *ExcelBook; 111 //Excel工作表 112 QAxObject *ExcelSheets; 113 QAxObject *ExcelSheet; 114 //Excel单元格 115 QAxObject *ExcelRange; 116 117 };
qtExcelApi.cpp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "qtExcelApi.h" 2 3 4 qtExcelApi::qtExcelApi(void) 5 { 6 7 } 8 9 qtExcelApi::~qtExcelApi() 10 { 11 } 12 13 14 //打开Excel 15 void qtExcelApi::CreateExcel() 16 { 17 //连接excel 18 ExcelApp = new QAxObject("Excel.Application"); 19 //是否可视化excel 20 ExcelApp->dynamicCall("SetVisible(bool Visible)", true); 21 //是否弹出警告窗口 22 ExcelApp->setProperty("DisplayAlerts", false); 23 //获取工作簿集合 24 ExcelBooks = ExcelApp->querySubObject("WorkBooks"); 25 //新建一个工作簿 26 ExcelBooks->dynamicCall("Add"); 27 //获取当前工作簿 28 ExcelBook = ExcelApp->querySubObject("ActiveWorkBook"); 29 //获取工作表格集合 30 ExcelSheets = ExcelBook->querySubObject("Sheets"); 31 //获取当前工作表格1,即sheet1 32 ExcelSheet = ExcelSheets->querySubObject("Item(int)", 1); 33 } 34 35 36 //打开Excel 37 bool qtExcelApi::OpenFile(const char* filePath, bool type) 38 { 39 //连接excel 40 ExcelApp = new QAxObject("Excel.Application"); 41 //是否可视化excel 42 ExcelApp->dynamicCall("SetVisible(bool Visible)", type); 43 //是否弹出警告窗口 44 ExcelApp->setProperty("DisplayAlerts", false); 45 //获取工作簿集合 46 ExcelBooks = ExcelApp->querySubObject("WorkBooks"); 47 //打开一个工作簿 48 ExcelBooks->dynamicCall("Open(const QString&)", QDir::toNativeSeparators(filePath)); 49 //获取当前工作簿 50 ExcelBook = ExcelApp->querySubObject("ActiveWorkBook"); 51 //获取工作表格集合 52 ExcelSheets = ExcelBook->querySubObject("Sheets"); 53 //获取当前工作表格1,即sheet1 54 ExcelSheet = ExcelSheets->querySubObject("Item(int)", 1); 55 return true; 56 } 57 58 59 //关闭Excel 60 void qtExcelApi::CloseExcel() 61 { 62 if (ExcelApp != NULL) 63 { 64 ExcelApp->dynamicCall("Quit()"); 65 delete ExcelApp; 66 ExcelApp = NULL; 67 } 68 } 69 70 71 //保存Excel 72 void qtExcelApi::Save(const char* savePath) 73 { 74 ExcelBook->dynamicCall("SaveAs(const QString &)", QDir::toNativeSeparators(savePath)); 75 } 76 77 78 //获取单元格数据 79 string qtExcelApi::GetRangeData(const int row, const int column) 80 { 81 QVariant ret; 82 QByteArray cdata; 83 if (this->ExcelSheet != NULL && !this->ExcelSheet->isNull()) 84 { 85 QAxObject* range = this->ExcelSheet->querySubObject("Cells(int, int)", row, column); 86 ret = range->dynamicCall("Value()"); 87 QString qs = ret.toString(); 88 cdata = qs.toLocal8Bit(); 89 delete range; 90 } 91 return string(cdata);; 92 } 93 94 95 //读取整个sheet 96 vector<string> qtExcelApi::GetUsedRange() 97 { 98 //读取当前工作表所有数据 99 QAxObject *usedRange = ExcelSheet->querySubObject("UsedRange"); 100 QVariant var = usedRange->dynamicCall("Value()"); 101 QVariantList varRows = var.toList(); 102 const int rowCount = varRows.size(); 103 QVariantList rowData; 104 QByteArray cdata; 105 vector<string> vecUsedRange; 106 for (int i = 0; i < rowCount; ++i) 107 { 108 rowData = varRows[i].toList(); 109 QString qs = rowData[0].toString(); 110 cdata = qs.toLocal8Bit(); 111 vecUsedRange.push_back(string(cdata)); 112 } 113 delete usedRange; 114 return vecUsedRange; 115 } 116 117 118 //读取sheet中的一个范围 119 vector<string> qtExcelApi::GetScopeRange(const char* A1, const char* A5) 120 { 121 QVariantList params; 122 params << A1 << A5; //A1至A5的数据 123 //读取当前工作表所有数据 124 QAxObject *cell = ExcelSheet->querySubObject("Range(QVariant,QVariant)", params); 125 QVariant var = cell->dynamicCall("Value2()"); 126 QVariantList varRows = var.toList(); 127 const int rowCount = varRows.size(); 128 QVariantList rowData; 129 QByteArray cdata; 130 vector<string> vecUsedRange; 131 for (int i = 0; i < rowCount; ++i) 132 { 133 rowData = varRows[i].toList(); 134 QString qs = rowData[0].toString(); 135 cdata = qs.toLocal8Bit(); 136 vecUsedRange.push_back(string(cdata)); 137 } 138 delete cell; 139 return vecUsedRange; 140 } 141 142 143 //当前sheet单元格写入内容 144 void qtExcelApi::SetRangeData(const int row, const int column, const char* Data) 145 { 146 QAxObject *cell = ExcelSheet->querySubObject("Cells(int,int)", row, column); 147 cell->setProperty("Value", Data); 148 } 149 150 151 //获取所有的工作表数量 152 int qtExcelApi::GetSheetCount() 153 { 154 int intCount = ExcelSheets->property("Count").toInt(); 155 return intCount; 156 } 157 158 159 //获得当前sheet使用的行数 160 int qtExcelApi::GetRowNum() 161 { 162 QAxObject *usedRange = ExcelSheet->querySubObject("UsedRange"); 163 QAxObject *rows = usedRange->querySubObject("Rows"); 164 int nRows = rows->property("Count").toInt(); 165 return nRows; 166 } 167 168 169 //获得当前sheet使用的列数 170 int qtExcelApi::GetColumnNum() 171 { 172 QAxObject *usedRange = ExcelSheet->querySubObject("UsedRange"); 173 QAxObject *columns = usedRange->querySubObject("Columns"); 174 int nCols = columns->property("Count").toInt(); 175 return nCols; 176 } 177 178 179 //设置当前工作表 180 bool qtExcelApi::SetCurrentSheetByNum(const int& id) 181 { 182 ExcelSheet = ExcelBook->querySubObject("Worksheets(int)", 2); 183 return true; 184 }