VC中对office的操作

2016-02-19 19:02 35 1 收藏

下面图老师小编要跟大家分享VC中对office的操作,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - 编程语言 】

以前导出数据的时候都是自己定义格式,自己来解析,或者直接导出到TXT里,这显然不能满足用户的继续编辑的要求,所以我用自动化技术写了几个函数可以将数据导出到word和excel中,仅仅是标格数据。。。

这个过程是这样的:http://blog.csdn.net/hoya5121

在VC6的类向导中的AUTOMATION页筐中“ADD CLASS”,然后选择“from a type”,浏览到office目录选择导入工程文件 EXCEL9.OLB 和msword9.olb,然后将需要的类导入到工程中,这里出现一个问题,就是excel和word同时导入的时候excel9.h 和msword9.h
两个文件中居然有名字相同的类导致连接出错,我不知道是我使用错误,还是ms没注意到这个问题。。。最终我这样解决了这个问题,在excel.h文件中用namespace将正个文件加入到一个名字空间中。。。

接下来的工作就比较简单了,打开office将你需要的流程录制成vba的宏,然后将宏翻译成vc的代码。。下面将我的导入标格的代码贴出来:
 /**/////////////////对WORD的操作  2005-09-26///////////////////////
//.h
class CStringArrayOut : public CStringArray
...{
public:
    CStringArrayOut& operator = (const CStringArrayOut& strarrarr)
    ...{
        if(&strarrarr == this)
            return *this;
        this-RemoveAll();
        for(int i = 0; i strarrarr.GetSize(); i++)
        ...{
            this-Add(strarrarr[i]);
        }

        return *this;
    }
};

typedef CArrayCStringArrayOut,CStringArrayOut& StrVecVecType;

void WordTable(CString tablename,int rowNum,int colNum,StrVecVecType& tablestr,CString strOutDocFile);

void ExcelTable(CString tablename,
                int rowNum,
                int colNum,
                StrVecVecType& tablestr,
                CString strOutExcelFile);

//.cpp
void WordTable(CString tablename,int rowNum,int colNum,StrVecVecType& tablestr,CString strOutDocFile)
...{   
    int i, j;

    /**//////打开word/////////////////////////////////////////////////////////////////////
    _Application app;   
    if(!app.CreateDispatch(_T("Word.Application")))   
    ...{
        AfxMessageBox(_T("您没有安装OFFICE,此功能不能执行!"));
        return;
    }
    //app.SetVisible(TRUE);    //使WORD可见

    /**//////新建文档/////////////////////////////////////////////////////////////////////
    Documents docs = app.GetDocuments();
    CComVariant Template(_T(""));
    CComVariant NewTemplate(false),DocumentType(0),Visible;
    docs.Add(&Template,&NewTemplate,&DocumentType,&Visible);

    //设置视图
    Window win = app.GetActiveWindow();
    View view = win.GetView();
    Pane ap = win.GetActivePane();
    if(view.GetSplitSpecial() == 0)
    ...{
        view.SetType(1);
    }
    else
    ...{
        view.SetType(1);
    }

    /**//////绘制标格/////////////////////////////////////////////////////////////////////
    _Document doc = app.GetActiveDocument();
    Selection sel = app.GetSelection();

    //写表名
    _Font font = sel.GetFont();
    float fs = font.GetSize();
    Paragraphs pg = sel.GetParagraphFormat();
    long ali = pg.GetAlignment();

    font.SetSize(16);
    pg.SetAlignment(1);
    sel.TypeText(tablename);
    sel.TypeParagraph();

    font.SetSize(fs);
    pg.SetAlignment(ali);

    Tables tables = doc.GetTables();
    Range range = sel.GetRange();
    //CComVariant v1((short)1);
    //CComVariant v2((short)1);
    CComVariant v1((short)1);
    CComVariant v2((short)1);


    tables.Add(range,rowNum,colNum,&v1,&v2);

    /**////填写标格///////////////////////////////////////////////////////////////////////
    if(tablestr.GetSize() = 1)
    ...{
        AfxMessageBox("绘制标格时出错!");
        doc.ReleaseDispatch();
        docs.ReleaseDispatch();
        win.ReleaseDispatch();
        view.ReleaseDispatch();
        ap.ReleaseDispatch();
        sel.ReleaseDispatch();
        font.ReleaseDispatch();
        CComVariant SaveChanges(false),OriginalFormat,RouteDocument;
        app.Quit(&SaveChanges,&OriginalFormat,&RouteDocument);
        app.ReleaseDispatch();
        return;
    }

    if(tablestr.GetSize() != rowNum || tablestr[0].GetSize() != colNum)
    ...{
        AfxMessageBox("绘制标格时出错!");
        doc.ReleaseDispatch();
        docs.ReleaseDispatch();
        win.ReleaseDispatch();
        view.ReleaseDispatch();
        ap.ReleaseDispatch();
        sel.ReleaseDispatch();
        font.ReleaseDispatch();

        CComVariant SaveChanges(false),OriginalFormat,RouteDocument;
        app.Quit(&SaveChanges,&OriginalFormat,&RouteDocument);
        app.ReleaseDispatch();
        return;
    }

    for(i = 0; i rowNum; i++)
    ...{
        for(j = 0; j colNum; j++)
        ...{
            sel.TypeText(tablestr[i][j]);
            sel.MoveRight(COleVariant((short)1),COleVariant((short)1),COleVariant((short)0));
        }
    }

    //设置标格居中
    Table tb = tables.Item(1L);
    //tb.AutoFitBehavior(1L);
    Rows rs = tb.GetRows();
    rs.SetAlignment(1);
    COleVariant vTrue((short)TRUE),
        vFalse((short)FALSE);
    doc.SaveAs(//保存文档
        COleVariant(strOutDocFile),
        COleVariant((short)0),
        vFalse,
        COleVariant(""),
        vTrue,
        COleVariant(""),
        vFalse,
        vFalse,
        vFalse,
        vFalse,
        vFalse);

    tb.ReleaseDispatch();
    rs.ReleaseDispatch();
    doc.ReleaseDispatch();
    docs.ReleaseDispatch();
    win.ReleaseDispatch();
    view.ReleaseDispatch();
    ap.ReleaseDispatch();
    sel.ReleaseDispatch();
    font.ReleaseDispatch();

    CComVariant SaveChanges(false),OriginalFormat,RouteDocument;
    app.Quit(&SaveChanges,&OriginalFormat,&RouteDocument);
    app.ReleaseDispatch();
}   

void ExcelTable(CString tablename,
                int rowNum,
                int colNum,
                StrVecVecType& tablestr,
                CString strOutExcelFile)
...{
    //using namespace excel9;
    int i,j;
    excel9::_Application app;
    excel9::_Workbook wbook;
    excel9::Workbooks wbooks;
    excel9::Worksheets sheets;
    excel9::_Worksheet sheet;
    excel9::Range range;
    excel9::Range iCell;
    //Range unionRange;
    //LPDISPATCH lpDisp;
    //COleVariant vResult;   
    COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    if(!app.CreateDispatch("Excel.Application"))
    ...{
        AfxMessageBox ("create excel faild!");
        return;
    }

    //app.SetVisible(TRUE);
    wbooks = app.GetWorkbooks();
    wbook = wbooks.Add(covOptional);

    //AfxMessageBox("");
    sheets = wbook.GetSheets();
    sheet = sheets.GetItem(COleVariant((short)1));
    range.AttachDispatch(sheet.GetCells());

    long iStartCol = 1; //使用区域的起始列,从1开始
    long iStartRow = 1; //使用区域的起始行,从1开始
    int iMaxCol = 6;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

    // 单元格样式设置(居中)
    COleVariant varH, varV, varInfo;
    varH.vt = VT_I2;
    varV.vt = VT_I2;
    varH.iVal = -4108;
    varV.iVal = -4108;
    range.SetHorizontalAlignment (varH);
    range.SetVerticalAlignment(varV);

    //最大化文档
    excel9::Window win;
    win = app.GetActiveWindow();
    win.SetWindowState(-4137);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

    CArrayint,int& maxcolwidarr;
    for(i = 0; i colNum; i++)
    ...{
        int maxwid = tablestr[0][i].GetLength();
        maxcolwidarr.Add(maxwid);
        for(j = 0; j rowNum; j++)
        ...{
            if(tablestr[j][i].GetLength() maxcolwidarr[i])
                maxcolwidarr[i] = tablestr[j][i].GetLength();
        }
    }
    //填写标格
    for(int row = 1; row rowNum+1; row++)
    ...{
        for(int col = 1; col colNum+1; col++)
        ...{
            iCell = sheet.GetCells();
            iCell.SetItem(COleVariant((short )(row)),
                COleVariant((short )(col)),
                COleVariant(tablestr[row-1][col-1]));
            //iCell.SetColumnWidth(COleVariant((short)(maxcolwidarr[col-1])));
        }
    }
    //设置宽度
    for (int z = 0; z maxcolwidarr.GetSize(); z++)
    ...{
        iCell.AttachDispatch(range.GetItem
            (COleVariant((long)1),COleVariant((long)(z+1))).pdispVal);
        iCell.SetColumnWidth (COleVariant((long)maxcolwidarr[z]));
    }

    //保存文件

    wbook.SaveAs(COleVariant(strOutExcelFile),
        COleVariant((short )(-4143)),
        COleVariant(""),
        COleVariant(""),
        COleVariant((short )(FALSE)),
        COleVariant((short )(FALSE)),
        0L,
        COleVariant((short )(NULL)),
        COleVariant((short )(NULL)),
        COleVariant((short )(NULL)),
        COleVariant((short )(NULL)));


    //return
    app.Quit();
    app.ReleaseDispatch();
    wbook.ReleaseDispatch();
    wbooks.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    range.ReleaseDispatch();
    iCell.ReleaseDispatch();
    win.ReleaseDispatch();
}

来源:https://www.tulaoshi.com/n/20160219/1619873.html

延伸阅读
标准C++规定new一个对象时如果分配内存失败就应抛出一个std::bad_alloc异常,如果不希望抛出异常而仅仅传回一个NULL指针,可以用new的无异常版本:new(nothrow)。 VC6.0在new头文件中声明了这两种operator new操作符: void *__cdecl operator new(size_t) _THROW1(std::bad_alloc); void *__cdecl operator new(size_t, const std::no...
    这几年我一直在公司的商业程序中使用你的 CStaticLink 类,在 1998 年 MSJ 三月刊里,你示范了如何给超链接添加手型光标,但现在我想以另一种方式使用这个类。在微软的 IE 浏览器中,可以用Tab键遍历Web页面中的任何超链接,然后按回车键以单击该链接。我能否让 CStaticLink 做同样的事情?我是不是有点得寸进尺? 如...
MS Office家族产品中常常见到扁平式组合框,本文将介绍一个C++类:CXTFlatComboBox ,用这个类可以在自己的程序中轻松实现扁平式组合框,也就是让标准的CComboBox控件外观扁平化。CXTFlatComboBox类是codejoke开发工具包Xtreme Toolkit的一个成员。任何人都可以免费使用这个类的源代码。 使用方法: 将CXTFlatComboBox类的头文件...
  听说出了一种新的Linux中文版本,LinXP,可以在Linux下运行IE6.0 及Office 2000,PhotoShop 7等Windows应用软件,太好了,其实用Windows软件大家主要还是因为许多常用的应用软件如IE,Office 等只能在Windows下运行,而Windows经常出现的蓝屏、死机、网络病毒让人叫哭不迭,如果能在Linux下运行这些常用的应用软件,又能享受Lin...
工作之余,用VC作了一个小程序,是VC+SQL server模式的,程式内容比较简单,主要设及以下内容: 窗口如何分割; 多视图之间如何通信; 列表视图的操作及事件处理; 树形控件的操作及事件处理,利用递归根据数据库动态生成目录; 实现主从表的显示 以下对程序细节稍作一下说明; 一、窗口如何分割 切分窗口既适用于SDI应用程序...

经验教程

550

收藏

47
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部