如何在c++中获取Excel单元格值
How to get Excel cell value in C++
如果有人知道如何从Excel::窗口指针到打开的Excel单元格的实际值,请让我知道。以下是任务条件:- Excel目前在一个窗口中运行,一个工作簿在一个工作表上-一些单元格有数据(为了简化,我们假设只有一个单元格[1,1]有数据,即"a")问题是如何发现只有一个单元格有数据,单元格是[1,1],数据是"a"。下面是一个代码片段:
int main( int argc, CHAR* argv[])
{
CoInitialize( NULL );
HWND excelWindow = FindWindow(L"XLMAIN", NULL);
EnumChildWindows(excelWindow, (WNDENUMPROC) EnumChildProc, (LPARAM)1);
return 0;
}
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM)
{
WCHAR szClassName[64];
if(GetClassNameW(hwnd, szClassName, 64))
{
if(_wcsicmp(szClassName, L"EXCEL7") == 0)
{
Excel::Window* pWindow = NULL;
HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_NATIVEOM, __uuidof(Excel::Window), (void**)&pWindow);
if(hr == S_OK)
{
// Here we need to answer the question using pWindow
pWindow->Release();
}
return false;
}
}
return true;
}
下面是最终使用的代码:
#include <windows.h>
#include <oleacc.h>
#import "C:Program Files (x86)Common Filesmicrosoft sharedOFFICE14MSO.DLL" no_implementation rename("RGB", "ExclRGB") rename("DocumentProperties", "ExclDocumentProperties") rename("SearchPath", "ExclSearchPath")
#import "C:Program Files (x86)Common Filesmicrosoft sharedVBAVBA6VBE6EXT.OLB" no_implementation
#import "C:Program Files (x86)Microsoft OfficeOffice14EXCEL.EXE" rename("DialogBox", "ExclDialogBox") rename("RGB", "ExclRGB") rename("CopyFile", "ExclCopyFile") rename("ReplaceText", "ExclReplaceText")
#include <string>
using std::string;
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM)
{
WCHAR szClassName[64];
if(GetClassNameW(hwnd, szClassName, 64))
{
if(_wcsicmp(szClassName, L"EXCEL7") == 0)
{
//Get AccessibleObject
Excel::Window* pWindow = NULL;
IDispatch* pXlSheet = NULL;
HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_NATIVEOM, __uuidof(Excel::Window), (void**)&pWindow);
if(hr == S_OK)
{
try {
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pWindow, L"ActiveSheet", 0);
pXlSheet = result.pdispVal;
_variant_t sheetName;
VariantInit(&sheetName);
if ((pXlSheet != NULL) && (pXlSheet != (IDispatch*)0xCCCCCCCC))
AutoWrap(DISPATCH_PROPERTYGET, &sheetName, pXlSheet, L"Name", 0);
// get cell which you need
string location = "C5";
location += ":" + location; // cell is a range with the same start/end cells
OLECHAR *sOleText=new OLECHAR[location.length()+1];
mbstowcs(sOleText,location.c_str(),location.length()+1);
IDispatch *pXlRange; // Get Range from Sheet
VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = ::SysAllocString(sOleText);
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
VariantClear(&parm);
pXlRange = result.pdispVal;
Excel::RangePtr cell = pXlRange;
Excel::CharactersPtr ptr = cell->Characters;
_bstr_t text = ptr->Text; // here is needed text
} catch (...) { }
}
return false; // Stops enumerating through children
}
}
return true;
}
void main( int argc, CHAR* argv[])
{
CoInitialize(NULL);
HWND excelWindow = FindWindow(L"XLMAIN", NULL);
EnumChildWindows(excelWindow, (WNDENUMPROC) EnumChildProc, (LPARAM)1);
CoUninitialize();
}
AutoWrap()函数取自http://support.microsoft.com/kb/216686/en-us?fr=1,而初始示例取自http://www.northatlantawebdesign.com/index.php/2009/07/15/access-microsoft-excel-2007-com-api-through-microsoft-active-accessibility/感谢所有帮助过我的人。
丹尼尔,
我相信你正在使用Excel COM来访问它。我从来没有使用c++做过这个,但我想它应该和c#没有太大的不同。最困难的任务应该是导入必要的库。但我相信你已经这样做了。
你应该这样写:
int full_cells = 0;
Excel::_Worksheet worksheet = pWindow->ActiveSheet;
for(int j = 1; j < worksheet.Columns.Count; j++)
{
for (int i = 1; i < worksheet.Rows.Count; i++)
{
if(worksheet.Cells[i][j].Value != "")
{
full_cells++;
cout << worksheet.Cells[i][j].Value;
}
}
}
请注意,我还没有测试这段代码。我只是给你们展示它应该是什么样子。您应该在这里阅读文档:http://msdn.microsoft.com/en-us/library/ms262200.aspx并正确使用它。
希望能有所帮助。
相关文章:
- 将QIcon添加到QTableView单元格
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 查找矩阵中单元格的相邻元素
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 当我使用需要计算数组单元格地址的模板时,奇怪的C++行为
- PyQT - 在 QTableWidget 单元格中显示垂直文本
- 2D 数组,某些单元格保存特定数据
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- CLI/C++dataGridView示例-设置comobox单元格列表的索引
- 如何使用C++从 Excel 文档中写入、编辑和检索特定单元格
- 使用C++从 Excel 文档中复制特定单元格
- Qt ActiveX QAxObject格式Excel单元格注释
- 如何在excel-Qt中查找单元格的范围
- 如何使用Qt将颜色应用于excel单元格
- 如何在c++中获取Excel单元格值
- 我不希望我的 Excel 加载项返回数组(相反,我需要 UDF 来更改其他单元格)
- 从c++在Excel中写入单元格-没有写入值,单元格是空白的
- 如何以编程方式将CSV文本粘贴到Excel中,而不仅仅是粘贴到一个单元格中?(C++)
- 获取excel单元格的像素大小
- c++ Excel OLE 自动化。设置整个单元格区域'at once'的值