大一的程序设计老师,也是我们的班主任,一直想让我们知道C/C++究竟能做些什么,曾经花整整1节课的时间教我们如何找一个问题的解决方案。他告诉我们,要懂得google。不过,对于习惯了baidu的我,一时间总是改不过来。但是,经过这段时间,确实知道了虽然偶尔连不上服务器的google确实比baidu好。
大一下学期有各种各样的物理实验,数据多,而且不能凑整,公式也很繁,于是,决定用C++来处理这些数据。一开始是用txt文件处理,但是不够直观,于是,想起我们班主任第一天给我们演示“C语言能做什么”时用C操作excel,于是,自个儿也来尝试下。
网上教程很多,但是大部分都是用MFC还是什么的,太麻烦。后来,不知道哪里冒出了一个关键词com组件,深搜之,最后得到了这个:
http://www.technical-recipes.com/2012/how-to-interface-with-excel-in-c/
整体还是不难懂的,毕竟学了10几年的英语= =。
#include <iostream>
#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\OFFICE15\\MSO.DLL" \
rename("RGB", "MSORGB")
using namespace Office;
#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\VBA\\VBA6\\VBE6EXT.OLB"
using namespace VBIDE;
#import "D:\\Microsoft Office\\Office15\\EXCEL.EXE" \
rename("DialogBox", "ExcelDialogBox") \
rename("RGB", "ExcelRGB") \
rename("CopyFile", "ExcelCopyFile") \
rename("ReplaceText", "ExcelReplaceText") \
exclude("IFont", "IPicture") no_dual_interfaces
using namespace std;
int main()
{
HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hr))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hr << endl;
return hr;
}
// Create Excel Application Object pointer 创建一个Excel文件指针
Excel::_ApplicationPtr pXL;
if (FAILED(pXL.CreateInstance("Excel.Application")))
{
cout << "Failed to initialize Excel::_Application!" << endl;
return 0;
}
// Open the Excel Workbook, but don't make it visible 打开一个工作页
pXL->Workbooks->Open(L"111.xls");
pXL->Visible = true; //如果为true,可以看到程序执行的过程,类似于我们手工操作,false就是它后台自己执行
// Access Excel Worksheet and return pointer to Worksheet cells
Excel::_WorksheetPtr pWksheet = pXL->ActiveSheet;
Excel::RangePtr pRange = pWksheet->Cells;
// Read an Excel data cell. (Note Excel cells start from index = 1)
double value = pRange->Item[1][1];
// Write/modify Excel data cells + save. (reopen xls file to verify)
pRange->Item[1][1] = 5.4321;
pRange->Item[1][2] = 1.1211;
pWksheet->SaveAs("112.xls");
// Exit the Excel Com object
pXL->Quit();
return 0;
}
虽然有很多自己不知道的东西,但是不影响我们使用这个技能,期间被有几句的最后的‘\’弄的快奔溃了,经过无数次尝试才知道它做换行符的时候后面必须什么都没有,包括空格,最后才成功了。
但是也有很多问题,比如说如果double value = pRange->Item[1][1],而那个单元格如果不是一个浮点数,那么程序就会报错,然后只能在任务管理器关掉excel了,暂时不知道怎么解决。