VC2005读取excel属性资料并写入word

小编最近在做GIS开发的时候遇到这么一个需求,需要从EXCEL里面读取属性数据,然后将这些属性数据按照一定格式写入word。尽管小编当年也学过两年的C++,当然仅仅是学过,并且学过点皮毛,但是没有接触过这方面的东西。不过最后还是把代码写出来了,这里分享下:

STEP ONE:VC读取EXCEL

VC读取EXCEL的方法很多,有OLE,有ODBC,有ADO等等,不过小编不怎么喜欢微软的东西,于是采用了一个开源库BasicExcel,尽管这个库对中文的支持不算太好,不过经过我的一些修改,完全可以满足我的需求。这里附上一段代码,这是我封装的两个函数:

/*
* 读取excel文件并获取7个变量
*/
bool ReadXlsGetVars(CString &a1,CString &a2,CString &a3,CString &a4,CString &a5,CString &a6,CString &a7)
{
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
        _T("All Files(*.xls)|*.xls||"),AfxGetMainWnd());    //构造文件打开对话框
    CString strPath;
    if(dlg.DoModal() == IDOK)
    {
        BasicExcel e;
        strPath = dlg.GetPathName(); 
        CStringA strPathA(strPath);
        const char *p = strPathA.GetString();
        e.Load(p);
    BasicExcelWorksheet* sheet = e.GetWorksheet("Sheet1");
    BasicExcelCell* cell;
    if (sheet){
        cell=sheet->Cell(1,2);
        getCellCon(cell,a1);
        cell=sheet->Cell(2,2);
        getCellCon(cell,a2);
        cell=sheet->Cell(3,2);
        getCellCon(cell,a3);
        cell=sheet->Cell(4,2);
        getCellCon(cell,a4);
        cell=sheet->Cell(5,2);
        getCellCon(cell,a5);
        cell=sheet->Cell(6,2);
        getCellCon(cell,a6);
        cell=sheet->Cell(7,2);
        getCellCon(cell,a7);
    }
    else
    {
        return false;
    }
    return true;
}
else
{
    return false;
}

}
/*

  • 返回单元格内容
    /
    void getCellCon(BasicExcelCell
    cell,CString &str)
    {
    switch (cell->Type())
    {
    case BasicExcelCell::UNDEFINED:
    str="";
    break;
    case BasicExcelCell::INT:
    str.Format(_T("%d"),cell->GetInteger());
    break;
    case BasicExcelCell::DOUBLE:
    str.Format(_T("%lf"),cell->GetDouble());
    break;
    case BasicExcelCell::STRING:
    str=CString(cell->GetString());
    break;
    case BasicExcelCell::WSTRING:
    str=CString(cell->GetWString());
    break;
    }
    }

STEP TWO 写入word

这步是比较纠结的一步,使用com组件,不过总算还是搞定了,下面是我封装的写入word代码:

/*
* 写入word的函数
*/
bool WritDoc(CString a1,CString a2,CString a3,CString a4,CString a5,CString a6,CString a7)
{
    CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
        _T("All Files(*.doc)|*.doc||"),AfxGetMainWnd());    //构造文件打开对话框
    CString strPath;                    //声明变量
    if(dlg.DoModal() == IDOK)                       //判断是否按下"打开"按钮
    {
        strPath = dlg.GetPathName();                //获得文件路径
        //Word应用程序 
        COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
        _Application app;
        //初始化连接
        app.CreateDispatch(_T("word.Application"));
        Documents docs;
        CComVariant b(false),c(0),d(true);
        _Document doc;
        docs.AttachDispatch( app.GetDocuments());
        doc.AttachDispatch(docs.Add(vOpt,&b,&c,&d));
        Selection sel=app.GetSelection();
        Paragraphs oParas;
        Paragraph oPara;
        Range oRange;
        _Font oFont;
        //开始写入文件
    sel.TypeText(a1+_T("工程"));
    sel.TypeParagraph();//另起一段
    sel.TypeText(_T("初步设计审查意见"));
    sel.TypeParagraph();
    sel.TypeParagraph();
    sel.TypeText(_T("武汉市城乡建设委员会前期策划处:"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t武汉市城市建设投资开发集团有限公司报审的《"+a1+_T("工程初步设计》及其《初步设计概算书》,由武汉市政工程设计研究院有限责任公司编制,我办对该项目进行了审查,现将审查意见汇总如下:")));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t一、项目概要及总体结论"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t(一)项目概要"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t拟建"+a1+_T("位于三环线以北,拟建工程场地位于武汉市硚口区与东西湖区交界处金银湖南街。金山大道以南,凌云东路以西,是金银湖片区重要的东西城市次干道。道路全长约")+a2+_T(",道路红线宽")+a3+_T("。定位为")+a4+_T(",")+a5+_T(",设计车速为")+a6+_T("。")));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t项目建设内容为道路、交通、排水、绿化及照明工程。"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t(二)总体结论"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t本工程初步设计内容基本执行了修建规划及工程可行性研究报告批复的要求。设计文件资料基本齐全,主要技术方案合理可行,其编制深度基本达到相关规定的要求。原则同意初步设计成果。"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t二、道路沿线自然地理概况"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t(一)道路现状及地形地貌"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t项目范围内有9座高压铁塔。道路沿线被交道路中,起点为金海东路,现状为水泥砼路面,止点为凌云西路现状亦为水泥砼路面,路面状况良好。道路红线范围内无其他市政管线。场地地势较为平坦,地形标高一般为")+a7+_T("左右。"));
    sel.TypeParagraph();
    sel.TypeText(_T("\t\t沿线系侵蚀堆积波状平原,原始地貌单元属于长江Ⅱ级阶地。"));
    //设置文件格式
    oParas=doc.GetParagraphs();

    for(int i0=1;i0<=2;i0++)
    {
        oPara=oParas.Item(i0);
        oPara.SetAlignment(1);//设置文本格式:0左对齐,1居中对齐,2右对齐
        oRange=oPara.GetRange();
        oFont=oRange.GetFont();
        oFont.SetSize(22);//表示字体的大小
        oFont.SetBold(1);//0表示是不加粗,1表示加粗
        oRange.SetFont(oFont);
    }
    
    for(int i=4;i<=15;i++)
    {
        oPara=oParas.Item(i);
        oPara.SetAlignment(0);//设置文本格式:0左对齐,1居中对齐,2右对齐
        oRange=oPara.GetRange();
        oFont=oRange.GetFont();
        oFont.SetSize(16);//表示字体的大小
        oFont.SetName(_T("仿宋_GB2312"));
        if(i==6||i==7||i==10||i==12||i==13)oFont.SetBold(1);
        oRange.SetFont(oFont);
    }

    COleVariant vFalse((short)FALSE);
    doc.SaveAs(COleVariant(strPath),vFalse,vFalse,COleVariant(_T("")),vFalse
        ,COleVariant(_T("")),vFalse,vFalse,vFalse,vFalse,vFalse,vFalse,vFalse,vFalse,vFalse,vFalse);                    //保存
    app.SetVisible(false);  
    //释放环境
    sel.ReleaseDispatch();
    doc.ReleaseDispatch();
    docs.ReleaseDispatch();
    app.ReleaseDispatch();
    return true;
}
else
{
    return false;
}

}

关于这个项目:

bug:写完word后系统会存在一个word进程,至今没搞定,希望高手指教。

下载:猛击这里下载

FAQ:使用vs2005编译即可,里面有测试数据。

解压密码:malagis.com

雅安地震灾害对芦山县影响的遥感监测与灾情评估 MarchingCubes算法提取等值面的基本原理

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论