gpt4 book ai didi

excel - 使用 Excel 的 Delphi Ole Automation 获取文本而不是值

转载 作者:行者123 更新时间:2023-12-01 18:09:49 28 4
gpt4 key购买 nike

我希望使用 Delphi 7 中的 Ole Automation 提取 Excel 电子表格给定范围内每个单元格的文本。

现在我有一个函数(假设工作簿已打开)从工作表中选择一个范围并使用 .Value2 函数填充 Variant 数组

function GetExcelRange(const AWorkbookIndex: integer; const AWorksheetIndex: integer; const firstCol, lastCol, firstRow, lastRow: integer): Variant;
var
AWorkbook, ARange: OleVariant;
begin
Result := Unassigned;
if not VarIsEmpty(ExcelApp) then
begin
if ExcelApp.Workbooks.Count >= AWorkbookIndex then
begin
AWorkbook := ExcelApp.Workbooks[AWorkbookIndex];
try
if AWorkbook.Worksheets.Count >= AWorksheetIndex then
begin;
ARange := AWorkbook.WorkSheets[AWorksheetIndex].Range[AWorkbook.WorkSheets[AWorksheetIndex].Cells[firstRow, firstCol],
AWorkbook.WorkSheets[AWorksheetIndex].Cells[lastRow, lastCol]];
Result := ARange.Value2;
end;
finally
AWorkbook := Unassigned;
ARange := Unassigned;
end;
end;
end;
end;

我期望的是我可以将该行更改为 Result := ARange.Text 但它返回一个空对象。

我不想在 Ole 对象处于事件状态时迭代每个单元格,并将整个范围的文本粘贴到数组中,就像我上面所做的那样。

最佳答案

我从您的问题推断您想要读取在 Excel 中呈现给用户的单元格文本内容。我认为您无法在整个范围内执行该操作。我过去的做法是这样的。请注意,我使用的是早期绑定(bind)的 COM。

function GetCellVariant(const Sheet: ExcelWorksheet; const Row, Col: Integer): OleVariant;

function ErrorText(const Cell: ExcelRange; hr: HRESULT): string;
const
ErrorBase=HRESULT($800A0000);
var
i: Integer;
begin
Result := Cell.Text;
for i := 1 to Length(Result) do begin
if Result[i]<>'#' then begin
exit;
end;
end;
if hr=ErrorBase or xlErrDiv0 then begin
Result := '#DIV/0!';
end else if hr=ErrorBase or xlErrNA then begin
Result := '#N/A';
end else if hr=ErrorBase or xlErrName then begin
Result := '#NAME?';
end else if hr=ErrorBase or xlErrNull then begin
Result := '#NULL!';
end else if hr=ErrorBase or xlErrNum then begin
Result := '#NUM!';
end else if hr=ErrorBase or xlErrRef then begin
Result := '#REF!';
end else if hr=ErrorBase or xlErrValue then begin
Result := '#VALUE!';
end else begin
Result := 'an error';
end;
end;

var
Cell: ExcelRange;
hr: HRESULT;
begin
Cell := GetCellAsRange(Sheet, Row, Col);//effectively this is Sheet.Range
if VarIsError(Cell.Value, hr) then begin
raise ECellValueError.CreateFmt(
'Cell %s contains %s.',
[R1C1toA1(Row,Col), ErrorText(Cell, hr)]
);
end;
Result := Cell.Value;
end;

function GetCellString(const Sheet: ExcelWorksheet; const Row, Col: Integer): string;
var
Value: Variant;
Cell: ExcelRange;
begin
Value := GetCellVariant(Sheet, Row, Col);
if VarIsNumeric(Value) then begin
Cell := GetCellAsRange(Sheet, Row, Col);
Result := Sheet.Application.WorksheetFunction.Text(Cell.Value, Cell.NumberFormatLocal);
end else begin
Result := ConvertToString(Value);//this converts a Variant to string
end;
end;

事实上,这段代码来 self 在 Stack Overflow 上提出的第一个问题:How do I read the formatted textual representation of a cell in Excel

关于excel - 使用 Excel 的 Delphi Ole Automation 获取文本而不是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15229973/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com