当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

C++中将DBGrid中的数据导出到Word和Excel

    初版发布

    //---------------------------------------------------------------------------
    // 将DBGrid中的数据导出到Word文档
    // v0.1 by ccrun(老妖) 2005.10.13 1:40
    //---------------------------------------------------------------------------
    void __fastcall DBGrid2Word(TDBGrid *dbg, String strDocFile)
    {
        if(!dbg->DataSource->DataSet->Active) // 数据集没有打开就返回
            return;
        Variant vWordApp, vTable, vCell;
        try
        {
            vWordApp = Variant::CreateObject("Word.Application");
        }
        catch(...)
        {
            MessageBox(0, "启动 Word 出错, 可能是没有安装Word.",
                    "DBGrid2Word", MB_OK  MB_ICONERROR);
            vWordApp = Unassigned;
            return;
        }
        // 隐藏Word界面
        vWordApp.OlePropertySet("Visible", false);
        // 新建一个文档
        vWordApp.OlePropertyGet("Documents").OleFunction("Add");
        //
        Variant vSelect = vWordApp.OlePropertyGet("Selection");
        // 设置一下字体,大小
        vSelect.OlePropertyGet("Font").OlePropertySet("Size", dbg->Font->Size);
        vSelect.OlePropertyGet("Font").OlePropertySet("Name", dbg->Font->Name.c_str());
        // 要插入表格的行数
        int nRowCount(dbg->DataSource->DataSet->RecordCount + 1);
        nRowCount = nRowCount < 2? 2: nRowCount;
        // 要插入表格的列数
        int nColCount(dbg->Columns->Count);
        nColCount = nColCount < 1? 1: nColCount;
        // 在Word文档中插入与DBGrid行数列数基本相同的一个表格
        vWordApp.OlePropertyGet("ActiveDocument").OlePropertyGet("Tables")
            .OleProcedure("Add",
            vSelect.OlePropertyGet("Range"),
            nRowCount, // 行数
            nColCount, // 列数
            1, // DefaultTableBehavior:=wdWord9TableBehavior
            0); // AutoFitBehavior:=wdAutoFitFixed
        // 操作这个表格
        vTable = vWordApp.OlePropertyGet("ActiveDocument").
            OleFunction("Range").OlePropertyGet("Tables").OleFunction("Item", 1);
        // 设置单元格的宽度
        for(int i=0; i<nColCount; i++)
        {
            int nColWidth = dbg->Columns->Items[i]->Width;
            vTable.OlePropertyGet("Columns").OleFunction("Item", i + 1)
                    .OlePropertySet("PreferredWidthType", 3); // wdPreferredWidthPoints
            vTable.OlePropertyGet("Columns").OleFunction("Item", i + 1)
                    .OlePropertySet("PreferredWidth", nColWidth);
        }
        //----------------------------------------------------------------------------
        // 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。
        // 作者:ccrun(老妖) [email protected]
        // 本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=635&d=g75jbn
        //----------------------------------------------------------------------------
        // 先将列名写入Word表格
        for(int j=0; j<dbg->Columns->Count; j++)
        {
            vCell = vTable.OleFunction("Cell", 1, j + 1);
            vCell.OlePropertySet("Range", dbg->Columns->Items[j]->FieldName.c_str());
            // 列名单元格背景颜色 // wdColorGray125
            vCell.OlePropertyGet("Shading")
                    .OlePropertySet("BackgroundPatternColor", 14737632);
        }
        // 将DBGrid中的数据写入Word表格
        dbg->DataSource->DataSet->First();
        for(int i=0; i<nRowCount; i++)
        {
            // 63 63 72 75 6E 2E 63 6F 6D
            for(int j=0; j<dbg->Columns->Count; j++)
            {
      &n

相关内容
赞助商链接