提问:如何使用VC通过MSExcel::SheetsPtr Add方法实现在当前表插入一个模版文件

tomyi 2012-07-26 09:24:11
在Excel2007里,可以在当前workbook上插入一个自定义的模版文件作为新的Sheet表

VBA实现:
' 将模版文件Test.xltm作为新的sheet表插入
Sheets.Add Type:="d:\Test.xltm"

但在VC中,通过智能指针调用,始终不成功,
try
{

m_pAppExcel->DisplayAlerts[0] = VARIANT_FALSE;

MSExcel::_WorksheetPtr pSheet = m_pAppExcel->ActiveSheet ;
pSheet->Delete ();

// 加载模版
strFileName = _T("D:\\Test.xml");
_bstr_t bstrFile(strFileName);
_variant_t vtXTL = bstrFile;

MSExcel::_WorkbookPtr pBook = m_pAppExcel->ActiveWorkbook;


MSExcel::SheetsPtr pSheets = pBook->GetWorksheets() ;

pSheet = pSheets->GetItem((short)1);

VARIANT varSheet;
varSheet.vt = VT_DISPATCH;
varSheet.pdispVal = pSheet;

_variant_t vtNull;
// 在最前面插入一个空Sheet表,调用成功
// pSheets->Add (varSheet ,vtMissing ,_variant_t((short)1),XlSheetType::xlWorksheet);

// 在当前位置插入一个空Sheet表,调用成功
// pSheets->Add (vtMissing ,vtMissing ,_variant_t((short)1),XlSheetType::xlWorksheet);

// 插入模版文件,插入失败
pSheets->Add (vtMissing ,vtMissing ,vtMissing,vtXTL);

m_pAppExcel->DisplayAlerts[0] = VARIANT_TRUE;

return TRUE;
}
catch(_com_error &e)
{
CString strErr = CADO::GetCOMError (e);
::MessageBox(NULL, strErr, _T("LoadXTLtoSheet - _com_error"), MB_SETFOREGROUND | MB_OK);

/*
_bstr_t bstrDescribe(e.Description());
CString strTmp = bstrDescribe;

CString strTip;

strTip = _T("严重错误。CXlOper::LoadXTLtoSheet() 错误:") + strTmp;
//*/
}
catch(...)
{
CString strTip;
strTip = _T("严重错误。CXlOper::LoadXTLtoSheet() 错误:未知错误") ;
}
return FALSE;
}


捕获异常是:0x800a03ec,网上查了一下,说是不支持。

当是把VBA的代码作为在VC中通过宏调用,确实是可以到达目的。
只是注意的问题是:不能在多线程中调用
Sub LoadXLT(a As Variant)

MsgBox "Hi" & a
' Exit Sub

On Error Resume Next

Application.ScreenUpdating = False
Application.EnableEvents = False

Application.DisplayAlerts = False

Sheets("SP").Visible = xlSheetVisible
Sheets("SP").Delete

' Sheets.Add Type:="d:\Test模版.XML"
Sheets.Add Type:="d:\Test模版.xltm"

Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.EnableEvents = True


End Sub

在Excel帮助中,说明如下:
Excel 开发人员参考
Sheets.Add 方法
新建工作表、图表或宏表。新建的工作表将成为活动工作表。
语法

表达式.Add(Before, After, Count, Type)

表达式 一个代表 Sheets 对象的变量。

参数

名称 必选/可选 数据类型 描述
Before 可选 Variant 指定工作表的对象,新建的工作表将置于此工作表之前。
After 可选 Variant 指定工作表的对象,新建的工作表将置于此工作表之后。
Count 可选 Variant 要添加的工作表数。默认值为 1。
Type 可选 Variant 指定工作表类型。可以为下列 XlSheetType 常量之一:xlWorksheet、xlChart、xlExcel4MacroSheet 或 xlExcel4IntlMacroSheet。如果基于现有模板插入工作表,则指定该模板的路径。默认值为 xlWorksheet。


请问:在VC中如何实现通过MSExcel::SheetsPtr Add方法实现在当前表插入一个模版文件?
...全文
206 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bullcat2 2014-06-07
  • 打赏
  • 举报
回复
其实你最上面的代码就是一句用的不对 MSExcel::SheetsPtr pSheets = pBook->GetWorksheets() ; 应该写成 MSExcel::SheetsPtr pSheets = pBook->GetSheets() ; 我与你遇到了相同的问题,如果是在excel 2003就是对的,但在2010就不对了。
bullcat2 2014-06-07
  • 打赏
  • 举报
回复
你的这篇文章真的对我们太有帮助了
tomyi 2012-07-31
  • 打赏
  • 举报
回复
在微软社区的提示下Learning and Learning,问题找到了。

MSExcel::_WorksheetPtr 是不行的,需要用MSExcel::SheetsPtr

即:
pBook->GetSheets()->Add (vtMissing,vtMissing,vtMissing,vtXTL); 就可以了


m_pAppExcel->Sheets ->Add (vtMissing,vtMissing,vtMissing,vtXTL);

摘要:当用户需要对报需要重新编辑的时候,用Excel或者Word生成报就会比XML或者HTML的方式更加合理。但是由于Word的组件在使用时候要导入很多类,如果直接加在工程中会使其看上去很乱,所以封装到DLL中是个不错的主意。本文在前人经验指导下对一些常用的操作做了简单的封装,功能由从DLL中导出类CWordOperate提供。 关键字:Word2003,MFC扩展DLL,报,CWordOperate 一、 鉴于www.vckbase.com中已经有文章对vc使用word生成报方式做详细的论述,这里不准备对此赘述。仅仅介绍封装类CWordOperate中的函数和DLL的使用。#include "msword.h"class AFX_EXT_CLASS CWordOperate {public: CWordOperate(); virtual ~CWordOperate(); BOOL CreateWordApp(BOOL bShow); // 创建一个word应用程序 void DeleteApp(); // 用后,删除 void ShowApp(BOOL bShow); // 显示,或者隐藏 void QuitApp(); // 关闭外部打开的word应用程序 BOOL NewDoc(CString tpName); // 根据模板创建文档 void SaveDoc(CString Filename); // 保存文档到文件路径 void TypeText(CString Text); // 在当前位置输入文字 void SetTextAlign(int val); // 设置文字对齐方式 void SetTextColor(COLORREF cr); // 设置文本颜色 void AddPic(CString FileName); // 在当前位置插入图片文件 void RunMacro(CString macroName); // 运行一个宏 void AddTable(int nRow, int nCol); // 加一个几行几列的格 void AddTable(int nRow, int nCol, int autoFit); // 加一个几行几列的格,列宽度自动 void SelectTable(int i); // 选择当前文档中的第i个格 void MoveToTableNext(int iTable); // 把选择区指向格后面 void SetCellText(int iTable, int iRow, int iCol, CString text); // 设置第i个格中的某行某列的文字 void SetTableTextVAlign(int iTable, int val); // 置第i个格中文字对齐方式 void SetColWidth(int iTable, int iCol, float width); // 设置列宽度 void SetRowHeight(int iTable, int iRow, float height); // 设置行高度 // 合并两个单元格之间的区域 void MergeCell(int iTable, int cell1Row, int cell1Col, int cell2Row, int cell2Col, CString text); // 设置单元格文本颜色 void SetCellTextColor(int iTable, int iRow, int iCol, COLORREF cr); // 设置单元格背景颜色 void SetCellColor(int iTable, int iRow, int iCol, COLORREF crCell); // 设置单元格边框的四周风格, void SetCellBorderStyle(int iTale, int iRow, int iCol, int sTop, int sLeft, int sBottom, int sRight); // 设置两个单元格之间的区域,边框的四周风格, void SetCellsBorderStyle(int iTable, int iRow1, int iCol1, int iRow2, int iCol2,int sTop, int sLeft, int sBottom, int sRight); // 设置两个单元格之间的区域,背景颜色 void SetCellsColor(int iTable, int iRow1, int iCol1, int iRow2, int iCol2, COLORREF crCell); CString ToString(); protected: _Application app; // 应用程序 Selection sel; // 用来存放获得的选择范围 _Document saveDoc; // 当前活动文档 COleVariant vTrue; // 常量TRUE COleVariant vFalse; COleVariant vOpt;};二、使用DLL中导出类的方法:#include "WordOperate.h"#pragma comment(lib, "wordDll.lib")在类中定义成员: CWordOperate wordFile;使用示例:// 创建文件 CString str;COLORREF crCell = RGB(240, 240, 240);char buffer[255];wordFile.CreateWordApp(TRUE);GetCurrentDirectory(254, buffer);strcat(buffer, "\\tp.doc");wordFile.NewDoc(buffer); // 使用wordFile.AddTable(8, 11);wordFile.SelectTable(1);wordFile.MergeCell(iTable, 1, 6, 1, 8, "频域数据");crCell = RGB(255, 0, 0);wordFile.SetCellColor(iTable, 3, 2, crCell);wordFile.MoveToTableNext(1);// 写文字wordFile.TypeText("二. 分析图:\r\n");// 插入图片GetCurrentDirectory(254, buffer);strcat(buffer, "\\chart.jpg");wordFile.AddPic(buffer);// 保存文件,删除对象GetCurrentDirectory(254, buffer);strcat(buffer, "\\测试报.doc");wordFile.SaveDoc(buffer);wordFile.DeleteApp();// 也可以在删除对象前先关闭程序wordFile.QuitApp();三、使用压缩包的测试程序,按钮二能提供的效果如下图:图一 Word报效果屏幕截图四、说明:开发环境为:vc6 + sp6 + xp_sdkWord版本:2003企业版压缩包说明:wordDll为库的代码,TestDll为使用示例,宏.txt是格式化段落的宏附加:如果想知道函数中使用的值应该为多少,可以在Word操作的时候录制宏,然后使用单步调试的方式得到想要的值。注:本着开源的精神,把这个使用过的类和大家分享,希望大家有用,如果有错误的地方,希望指正,谢谢

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧