在给企业开发的项目中,客户经常要求将 在给企业开发的项目中,客户经常要求将数据汇总显示并打印。站在程序员的立场上,简单数据的汇总打印可以采用VB自带报表,对复杂的数据用水晶报表或第三方打印控件。在企业中,汇总数据另一个目的是为了便于交流和共享资源,报表的格式通常固定,内容可以自己调整,他们对 Excel 和 Word 情有独钟。
刚完成的项目中,客户要求将汇总的数据以三种方式进行显示和打印:AutoCad、Excel 和 Word 文档中。前两种方式网上资源很多,对 Word 文档我找到例子不是很多。由于需要和 AutoCad 开发程序结合,不能将 Word 文档以 OLE 的方式 嵌入到程序中,文档只能在内存中形成,这将占用大量的CPU资源,另开一个线程进行处理,线程间以发送消息的方式进行通信。
首先在VC引入Word, 对格式相同的地方一定使用模版的方式进行处理,这可以大大的提高运行速度,Word中的模版为*.dot。加载模版的代码为:
sDocs=sApp.GetDocuments();
sDocs.AttachDispatch(sApp.GetDocuments(),true);
COleVariant vFalse((long)0),vTrue((long)1);
sDoc.AttachDispatch(sDocs.Add(COleVariant(_variant_t(strFileName)), vFalse,vFalse, vTrue));
需要注意的是,如果Word中使用到表格,VBA录制的全是Selection对象的处理方法,在VC中使用Selection对象的MoveUp和MoveDown函数时会出现不确定现象(如果你知道为什么的话请告诉我)。如果你需要绘制表格,不要用程序来动态形成,绘制表格的代码是很繁琐的,而且在页眉中绘制单元格是很难控制的。可以先在模版中绘出你要的表格格式,然后用程序复制单元格或者直接使用模版中的单元格。由于我做的项目表格的行数不确定,我采用的是复制单元格的方式(速度比较慢,谁有更好的方法?)。
vc中 怎样把word文档转换为二进制数据
word文档本来就是二进制的
所有文件都是以二进制存放在硬盘的,只是存放结构不一样而已
请高手帮忙解决一下,如何在VC中读取word文件的内容并进行处理。
vc6测试成功,写的有点乱你自己好好看看吧.
_Application app;
Documents docs;
_Document doc;
Tables WordTables;
Table WordTable;
Cell WordCell;
Range WordRange;
Columns WordCols;
Rows WordRows;
if(!app.CreateDispatch("Word.Application"))
{
MessageBox("创建Word服务失败!",_T("提示"),MB_ICONERROR);
return;
}
docs.AttachDispatch(app.GetDocuments());
app.SetVisible(true);
//打开文件
IDispatch *dispatch=docs.Open(&_variant_t(_T("d:\\test.doc")),&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing);
if(dispatch)
{
doc.AttachDispatch(dispatch);
}
else
{//出错了
CString szErr="";
szErr.Format("打开文件出错,请查看文件是否存在!");
::AfxMessageBox(szErr);
//退出程序,释放对象
app.Quit(&vtMissing,&vtMissing,&vtMissing);
docs.ReleaseDispatch();
app.ReleaseDispatch();
return;
}
dispatch=doc.GetTables();
if(dispatch)
{
WordTables.AttachDispatch(dispatch);
}
else
{//出错了
CString szErr="";
szErr.Format("取得表格集合出错!");
::AfxMessageBox(szErr);
//退出程序,释放对象
app.Quit(&vtMissing,&vtMissing,&vtMissing);
docs.ReleaseDispatch();
app.ReleaseDispatch();
doc.ReleaseDispatch();
return;
}
int nTableCount=WordTables.GetCount();
if(nTableCount>0)
{
for(int i=1;i<=nTableCount;i++)
{
WordTable.AttachDispatch(WordTables.Item(i));
WordCols.AttachDispatch(WordTable.GetColumns());
WordRows.AttachDispatch(WordTable.GetRows());
int nCols=WordCols.GetCount();
int nRows=WordRows.GetCount();
for(int j=1;j<=nRows;j++)
{
for(int k=1;k<=nCols;k++)
{
dispatch=WordTable.Cell(j,k);
WordRange.AttachDispatch(dispatch);
CString szText=WordRange.GetText();
this->MessageBox(szText);
}
}
}
}
app.Quit(&vtMissing,&vtMissing,&vtMissing);
doc.ReleaseDispatch();
docs.ReleaseDispatch();
app.ReleaseDispatch();
vc 拷贝数据到WORD或EXCEL
FILE *fp;
fp=fopen("X:\\File.xls","w");
按
fprintf(wfp,"%s\t%s\t",v1,v2v...);
fclose(fp);
这种格式写入文本,就是Excel了.
使用VC编程操作Word的时候,有些参数不知道意思怎么办?
你可以把操作录制到宏里面,然后编辑宏,里面有这个操作相关的代码作为参考。
关于如何用VC读取word表格的问题
我现在是在做利用VC 实现WORD表格与ACCESS数据库相互转换的系统 ,在读取WORD表格数据,并转换到ACCES出了问题,怎么样读取WORD文档的表格数据?
我只能写出读取WORD文本的程序 但是肯定不行的 请大家帮忙改正下 我需要读取表格数据,对应到ACCESS里面 我有 m_strId, m_strName, m_nScore
void CDb005Dlg::OnButtonRead()
{
// TODO: Add your control notification handler code here
CLSID clsid;
HRESULT hr;
hr = CLSIDFromProgID(L"Word.Application",&clsid);
if(FAILED(hr))
{
AfxMessageBox(_T("您没有安装OFFICE"));
return;
}
IUnknown *pUnknown=NULL;
IDispatch *pDispatch=NULL;
_Application app=NULL;
hr = GetActiveObject(clsid, NULL, &pUnknown);
if(FAILED(hr))
{
AfxMessageBox(_T("没有正在运行中的MS WORD"));
return;
}
hr = pUnknown->QueryInterface(IID_IDispatch, (LPVOID *)&app);
if(FAILED(hr))
{
pUnknown->Release();
AfxMessageBox(_T("没有取得Application"));
return;
}
pUnknown->Release();
pUnknown = NULL;
Selection Sel = app.GetSelection();
if(!Sel)
{
Sel.ReleaseDispatch();
AfxMessageBox(_T("没有正在编辑的MS WORD"));
return;
}
Sel.WholeStory(); //全部选择
CString str = Sel.GetText(); //取得文本
m_strReada = str; //显示到编辑窗中
UpdateData(FALSE);
Sel.ReleaseDispatch();
app.ReleaseDispatch();
///////
if(m_nOperate == 1) //增加
{
UpdateData(TRUE);
if(m_strId.IsEmpty())
{
AfxMessageBox(_T("学生学号不能为空."));
return;
}
if(m_strName.IsEmpty())
{
AfxMessageBox(_T("学生姓名不能为空."));
return;
}
CString strSql;
strSql.Format(_T("Insert into StudentInfo values('%s','%s',%d)"), m_strId, m_strName, m_nScore);
try
{
m_pConnection->Execute(_bstr_t(strSql), 0, adCmdText);
}
catch(_com_error e)
{
AfxMessageBox(_T("增加记录失败!"));
}
AfxMessageBox(_T("增加记录成功!"));
FreshList();
}
VC下操作word,按指定格式把替换文本。
word里面录制宏看下,然后用对应的ole方法操作
Selection.Font.Bold = wdToggle
Selection.Font.UnderlineColor = wdColorAutomatic
Selection.Font.Underline = wdUnderlineSingle
如果你引用了Office的lib,可以直接使用这些枚举,如果用的自动化接口,可以查下这些枚举对应的值,直接给属性赋值也可以
谢谢你的回答 你说的这个方法是试过了 行不通 运用CFind里的Excute方法替换文本只能按照原先文本的格式进行替换,它不能把替换后的文本改为你想要的自定义格式。关于这个问题,经过我和同学的讨论,昨天已经解决了。谢谢。
来自:求助得到的回答转载请注明出处51数据库 » vcword数据 在VC中如何将数据导入Word中