我正在尝试使用Delphi 7从内存中的XLS或XLSX文件读取Excel工作表。尽可能使用自动化来逐个读取单元格,但是当Excel未安装时,我将恢复为使用ADO / ODBC Jet驱动程序。 我用任何一个连接 Provider=Microsoft.Jet.OLEDB.4.0; Data Source=file.xls;Extended Properties="Excel 8.0;Persist Security Info=False;IMEX=1;HDR=No"; Provider=Microsoft.ACE.OLEDB.12.0; Data Source=file.xlsx;Extended Properties="Excel 12.0;Persist Security Info=False;IMEX=1;HDR=No"; 我的问题是,当我使用以下查询: SELECT * FROM [SheetName$] 返回的结果不包含空行或空列,因此如果工作表包含这样的行或列,则会移动以下单元格,并且不会以正确的位置结束。 我需要将表单“按原样”加载,即确切地知道每个值来自哪个单元格的位置。 我尝试通过发出一个表单查询逐个阅读单元格 SELECT F1 FROM `SheetName$A1:A1` 但是现在驱动程序返回一个错误,指出“所选区域之外有数据”。 顺便说一句,我不得不使用反引号来封装名称,因为使用这样的括号[SheetName$A1:A1]给出了语法错误消息。 有没有办法告诉司机如何select工作表,而不是跳过空白? 或者,也许有一种方法来知道每个值从哪个单元格位置返回? 出于内部政策原因(我知道他们是坏的,但我不决定这些),不可能使用第三方库,我真的需要这个从标准的Delphi 7组件工作。
这个标题并不完全说明问题的实质。 我有一个UDF函数返回一个PChar。 function AccountDescription(sAccountId: PChar) : PChar; stdcall; 这工作正常,但我意识到如果accountId没有find我想返回#N / A。 我发现了CVErr(xlErrNA),并将签名更改为返回OleVariant。 但是现在我收到[Error]不兼容的types:'OleVariant'和'PAnsiChar'。 我找不到任何有关如何解决这个问题的信息,所以我认为我对这个问题的理解是不正确的。 我试着只是传递一个string编译,但产生了“无效变体types”的运行时错误。 完整的代码是: function AccountDescription(sAccountId: PChar): OleVariant; stdcall; var strResult: string; strPChar : PChar; begin try strResult:= repo.GetAccount(sAccountId).Description; strPChar := strAlloc(length(strResult)+1) ; StrPCopy(strPChar, strResult) ; Result := strPChar; except Result := CVErr(xlErrNA); end; end; 注意:是excel负责销毁string还是我的清理? 我应该创build一个副本,或者我应该只是返回一个指向现有string的指针。 input后,我觉得我应该返回一个指针。 更新:在示例中删除了一些不相关的代码。 现在使用: function AccountDescription(sAccountId: PChar): […]
我注意到Rave为Delphi 7(默认版本)提供了PDF,HTML,RTF和TXT渲染对象。 有谁知道一个地方下载一个免费或开源渲染对象的Excel或其他文件types? (虽然我对Excel特别感兴趣) 谢谢
我想用Delphi写一个Excel表格中的阿拉伯文字。 当我在纸上写字时,我就得到了这样的东西。 另外,如何从Delphi代码中更改Excel数据types?
我正在寻找在Delphi 7中使用Ole Automation在Excel电子表格中提取给定范围内的每个单元格的文本。 刚刚我有一个函数(假设工作簿已经打开)从工作表中select一个范围,并使用.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 := […]
我正在使用delphi7,我想在我的程序中创build密码保护excel文件,也想通过仅使用代码取消保护来编辑它。 我的程序要求是我必须在excel文件中logging数据,但不会被最终用户编辑。所以我怎样才能使用delphi7呢? var xls, xlw: Variant; begin {load MS Excel} xls := CreateOLEObject('Excel.Application'); {open your xls-file} xlw := xls.WorkBooks.Open(FileName := 'd:\book1.xls', Password := 'qq', ReadOnly := True); {save with other file name} xlw.SaveAs(FileName := 'd:\book2.xls', Password := 'password'); {unload MS Excel} xlw := UnAssigned; xls := UnAssigned; end; 我试过,但得到程序只在保存密码保护的文件和创build密码保护的Excel文件后,我不能再次编辑同一个文件。 所以请帮助我。
我试图从Excel中调用一个Delphi DLL,并返回一列variables数据值。 我有DLL返回一个单一的短裤,并出现在一个单元格中。 现在我试图返回一列variables值。 它进入我的代码好,但在Excel中的数组是全0。 任何想法不胜感激。 这里是Excel中的macros注册: =REGISTER("c:\projects\test\delphixl.dll","GetPolicyData","KDD","GetPolicyData","Co,Pol",1,"Delphi") 我不确定参数之后是什么1; 我不能在任何地方find完整的文档。 Excel中的范围有: {=GetPolicyData(C1,D1)} 以下是D7中的代码。 根据注册函数的excel文件,这似乎是好的。 K数据types K数据types使用指向可变尺寸FP结构的指针。 您必须在DLL或代码资源中定义此结构,如下所示: typedef struct _FP { unsigned short int rows; unsigned short int columns; double array[1]; /* Actually, array[rows][columns] */ } FP; Type pPolicyData = ^tPolicyData; tPolicyData = Record Rows: word; Cols: word; data: variant; End; var pd: tPolicyData; Function […]
我想从Excel导入数据到Delphi 7的Paradox数据库。 我怎样才能使用Delphi?
如何设置字体颜色的单元格(半文本其他颜色)在delphi7和MS Excel 2007 +? 例:
我有大量的数据插入到现有Excel工作簿的工作表中。 Excel工作簿将包含其他工作表,其中包含计算和数据透视表。 数据可能有多达60,000行和30多列。 此解决scheme必须适用于Excel 2003和Excel 2007。 使用Excel OLE对象太慢,所以我们试图从CSV文件中加载数据。 我们想出了一个方法来加载数据,把数据放到剪贴板上,然后粘贴到工作表中。 我觉得这是一个相当混乱。 是否有另一种编程方式将CSV文件加载到工作表中的方法? 或者也许完全不同的解决scheme? 更新:在我们完全调查答案之前,我们遇到了另一个任务。 我们应该能够在几个星期内回到这个问题。 当我们回到这个任务时,我一定会再次更新。 感谢所有迄今为止的答案!