您的位置:首页 > 其它

将ListView中的内容导出到Word和Excel(新)

2015-04-04 12:42 411 查看

将ListView中的内容导出到Word和Excel(新)

关键字:ListView,Excel,Word,导出,OLE,ccrun

作者:ccrun    更新:2005-10-13    浏览:17239

经常看到有网友发帖子询问如何将ListView中的内容导出到Excel或Word文档中,其实在BCB中用OLE技术来操作,并不复杂,大概是有的人懒的写吧,于是ccrun(老妖)花了点时间写了以下两个函数,实现了将本程序中ListView中内容导出到Excel文档和Word文档。看在写代码很辛苦的份上,请在转载时留下出处和原作者信息。Thank了。:D

   

如果您有好的想法,欢迎来信讨论: info@ccrun.com

2005.10.13 v0.2

+ 导出表格增加了标题一栏

2005.10.12 v0.1

初版发布

//---------------------------------------------------------------------------
// 将ListView中的内容导出到Word文档
// v0.2 by ccrun(老妖) 2005.10.13
//---------------------------------------------------------------------------
void __fastcall ListView2Word(TListView *lv, String strDocFile)

{

    Variant vWordApp, vTable, vCell;

    try

    {

        vWordApp = Variant::CreateObject("Word.Application");

    }

    catch(...)

    {

        MessageBox(0, "启动 Word 出错, 可能是没有安装Word.",

                "ListView2Doc", 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", lv->Font->Size);

    vSelect.OlePropertyGet("Font").OlePropertySet("Name", lv->Font->Name.c_str());

    // 要插入表格的行数

    int nRowCount(lv->Items->Count + 1);

    nRowCount = nRowCount < 2? 2: nRowCount;

    // 要插入表格的列数

    int nColCount(lv->Columns->Count);

    nColCount = nColCount < 1? 1: nColCount;

    // 在Word文档中插入与ListView行数列数相同的一个表格

    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;

        if(lv->Columns->Count > i)

            nColWidth = lv->Columns->Items[i]->Width;

        else

            nColWidth = 100; // 如果没有设置列,就随便设置个默认值

        vTable.OlePropertyGet("Columns").OleFunction("Item", i + 1)

                .OlePropertySet("PreferredWidthType", 3); // wdPreferredWidthPoints

        vTable.OlePropertyGet("Columns").OleFunction("Item", i + 1)

                .OlePropertySet("PreferredWidth", nColWidth * 2);

    }

    //----------------------------------------------------------------------------

    // 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。

    // 作者:ccrun(老妖) info@ccrun.com

    // 本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=633&d=vytvc6

    //----------------------------------------------------------------------------   

    // 将列名写入Word表格先

    for(int i=0; i<lv->Columns->Count; i++)

    {

        vCell = vTable.OleFunction("Cell", 1, i + 1);

        vCell.OlePropertySet("Range", lv->Columns->Items[i]->Caption.c_str());

        // 列名单元格背景颜色 // wdColorGray125

        vCell.OlePropertyGet("Shading")

                .OlePropertySet("BackgroundPatternColor", 14737632);

    }

    // 将ListView中的数据写入Word表格

    for(int i=0; i<nRowCount - 1; i++)

    {

        // 63 63 72 75 6E 2E 63 6F 6D

        vCell = vTable.OleFunction("Cell", i + 2, 1);

        vCell.OlePropertySet("Range", lv->Items->Item[i]->Caption.c_str());

        for(int j=0; j<lv->Items->Item[i]->SubItems->Count; j++)

        {

            if(lv->Columns->Count > j)

            {

                vCell = vTable.OleFunction("Cell", i + 2, j + 2);

                vCell.OlePropertySet("Range",

                        lv->Items->Item[i]->SubItems->Strings[j].c_str());

            }

        }

    }

    // 保存Word文档并退出

    vWordApp.OlePropertyGet("ActiveDocument")

            .OleProcedure("SaveAs", strDocFile.c_str());

    vWordApp.OlePropertyGet("ActiveDocument").OleProcedure("Close");

    Application->ProcessMessages();

    vWordApp.OleProcedure("Quit");

    Application->ProcessMessages();

    vWordApp = Unassigned;

    // 工作结束

    MessageBox(0, "ListView2Doc 转换结束!",
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=633&d=vytvc6
            "ListView2Doc", MB_OK | MB_ICONINFORMATION);

}
//---------------------------------------------------------------------------
// 将ListView中的内容导出到Excel文档
// v0.2 by ccrun(老妖) 2005.10.13
//---------------------------------------------------------------------------
void __fastcall ListView2Excel(TListView *lv, String strXlsFile)

{

    Variant vExcelApp, vSheet;

    try

    {

        vExcelApp = Variant::CreateObject("Excel.Application");

    }

    catch(...)

    {

        MessageBox(0, "启动 Excel 出错, 可能是没有安装Excel.",

                "ListView2Excel", MB_OK | MB_ICONERROR);

        vExcelApp = Unassigned;

        return;

    }

    // 隐藏Excel界面

    vExcelApp.OlePropertySet("Visible", true);

    // 新建一个工作表

    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", lv->Font->Size);

    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")

            .OlePropertySet("Name", lv->Font->Name.c_str());

    vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")

            .OlePropertySet("FontStyle", "常规");

    vSheet.OlePropertyGet("Cells", 1, 1).OleProcedure("Select");

    // 表格的行数

    int nRowCount(lv->Items->Count + 1);

    nRowCount = nRowCount < 2? 2: nRowCount;

    // 表格的列数

    int nColCount(lv->Columns->Count);

    nColCount = nColCount < 1? 1: nColCount;

    // 设置单元格的宽度

    for(int i=0; i<nColCount; i++)

    {

        int nColWidth;

        if(lv->Columns->Count > i)

            nColWidth = lv->Columns->Items[i]->Width;

        else

            nColWidth = 100; // 如果没有设置列,就随便设置个默认值

        vExcelApp.OlePropertyGet("Columns", i + 1)

                .OlePropertySet("ColumnWidth", nColWidth / 2.6);

    }

    // 先将列名写入Excel表格

    for(int j=0; j<lv->Columns->Count; j++)

    {

        // 标题行的行高

        vExcelApp.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 20);

        // 写入标题

        vSheet.OlePropertyGet("Cells", 1, j + 1)

                .OlePropertySet("Value",

                lv->Columns->Items[j]->Caption.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

    }

    //----------------------------------------------------------------------------

    // 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。

    // 作者:ccrun(老妖) info@ccrun.com

    // 本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=633&d=vytvc6

    //----------------------------------------------------------------------------   

    // 将ListView中的数据写入Excel表格

    for(int i=0; i<nRowCount - 1; i++)

    {

        // 63 63 72 75 6E 2E 63 6F 6D

        // 普通数据行的行高16

        vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);

        //

        vSheet.OlePropertyGet("Cells", i + 2, 1)

                .OlePropertySet("Value", lv->Items->Item[i]->Caption.c_str());

        for(int j=0; j<lv->Items->Item[i]->SubItems->Count; j++)

        {

            vSheet.OlePropertyGet("Cells", i + 2, j + 2)

                .OlePropertySet("Value",

                lv->Items->Item[i]->SubItems->Strings[j].c_str());

        }

    }

    // 保存Excel文档并退出

    vExcelApp.OlePropertyGet("ActiveWorkbook")

            .OleFunction("SaveAs", strXlsFile.c_str());

    vExcelApp.OleFunction("Quit");

    vSheet = Unassigned;

    vExcelApp = Unassigned;

    // 工作结束

    MessageBox(0, "ListView2Excel 转换结束!",

            "ListView2Excel", MB_OK | MB_ICONINFORMATION);

}

// 测试代码

ListView2Word(ListView1, "C:\\ccrun\\234.doc");

ListView2Excel(ListView1, "C:\\ccrun\\234.xls");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: