BCB中如何将DBGrid的内容保存为EXCEL文件格式

时间:2022-01-21 11:51:49
通过查询语句把查询到的内容显示在DBGrid里,现在我想把DBGrid里的内容保存到EXCEL文件里,请问该怎么做呢?由于我是刚接触这个,网上一些资料调试不过,哪位能提供一个例子的,或者提示一下该如何做?

12 个解决方案

#2


我再把函数贴出来:
// 测试代码
DBGrid2Excel(DBGrid1, "C:\\ccrun\\123.xls");

void __fastcall DBGrid2Excel(TDBGrid *dbg, String strXlsFile)
{
    if(!dbg->DataSource->DataSet->Active) // 数据集没有打开就返回
        return;
    Variant vExcelApp, vSheet;
    try
    {
        vExcelApp = Variant::CreateObject("Excel.Application");
    }
    catch(...)
    {
        MessageBox(0, "启动 Excel 出错, 可能是没有安装Excel.",
                "DBGrid2Excel", MB_OK | MB_ICONERROR);
        return;
    }
    // 隐藏Excel界面
    vExcelApp.OlePropertySet("Visible", false);
    // 新建一个工作表
    vExcelApp.OlePropertyGet("Workbooks").OleFunction("Add", 1); // 工作表
    // 操作这个工作表
    vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook")
            .OlePropertyGet("Sheets", 1);
    // 设置Excel文档的字体
    vSheet.OleProcedure("Select");
    vSheet.OlePropertyGet("Cells").OleProcedure("Select");
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("Size", dbg->Font->Size);
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("Name", dbg->Font->Name.c_str());
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("FontStyle", "常规");
    vSheet.OlePropertyGet("Cells", 1, 1).OleProcedure("Select");
    // 表格的行数
    int nRowCount(dbg->DataSource->DataSet->RecordCount + 1);
    nRowCount = nRowCount < 2? 2: nRowCount;
    // 表格的列数
    int nColCount(dbg->Columns->Count);
    nColCount = nColCount < 1? 1: nColCount;
    // 设置单元格的宽度
    for(int i=0; i<nColCount; i++)
    {
        int nColWidth = dbg->Columns->Items[i]->Width;
        vExcelApp.OlePropertyGet("Columns", i + 1)
                .OlePropertySet("ColumnWidth", nColWidth / 7);
    }
    //----------------------------------------------------------------------------
    // 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。
    // 作者:ccrun(老妖) info@ccrun.com
    // 本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=635&d=g75jbn
    //----------------------------------------------------------------------------      
    // 先将列名写入Excel表格
    for(int j=0; j<dbg->Columns->Count; j++)
    {
        // 标题行的行高
        vExcelApp.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 20);
        //
        vSheet.OlePropertyGet("Cells", 1, j + 1)
                .OlePropertySet("Value",
                dbg->Columns->Items[j]->FieldName.c_str());
        // 设置列名单元格的背景色
        Variant vInter = vSheet.OlePropertyGet(
                "Cells", 1, j + 1).OlePropertyGet("Interior");
        vInter.OlePropertySet("ColorIndex", 15); // 灰色
        vInter.OlePropertySet("Pattern", 1); // xlSolid
        vInter.OlePropertySet("PatternColorIndex", -4105); // xlAutomatic
    }
    // 将DBGrid中的数据写入Excel表格
    dbg->DataSource->DataSet->First();
    for(int i=0; i<nRowCount; i++)
    {
        // 普通数据行的行高16
        vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);
        // 63 63 72 75 6E 2E 63 6F 6D
        for(int j=0; j<dbg->Columns->Count; j++)
        {
            vSheet.OlePropertyGet("Cells", i + 2, j + 1)
                .OlePropertySet("Value",
                dbg->DataSource->DataSet->FieldByName(
                dbg->Columns->Items[j]->FieldName)->AsString.c_str());
        }
        dbg->DataSource->DataSet->Next();
    }
    // 保存Excel文档并退出
    vExcelApp.OlePropertyGet("ActiveWorkbook")
            .OleFunction("SaveAs", strXlsFile.c_str());
    vExcelApp.OleFunction("Quit");
    vSheet = Unassigned;
    vExcelApp = Unassigned;
    // 工作结束
    MessageBox(0, "DBGrid2Excel 转换结束!",
            "DBGrid2Excel", MB_OK | MB_ICONINFORMATION);
}




#3


不过数据量大,很慢地

#4


在导出时,有一个字段是数字类型的,由于数字过大,有18位,导成EXCEL文件后,里面的字段以科学计算法表示,后四位都变成0,请问这个问题该如何解决,或者如何把该字段导出时设置为字符串(非数字类型)。

#5


谢谢上面各位的提示
            vSheet.OlePropertyGet("Cells", i + 2, j + 1) 
                .OlePropertySet("Value", 
                dbg->DataSource->DataSet->FieldByName( 
                dbg->Columns->Items[j]->FieldName)->AsString.c_str()); 
已经设置成了字符串了,怎么还会出现导出到EXCEL里变成数字值呢

#6


如何做可以选择保存路径?

#7


关注!

#8


使用Ole很难成功的

#9


能不能导出到txt文档内??

#10


// 将DBGrid中的数据导出到Excel文档
//---------------------------------------------------------------------------
void __fastcall TlogQueryfrm::DBGrid2Excel(TDBGrid *dbg, String strXlsFile)
{
    if(!dbg->DataSource->DataSet->Active) // 数据集没有打开就返回
        return;
    Variant vExcelApp, vSheet;
    try
    {
        vExcelApp = Variant::CreateObject("Excel.Application");
    }
    catch(Exception &E)
    {
        String e = E.ClassName();
        MessageBox(e.c_str(), "启动 Excel 出错, 可能是没有安装Excel.",
                "DBGrid2Excel", MB_OK  | MB_ICONERROR);
        return;
    }
    // 隐藏Excel界面
    vExcelApp.OlePropertySet("Visible", false);
    // 新建一个工作表
    vExcelApp.OlePropertyGet("Workbooks").OleFunction("Add", 1); //工作表
    // 操作这个工作表
    vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook")
            .OlePropertyGet("Sheets", 1);
    // 设置Excel文档的字体
    vSheet.OleProcedure("Select");
    vSheet.OlePropertyGet("Cells").OleProcedure("Select");
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("Size", dbg->Font->Size);
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("Name", dbg->Font->Name.c_str());
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("FontStyle", "常规");
    vSheet.OlePropertyGet("Cells", 1, 1).OleProcedure("Select");
    // 表格的行数
    int nRowCount(dbg->DataSource->DataSet->RecordCount + 1);
    nRowCount = nRowCount  < 2? 2: nRowCount;
    // 表格的列数
    int nColCount(dbg->Columns->Count);
    nColCount = nColCount  < 1? 1: nColCount;
    // 设置单元格的宽度
    for(int i=0; i <nColCount; i++)
    {
        int nColWidth = dbg->Columns->Items[i]->Width;
        vExcelApp.OlePropertyGet("Columns", i + 1)
                .OlePropertySet("ColumnWidth", nColWidth / 7);
    }

    // 先将列名写入Excel表格
    for(int j=0; j <dbg->Columns->Count; j++)
    {
        // 标题行的行高
        vExcelApp.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 20);
        //
        vSheet.OlePropertyGet("Cells", 1, j + 1)
                .OlePropertySet("Value",
                dbg->Columns->Items[j]->FieldName.c_str());
        // 设置列名单元格的背景色
        Variant vInter = vSheet.OlePropertyGet(
                "Cells", 1, j + 1).OlePropertyGet("Interior");
        vInter.OlePropertySet("ColorIndex", 15); // 灰色
        vInter.OlePropertySet("Pattern", 1); // xlSolid
        vInter.OlePropertySet("PatternColorIndex", -4105); // xlAutomatic
    }
    //将DBGrid中的数据写入Excel表格
    dbg->DataSource->DataSet->First();
    for(int i=0; i <nRowCount; i++)
    {
        // 普通数据行的行高16
        vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);
        // 63 63 72 75 6E 2E 63 6F 6D
        for(int j=0; j <dbg->Columns->Count; j++)
        {
            vSheet.OlePropertyGet("Cells", i + 2, j + 1)
                .OlePropertySet("Value",
                dbg->DataSource->DataSet->FieldByName(
                dbg->Columns->Items[j]->FieldName)->AsString.c_str());
        }
        dbg->DataSource->DataSet->Next();
    }
    // 保存Excel文档并退出
    vExcelApp.OlePropertyGet("ActiveWorkbook")
            .OleFunction("SaveAs", strXlsFile.c_str());
    vExcelApp.OleFunction("Quit");
    vSheet = Unassigned;
    vExcelApp = Unassigned;
    // 导出成功
    MessageBox(0, "导出成功!","DBGrid2Excel", MB_OK);
}

#11


可以用SaveDialog控件

   if(SaveDialog1->Execute())
   {

     AnsiString name;
    int len=SaveDialog1->FileName.Length();
     name=SaveDialog1->FileName.SubString(len-3,4);
    if(name.LowerCase()!=".xls")
    {
      name=SaveDialog1->FileName+".xls";
    }
    else
    {
      name=SaveDialog1->FileName;
    }

///调用上面的函数
     DBGrid2Excel(DBGrid1, name);


   }

#12


可以使用ehlib控件,使用比较简单,还可以轻易使用打印的功能.

#1


#2


我再把函数贴出来:
// 测试代码
DBGrid2Excel(DBGrid1, "C:\\ccrun\\123.xls");

void __fastcall DBGrid2Excel(TDBGrid *dbg, String strXlsFile)
{
    if(!dbg->DataSource->DataSet->Active) // 数据集没有打开就返回
        return;
    Variant vExcelApp, vSheet;
    try
    {
        vExcelApp = Variant::CreateObject("Excel.Application");
    }
    catch(...)
    {
        MessageBox(0, "启动 Excel 出错, 可能是没有安装Excel.",
                "DBGrid2Excel", MB_OK | MB_ICONERROR);
        return;
    }
    // 隐藏Excel界面
    vExcelApp.OlePropertySet("Visible", false);
    // 新建一个工作表
    vExcelApp.OlePropertyGet("Workbooks").OleFunction("Add", 1); // 工作表
    // 操作这个工作表
    vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook")
            .OlePropertyGet("Sheets", 1);
    // 设置Excel文档的字体
    vSheet.OleProcedure("Select");
    vSheet.OlePropertyGet("Cells").OleProcedure("Select");
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("Size", dbg->Font->Size);
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("Name", dbg->Font->Name.c_str());
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("FontStyle", "常规");
    vSheet.OlePropertyGet("Cells", 1, 1).OleProcedure("Select");
    // 表格的行数
    int nRowCount(dbg->DataSource->DataSet->RecordCount + 1);
    nRowCount = nRowCount < 2? 2: nRowCount;
    // 表格的列数
    int nColCount(dbg->Columns->Count);
    nColCount = nColCount < 1? 1: nColCount;
    // 设置单元格的宽度
    for(int i=0; i<nColCount; i++)
    {
        int nColWidth = dbg->Columns->Items[i]->Width;
        vExcelApp.OlePropertyGet("Columns", i + 1)
                .OlePropertySet("ColumnWidth", nColWidth / 7);
    }
    //----------------------------------------------------------------------------
    // 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。
    // 作者:ccrun(老妖) info@ccrun.com
    // 本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=635&d=g75jbn
    //----------------------------------------------------------------------------      
    // 先将列名写入Excel表格
    for(int j=0; j<dbg->Columns->Count; j++)
    {
        // 标题行的行高
        vExcelApp.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 20);
        //
        vSheet.OlePropertyGet("Cells", 1, j + 1)
                .OlePropertySet("Value",
                dbg->Columns->Items[j]->FieldName.c_str());
        // 设置列名单元格的背景色
        Variant vInter = vSheet.OlePropertyGet(
                "Cells", 1, j + 1).OlePropertyGet("Interior");
        vInter.OlePropertySet("ColorIndex", 15); // 灰色
        vInter.OlePropertySet("Pattern", 1); // xlSolid
        vInter.OlePropertySet("PatternColorIndex", -4105); // xlAutomatic
    }
    // 将DBGrid中的数据写入Excel表格
    dbg->DataSource->DataSet->First();
    for(int i=0; i<nRowCount; i++)
    {
        // 普通数据行的行高16
        vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);
        // 63 63 72 75 6E 2E 63 6F 6D
        for(int j=0; j<dbg->Columns->Count; j++)
        {
            vSheet.OlePropertyGet("Cells", i + 2, j + 1)
                .OlePropertySet("Value",
                dbg->DataSource->DataSet->FieldByName(
                dbg->Columns->Items[j]->FieldName)->AsString.c_str());
        }
        dbg->DataSource->DataSet->Next();
    }
    // 保存Excel文档并退出
    vExcelApp.OlePropertyGet("ActiveWorkbook")
            .OleFunction("SaveAs", strXlsFile.c_str());
    vExcelApp.OleFunction("Quit");
    vSheet = Unassigned;
    vExcelApp = Unassigned;
    // 工作结束
    MessageBox(0, "DBGrid2Excel 转换结束!",
            "DBGrid2Excel", MB_OK | MB_ICONINFORMATION);
}




#3


不过数据量大,很慢地

#4


在导出时,有一个字段是数字类型的,由于数字过大,有18位,导成EXCEL文件后,里面的字段以科学计算法表示,后四位都变成0,请问这个问题该如何解决,或者如何把该字段导出时设置为字符串(非数字类型)。

#5


谢谢上面各位的提示
            vSheet.OlePropertyGet("Cells", i + 2, j + 1) 
                .OlePropertySet("Value", 
                dbg->DataSource->DataSet->FieldByName( 
                dbg->Columns->Items[j]->FieldName)->AsString.c_str()); 
已经设置成了字符串了,怎么还会出现导出到EXCEL里变成数字值呢

#6


如何做可以选择保存路径?

#7


关注!

#8


使用Ole很难成功的

#9


能不能导出到txt文档内??

#10


// 将DBGrid中的数据导出到Excel文档
//---------------------------------------------------------------------------
void __fastcall TlogQueryfrm::DBGrid2Excel(TDBGrid *dbg, String strXlsFile)
{
    if(!dbg->DataSource->DataSet->Active) // 数据集没有打开就返回
        return;
    Variant vExcelApp, vSheet;
    try
    {
        vExcelApp = Variant::CreateObject("Excel.Application");
    }
    catch(Exception &E)
    {
        String e = E.ClassName();
        MessageBox(e.c_str(), "启动 Excel 出错, 可能是没有安装Excel.",
                "DBGrid2Excel", MB_OK  | MB_ICONERROR);
        return;
    }
    // 隐藏Excel界面
    vExcelApp.OlePropertySet("Visible", false);
    // 新建一个工作表
    vExcelApp.OlePropertyGet("Workbooks").OleFunction("Add", 1); //工作表
    // 操作这个工作表
    vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook")
            .OlePropertyGet("Sheets", 1);
    // 设置Excel文档的字体
    vSheet.OleProcedure("Select");
    vSheet.OlePropertyGet("Cells").OleProcedure("Select");
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("Size", dbg->Font->Size);
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("Name", dbg->Font->Name.c_str());
    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
            .OlePropertySet("FontStyle", "常规");
    vSheet.OlePropertyGet("Cells", 1, 1).OleProcedure("Select");
    // 表格的行数
    int nRowCount(dbg->DataSource->DataSet->RecordCount + 1);
    nRowCount = nRowCount  < 2? 2: nRowCount;
    // 表格的列数
    int nColCount(dbg->Columns->Count);
    nColCount = nColCount  < 1? 1: nColCount;
    // 设置单元格的宽度
    for(int i=0; i <nColCount; i++)
    {
        int nColWidth = dbg->Columns->Items[i]->Width;
        vExcelApp.OlePropertyGet("Columns", i + 1)
                .OlePropertySet("ColumnWidth", nColWidth / 7);
    }

    // 先将列名写入Excel表格
    for(int j=0; j <dbg->Columns->Count; j++)
    {
        // 标题行的行高
        vExcelApp.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 20);
        //
        vSheet.OlePropertyGet("Cells", 1, j + 1)
                .OlePropertySet("Value",
                dbg->Columns->Items[j]->FieldName.c_str());
        // 设置列名单元格的背景色
        Variant vInter = vSheet.OlePropertyGet(
                "Cells", 1, j + 1).OlePropertyGet("Interior");
        vInter.OlePropertySet("ColorIndex", 15); // 灰色
        vInter.OlePropertySet("Pattern", 1); // xlSolid
        vInter.OlePropertySet("PatternColorIndex", -4105); // xlAutomatic
    }
    //将DBGrid中的数据写入Excel表格
    dbg->DataSource->DataSet->First();
    for(int i=0; i <nRowCount; i++)
    {
        // 普通数据行的行高16
        vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);
        // 63 63 72 75 6E 2E 63 6F 6D
        for(int j=0; j <dbg->Columns->Count; j++)
        {
            vSheet.OlePropertyGet("Cells", i + 2, j + 1)
                .OlePropertySet("Value",
                dbg->DataSource->DataSet->FieldByName(
                dbg->Columns->Items[j]->FieldName)->AsString.c_str());
        }
        dbg->DataSource->DataSet->Next();
    }
    // 保存Excel文档并退出
    vExcelApp.OlePropertyGet("ActiveWorkbook")
            .OleFunction("SaveAs", strXlsFile.c_str());
    vExcelApp.OleFunction("Quit");
    vSheet = Unassigned;
    vExcelApp = Unassigned;
    // 导出成功
    MessageBox(0, "导出成功!","DBGrid2Excel", MB_OK);
}

#11


可以用SaveDialog控件

   if(SaveDialog1->Execute())
   {

     AnsiString name;
    int len=SaveDialog1->FileName.Length();
     name=SaveDialog1->FileName.SubString(len-3,4);
    if(name.LowerCase()!=".xls")
    {
      name=SaveDialog1->FileName+".xls";
    }
    else
    {
      name=SaveDialog1->FileName;
    }

///调用上面的函数
     DBGrid2Excel(DBGrid1, name);


   }

#12


可以使用ehlib控件,使用比较简单,还可以轻易使用打印的功能.