在单文档中Microsoft ADO Data Control与Microsoft DataGrid Control关联,就可以从数据库中取到想要打印的数据,请问如何将生成的数据打印或者生成*.xls或者*.csv文件!!如果你不吝赐教,并且问题解决,最少给你200分

解决方案 »

  1.   

    生成 .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;


    }
      

  2.   

    可以使用MFC GridCtrl代替MS DataGrid
    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