关于Microsoft DataGrid Control数据的打印 在单文档中Microsoft ADO Data Control与Microsoft DataGrid Control关联,就可以从数据库中取到想要打印的数据,请问如何将生成的数据打印或者生成*.xls或者*.csv文件!!如果你不吝赐教,并且问题解决,最少给你200分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 生成 .xls 和 .csv是很容易的,用Microsoft DataGrid Control打印,我没有做过。用CListCtrl 打印,我做过。给你一段代码做参考,如果生成.CSV则不用使用OLE,直接写文本即可。tabtpl.tpl是一个xls格式的文件,我把后缀名改了,实际上是把它当作模板,我在里边设置好了字体,字号,行距等参数,生成表格的时候就自动套用它的格式了。BOOL CAlloltCalCuPage3::ExportCsvFile(LPCTSTR lzFileName){ CAlloltCalCuSheet * psheet = (CAlloltCalCuSheet*) GetParent(); CListCtrl &cList = psheet->m_Page2.GetListCtrl(); if(!cList.GetSafeHwnd()) return FALSE; int i,j,m_iColCount,m_iLineCount; CHeaderCtrl *pHeadCtlr = (CHeaderCtrl *)cList.GetDlgItem(0); m_iColCount = pHeadCtlr->GetItemCount(); m_iLineCount = cList.GetItemCount(); ////////////////////////////////////////////////////////////////////////// _Application ExcelApp; Workbooks wbsMyBooks; _Workbook wbMyBook; Worksheets wssMysheets; _Worksheet wsMysheet; Range rgMyRge; //创建Excel 2000服务器(启动Excel) COleVariant vTrue((short)TRUE), vFalse((short)FALSE), vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); CString tplFile = SYSTEM_PATH; tplFile += "\\tabtpl.tpl"; if(!gFileExist(tplFile)) { tplFile = "缺少导入文件:"+tplFile; AfxMessageBox(tplFile,MB_ICONHAND); return FALSE; } if (!ExcelApp.CreateDispatch("Excel.Application") ) { AfxMessageBox("创建Excel服务失败!"); return FALSE; } wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true); wbMyBook.AttachDispatch(wbsMyBooks.Open((LPCTSTR)tplFile,vOptional, vOptional,vOptional,vOptional,vOptional,vOptional,vOptional, vOptional,vOptional,vOptional,vOptional,vOptional)); //得到Worksheets wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true); //得到sheet1 wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true); //得到全部Cells,此时,rgMyRge是cells的集合 rgMyRge.AttachDispatch(wsMysheet.GetCells(),true); ////////////////////////////////////////////////////////////////////////////------------------------------------------------------------------------ HDITEM hdi; TCHAR lpBuffer[256]; hdi.mask = HDI_TEXT; hdi.pszText = lpBuffer; hdi.cchTextMax = 256; CString str; int row=0,col=0;//------------------------------------------------------------------------ //设置1行1列的单元的值 for (i=0;i < m_iColCount;i++) { pHeadCtlr->GetItem(i, &hdi); col = i+1; rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)col),_variant_t(hdi.pszText)); } for(i= 0;i<m_iLineCount;i++) { for(j=0;j<m_iColCount;j++) { str = cList.GetItemText(i,j); row = i+2; col = j+1; rgMyRge.SetItem(_variant_t((long)row),_variant_t((long)col),_variant_t((LPCTSTR)str)); } } ////////////////////////////////////////////////////////////////////////// wbMyBook.SaveAs(_variant_t(lzFileName),vOptional,vOptional, vOptional,vOptional,vOptional,2,vOptional,vOptional, vOptional,vOptional); rgMyRge.ReleaseDispatch(); wsMysheet.ReleaseDispatch(); wssMysheets.ReleaseDispatch(); wbMyBook.ReleaseDispatch(); wbsMyBooks.ReleaseDispatch(); ExcelApp.ReleaseDispatch(); wbMyBook.Close(vFalse,vOptional,vOptional); wbsMyBooks.Close(); ExcelApp.Quit(); return TRUE; } 可以使用MFC GridCtrl代替MS DataGridGridCtrl 在www.codeproject.com中找到,很多中文网站也可以找到这个类支持直接打印,当然,它不能使用绑定的方法从数据库中读数不过还是在www.codeproject.com中有人用它派生了一个新类,支持绑定,郁闷的是类名也叫CDataGrid,跟MS DataGird的类名冲突。如果要用MS DataGrid,把数据导到Excel打印也是一个好办法,而且还是比较方便的,不过最好使用动态绑定的办法:m_DataGrid.SetRefDatasource(NULL);m_DataGrid.SetRefDatasource((LPUNKNOWN)m_pRecordset);m_DataGrid.Refresh();这样,要导数据到EXCEL,就可以直接用m_pRecordset了具体可以参考www.vckbase.com上的一个例子ADOSource vfw 视频压缩 vc 数据库 获取表中记录的内容 怎样用ftp获取FTP服务器上的文件修改日期 !? 如何在IE中嵌入TOOLBAR ,求高手专家请教(高分) 我怎么才能实现以下的功能? CHtmlView可以打开“虚拟”文件吗? 关于不依附任何窗口的线程使用Timer的问题 关于两个很单的问题? 请问各位大虾,我用写了一程序,所建的工具栏上的文本为什么只显示一部分,请问是什么原因? 高分求 Devpartner 6.5 的注册码 在某项目里建立了一个类后,(在菜单栏里插入类,还没有加代码),双击系统创建的类,有如下代码: 请问能不能把热键写到钩子里面?怎么写?用MFC。谢谢!
{
CAlloltCalCuSheet * psheet = (CAlloltCalCuSheet*) GetParent();
CListCtrl &cList = psheet->m_Page2.GetListCtrl();
if(!cList.GetSafeHwnd())
return FALSE;
int i,j,m_iColCount,m_iLineCount;
CHeaderCtrl *pHeadCtlr = (CHeaderCtrl *)cList.GetDlgItem(0);
m_iColCount = pHeadCtlr->GetItemCount();
m_iLineCount = cList.GetItemCount();
//////////////////////////////////////////////////////////////////////////
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;
//创建Excel 2000服务器(启动Excel)
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CString tplFile = SYSTEM_PATH;
tplFile += "\\tabtpl.tpl";
if(!gFileExist(tplFile))
{
tplFile = "缺少导入文件:"+tplFile;
AfxMessageBox(tplFile,MB_ICONHAND);
return FALSE;
}
if (!ExcelApp.CreateDispatch("Excel.Application") )
{
AfxMessageBox("创建Excel服务失败!");
return FALSE;
}
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
wbMyBook.AttachDispatch(wbsMyBooks.Open((LPCTSTR)tplFile,vOptional,
vOptional,vOptional,vOptional,vOptional,vOptional,vOptional,
vOptional,vOptional,vOptional,vOptional,vOptional));
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
//得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true); //////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------
HDITEM hdi;
TCHAR lpBuffer[256];
hdi.mask = HDI_TEXT;
hdi.pszText = lpBuffer;
hdi.cchTextMax = 256;
CString str;
int row=0,col=0;
//------------------------------------------------------------------------
//设置1行1列的单元的值
for (i=0;i < m_iColCount;i++)
{
pHeadCtlr->GetItem(i, &hdi);
col = i+1; rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)col),_variant_t(hdi.pszText));
}
for(i= 0;i<m_iLineCount;i++)
{
for(j=0;j<m_iColCount;j++)
{
str = cList.GetItemText(i,j);
row = i+2;
col = j+1;
rgMyRge.SetItem(_variant_t((long)row),_variant_t((long)col),_variant_t((LPCTSTR)str));
}
}
//////////////////////////////////////////////////////////////////////////
wbMyBook.SaveAs(_variant_t(lzFileName),vOptional,vOptional,
vOptional,vOptional,vOptional,2,vOptional,vOptional,
vOptional,vOptional);
rgMyRge.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
wbMyBook.Close(vFalse,vOptional,vOptional);
wbsMyBooks.Close();
ExcelApp.Quit();
return TRUE;
}
GridCtrl 在www.codeproject.com中找到,很多中文网站也可以找到
这个类支持直接打印,当然,它不能使用绑定的方法从数据库中读数
不过还是在www.codeproject.com中有人用它派生了一个新类,支持
绑定,郁闷的是类名也叫CDataGrid,跟MS DataGird的类名冲突。
如果要用MS DataGrid,把数据导到Excel打印也是一个好办法
,而且还是比较方便的,不过最好使用动态绑定的办法:
m_DataGrid.SetRefDatasource(NULL);
m_DataGrid.SetRefDatasource((LPUNKNOWN)m_pRecordset);
m_DataGrid.Refresh();这样,要导数据到EXCEL,就可以直接用m_pRecordset了
具体可以参考www.vckbase.com上的一个例子ADOSource