【问题标题】:Excel reading in Delphi 5 with automation and excel 2007 running在 Delphi 5 中使用自动化和 excel 2007 运行 Excel 读取
【发布时间】:2011-06-18 05:11:12
【问题描述】:

我正在调试的 delphi 5 程序中有这段代码:

s:string
vararray:variant;

vararray := VarArrayOf(['']);
vararray := ExcelWorkSheet1.UsedRange[0].Value;
s := VarToStr(vararray);

这用于在 Excel XP 和 2003 运行时完美运行。但是自从我更改为 Excel 2007(也是 windows7)后,delphi 在最后一行给出了一个变体类型转换错误('无效的变体类型转换')。

有人可以帮我解决这个问题吗?在过去的 5 年里,这段代码没有被触及过,我无法找到记录这些组件的好来源

谢谢!

【问题讨论】:

  • 这个单元格包含什么?我敢打赌,这是一个以字符串形式保存的日期/时间。
  • 我问这个问题是因为不知道这个单元格包含什么,很难回答
  • ISTM 在最后一行中,vararray 正在填充一系列单元格中的值,并且 Excel 2003 和 2007 传递值数组的方式有所不同。 . 使用调试器进行操作,在使用 Excel 2003 和 2007 调用 VarTOStr 之前检查 vararray 中的内容。这应该为为什么会发生转换错误提供线索。也可能与参数分隔符的区域设置以及 2003/2007 年间他们使用的行为变化(从他们选择要使用的分隔符的位置)有关。
  • Office COM 服务器的文档位于 Office 目录树中
  • 你能用一个小的 Excel 样本表和一个小的 Delphi 程序重现这个吗?然后转储 vararray 变量的内容。

标签: delphi excel automation


【解决方案1】:

我设法使以下工作:

Sheet := Workbook.Sheets.Item[1] as ExcelWorksheet;
value := Sheet.Range['A1','B1'].Value;
Edit1.Text := value[1,1];
Edit2.Text := value[1,2];

请注意,我通过Excel2000 导入单元使用早期绑定。我认为您可能正在使用 CreateComObject('Excel.Application') 的后期绑定。

我不理解您的 Range[1,2] 语法 - 这似乎不符合 Excel 对象模型的要求。

我希望这会有所帮助。

【讨论】:

  • @Johan 阅读问题的最后一条评论,由 OP 提供
  • I don't understand your Range[1,2] syntax – that doesn't seem to meet the requirements of the Excel object mode [] 语法适用于变体 IIRC,命令作为文本传输到自动化服务器,Excel VBA 进行解码并在变体中给出结果,Delphi 甚至从不查看它.我在 Delphi 3 手册中的某处读过它。
【解决方案2】:

UsedRange 不需要处于活动状态。 如果不是,.value 将为空,无法转换为字符串。

做额外的检查,像这样:

s:string
vararray:variant;

vararray := VarArrayOf(['']);
vararray := ExcelWorkSheet1.UsedRange[0].Value;
if vararray <> nul then s := VarToStr(vararray);
else s := ''; 

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 2017-03-23
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多