超级郁闷问题!都进来看看,不管你现在用不用得到,一定有帮助。。。请求版主帮忙置顶!!!

Comer Comer 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
由于要在PB下调用,所以封装了一个DLL,用于读EXCEL内容,读单个EXCEL文件(不管有多少SHEET页)都没问题,如果连续读多个excel文件,不管是PB调用还是在delphi下,某些(注意:不是全部,并且出乱码的单元格,每次都乱码)单元格会出现乱码(只有最后一个字是乱码)。

类似的方法,如果不用DLL,直接在delphi的应用程序里读excel文件的话,则不会出现乱码。
也是类似的方法,封装个COM+组件,在delphi,c#下调用都没问题,不会出现乱码。

郁闷至极,快一个月了,也没有解决,在网上找了些做DLL方面的资料,都只是强调string类型要用pchar之类的文章。

用到的第三方控件下载地址:http://www.axolot.com

我的DLL的代码:
library readExcel;

uses
XLSReadWriteII2,
ActiveX, Forms,
System,
SysUtils,
Classes,
Windows;

var
XlsRW: TXLSReadWriteII2;

{$R *.res}

//创建 XLSReadWriteII 对象
function XLSCreate: Integer; stdcall;
begin
try
Coinitialize(nil);

XlsRW := TXLSReadWriteII2.Create(Application);
Result := 1;
except
//创建对象失败
Result := -1;
Exit;
end;
end;

exports
XLSCreate;

//退出,释放变量
procedure XLSClose; stdcall;
begin
XlsRW.Free;
CoUnInitialize();
end;

exports
XLSClose;

//打开 Excel 文件
//openMode:1:新建文件(如果文件存在则覆盖原文件),0:打开现有文件
function XLSOpen(openMode: Integer; const SrcFile: PChar): Integer; stdcall;
begin
if UpperCase(ExtractFileExt(StrPas(SrcFile))) <> '.XLS' then
begin
//不是excel格式文件,不处理
Result := -100;
Exit;
end;

try
XlsRW.Filename := StrPas(SrcFile);

if ( openMode = 0 ) then
XlsRW.Read;
Result := 1;
except
//文件不存在
Result := 0;
end;
end;

exports
XLSOpen;

//保存
procedure XLSSave; stdcall;
begin
try
XlsRW.Write;
except
raise Exception.Create('Save To Excel File Failed.');
end;
end;

exports
XLSSave;

//取单元格的值,返回类型:PChar
function XLSGet_AsString(iSheet, iRow, iCol: Integer): PChar; stdcall;
var
ws: WideString;
s: String;
begin
try
ws := XlsRW.Sheets[iSheet - 1].AsString[iCol - 1, iRow - 1];

WideCharToStrVar(PWideChar(ws), s);
Result := Pchar(s);
except
raise Exception.Create('List index out of bounds (' + IntToStr(iSheet) + ')');
end;
end;

exports
XLSGet_AsString;

begin
end.
...全文

相关推荐

评论 36
收藏 已收藏
分享
返回顶部
Comer
Delphi 5,944 成员 262,941 内容