痛苦呀,现在读Excel内容咋就这么难?

ytfhwfnh 2015-08-08 10:21:52
我的需求就是能读一系列excel(有xls格式,还有xlsx格式),然后对其中数据做一些校验。

一开始当然想到用ole方式,本机装的64位office 2010,读xlsx可以,读xls居然报错(错误卡在sysvari.h的1952行:return OleFunction(name, static_cast<TAutoArgsBase*>(&args));)

然后想用ADO方式连接,在Jet 4.0引擎增加Extended Properties=Excel 8.0;HDR=NO;IMEX=1,可以读xls了,但xlsx又打不开。不仅如此,读取的时候,需要知道sheet的名称,写成(select * from [Sheet1$]),每个文档还都不一样>_<

妖哥,救命。我只想求一个能读xls和xlsx格式的办法,用的BCB6+office2010 64位
...全文
207 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ytfhwfnh 2015-08-17
  • 打赏
  • 举报
回复
引用 10 楼 u010030181 的回复:
wb.OleFunction("Open", WideString(getFilePath()));
为何这里要转为宽字符?
因为路径中可能包含中文,这是抄ccrun的。
QIUSQJF 2015-08-12
  • 打赏
  • 举报
回复
wb.OleFunction("Open", WideString(getFilePath()));
为何这里要转为宽字符?
ytfhwfnh 2015-08-10
  • 打赏
  • 举报
回复
ShellExecute(NULL,"open",getFilePath().c_str(),NULL,NULL,SW_SHOWNORMAL);
ex = Variant::GetActiveObject("Excel.Application");
wb = ex.OlePropertyGet("ActiveWorkBook");
试了双击xls或xlsx,打开都没问题。 调用ShellExecute open xls或xlsx,就是不行,真奇怪。。。 求大神帮忙。
ytfhwfnh 2015-08-10
  • 打赏
  • 举报
回复
引用 7 楼 zzbinfo 的回复:
我没有修改你的任何代码,直接在win8.1 64位 xe7 + office 2007中都可以正常的打开两种类型的表格,用的OLE方式,看来还是你的环境的问题
谢谢,我是通过循环查找子目录,把整个目录下的xls或xlsx搜到ListView,然后循环调这个方法,不停的去打开关闭,就是这样效果。目前只有暂时把xls屏蔽掉了,让用户手动转为xlsx,否则别想用自动校对。哼哼。
ytfhwfnh 2015-08-10
  • 打赏
  • 举报
回复
引用 6 楼 Waiting4you 的回复:
前面代码的哪句上有出问题?
try { wb.OleFunction("Open", WideString(getFilePath())); } open出问题,打开xlsx没问题,打开xls就卡在OleFunction函数里了。
ytfhwfnh 2015-08-10
  • 打赏
  • 举报
回复
为啥没人理我
zzbinfo 2015-08-10
  • 打赏
  • 举报
回复
我没有修改你的任何代码,直接在win8.1 64位 xe7 + office 2007中都可以正常的打开两种类型的表格,用的OLE方式,看来还是你的环境的问题
Waiting4you 2015-08-10
  • 打赏
  • 举报
回复
前面代码的哪句上有出问题?
ytfhwfnh 2015-08-10
  • 打赏
  • 举报
回复
引用 4 楼 xjq2003 的回复:
excel(有xls格式,还有xlsx格式) 这两种格式你读取之前,先转换成其中一种, 然后再用ole或者aDO读,可以吗?
现在我机器上的配置,只能读xlsx。如果不能打开xls,也没办法用代码把它自动转换为xlsx。
xjq2003 2015-08-10
  • 打赏
  • 举报
回复
excel(有xls格式,还有xlsx格式) 这两种格式你读取之前,先转换成其中一种, 然后再用ole或者aDO读,可以吗?
ytfhwfnh 2015-08-08
  • 打赏
  • 举报
回复
代码写得有点简陋,将就这看哈。

// 校验 ,返回值代表是否完成校验,并非通过校验
bool bom::check(TStrings* log)
{
    log->Add("======================");
    log->Add("开始校验:" + getFilePath());

    clear();

//    if (GetExcelApp_IsRun())
//    {
//        log->Add("error:请关闭所有Excel文档后,再执行此操作!");
//        return false;
//    }

    Variant ex,wb;
    try
    {
        ex = Variant::CreateObject("Excel.Application");
    }
    catch(...)
    {
        log->Add("error:无法启动Excel");
        return false;
    }

    ex.OlePropertySet("Visible", true);
    // 不显示警告提示框
    //ex.OlePropertySet("DisplayAlerts", false);
    wb = ex.OlePropertyGet("WorkBooks");
    try
    {
        wb.OleFunction("Open", WideString(getFilePath()));
    }
    catch(...)
    {
        log->Add("error:无法打开Excel文件");
        try
        {
            ex.OleFunction("Quit");
            ex = Unassigned;
        }
        catch(...)
        {return false;}
        return false;
    }

    int bomid = 1;
    int line = 1;
    AnsiString pp, code, name, spec, num, pos;

    Variant sheet, cell;

    try
    {
        sheet = ex.OlePropertyGet("ActiveWorkBook").OlePropertyGet("sheets", 1);
        do {
            do {
                Application->ProcessMessages();
                cell = sheet.OlePropertyGet("Cells",line,1);
                pp = cell.OlePropertyGet("Value");
                line++;
            } while (pp != String(bomid) && pp.Length() > 0);

            if (pp == String(bomid))
            {
                code = sheet.OlePropertyGet("Cells",line,2).OlePropertyGet("Value");
                name = sheet.OlePropertyGet("Cells",line,3).OlePropertyGet("Value");
                spec = sheet.OlePropertyGet("Cells",line,4).OlePropertyGet("Value");
                num = sheet.OlePropertyGet("Cells",line,7).OlePropertyGet("Value");
                pos = sheet.OlePropertyGet("Cells",line,8).OlePropertyGet("Value");

                mate* pm = new mate(line, bomid, code, name, spec, num.ToIntDef(0), pos);
                //pm->check(log);
                _verMates.push_back(pm);

                bomid++;
            }

        } while (pp.Length() > 0);
    }
    catch (...)
    {
        log->Add("error:获取物料信息出错。Line:" + String(line) + ",bomid:" + String(bomid));
        return false;
    }

    ex.OlePropertyGet("ActiveWorkBook").OleFunction("Close",false);
    ex.OleFunction("Quit");
    ex = Unassigned;
    return true;
}

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧