RAD Studio10+ 操作office 注意事项

OLE(对象链接与嵌入)是微软提出的标准,是应用程序间交换数据、相互操作的一种方式,MS OFFICE 提供了很强的 OLE 服务功能,Delphi 及C++Builder等语言都可以以客户方式向Excel提交命令,以存取其数据,其中Delphi最为简单。C++Builder采用间接的办法,利用变体类Variant所提供的四个“方法”向OLE服务程序提交操纵命令:

Variant  Variant::OlePropertyGet(属性名,参数….);  // 取对象属性
Void     Variant::OlePropertySet(属性名,参数….);  // 设置对象属性
Variant  Variant::OleFunction(函数名,参数….);    // 运行对象的函数
void     Variant::OleProcedure(过程名,参数….);   // 运行对象的过程
对于这四个长长的方法名可在程序中用宏语句重新定义一下:
#define   PG   OlePropertyGet
#define   PS   OlePropertySet
#define   FN   OleFunction
#define   PR   OleProcedure

例子:
Variant t1=Ex.PG(“ActiveWorkBook”);
Variant t2=t1.PG(“ActiveSheet”);
Variant t3=t2.PG(“Cells,1,2);
t3.PS(“Value”,3);
可去掉中间变量将这四句合为一句,就是:
Ex.PG(“ActiveWorkBook”).PG(“ActiveSheet”).PG(“Cells”,1,2).PS(“Value”,3);

改sheet名:

vSheet.PS(“Name”, NewName);//注意 这里NewName为WideString 类型

同样,WorkBook另存为的文件名也应为WideString 类型,否则报“类型变量不正确”

WorkBook.FN(“SaveAs”, ExcelFileName);//注意:这里ExcelFileName为WideString 类型

本文为原创文章,转载请注明出处!

FireDAC数据库连接管理控件 TFDManager

RAD Studio11 提供了FireDAC连接数据库。关于 FDConnection 与数据库建立连接,最简单的办法就是拖动控件TFDConnection到界面上。双击此控件,它会弹出一个对话框。在那个对话框里面进行设置就好了。

FireDAC 还提供了一个 TFDManager 控件。设计期拖一个出来放到界面上,指定其属性 ConnectionDefFileName 为外部ini文件,参数在外部ini文件的[mycon]小节中设置。这样是非常方便的:

① 如果程序中有多个 FDConnection 需要连接同一个数据库,对每个 FDConnection 进行参数设置,不管是设计期还是运行期,都是很麻烦的。但使用FDManager只需修改参数ConnectiondefName为mycon即可。

②如果参数需要在安装程序时进行修改,比如不同的场合数据库文件的路径不同,数据库服务器的 IP 地址不同等等,把这些参数写死在程序里面是不行的。使用FDManager,只需修改外部文件的参数即可,程序运行时自动从外部文件加载连接参数。

例如:config.ini

[MySqlCon]
Database=orders
User_Name=cds
Password=123456
Server=127.0.0.1
DriverID=MySQL
CharacterSet=Gb2312

 

本文为原创文章,转载请注明出处!

informix 通过ADO或ODBC连接提取数据时出现中文乱码的解决方法

最近在做一个项目,是对INFORMIX数据库的数据进行大数据分析,INFORMIX数据库数据有上亿条,没有linux的Root权限和informix数据的生产权限,只能读取。客户要求结果显示在内网windows WEB服务器上,终端通过浏览器来阅读。

我采用python+django+pandas+matplotlib。

首先要做的是:连接数据库并获取数据,其次要创建内网WEB服务,然后实现实时数据分析。

在做第一步时,就遇到INFORMIX的数据汉字编码问题。

现数据采用8859-1字符集,819编码。通过取数据分析,所有汉字为GBK编码的十六进制字符输出。

原生输出肯定为乱码,解决方案:网上能查到的唯一能解决的就是采用JDBC加连接输出控制实现。

我们既然知道出现乱码原因,就可以编程来实现。以下是我在HTML中和Django模板中解决乱码的方法。

一、ASP

<%
var _chrs = new Array();
var _db = new ActiveXObject(“ADODB.Connection”);
_db.Open(“provider = microsoft.jet.oledb.4.0;data source=” + Server.MapPath(“\data\\gbkdb.mdb”));
var _rs = new ActiveXObject(“ADODB.Recordset”);
var _sql=”Select * From gbk ”
_rs.open(_sql, _db);
var _tempi;
var _tempchr;
while(! (_rs.eof )) {
_tempchr=_rs(‘GBK’).value;
_tempi=parseInt(_tempchr, 16);
_chrs[_tempi]=_rs(‘CHRS’).value;
_rs.movenext;
}
_rs.close();
_db.close();

function gbk2chr(_str){
var _temp=”??”;
var _xiabiao=parseInt(_str, 16);
if (!((_chrs[_xiabiao]==”undefined”)||(_chrs[_xiabiao]==null)))
{_temp=_chrs[_xiabiao]}
return _temp;
}

function tounicode(str){
var tounicode1=””;
var len=str.length;
var code1=0;
var code2=0;
var code161=””;
var code162=””;
var _str1=””;
var _temp=””;
for(var i=0;i<len;i++){
code1 = str.charCodeAt(i);
code161 = code1.toString(16);
if (code1>159) {
code2 = str.charCodeAt(i+1);
code162 = code2.toString(16);
_str1=code161+code162;
tounicode1=tounicode1+gbk2chr(_str1);
i++
}
else {
tounicode1=tounicode1+code161;
}
}
return tounicode1;
}

%>

数据库后台取数后调用 tounicode()转换一下,即可在HTML页面正确显示汉字。

二、Django(这个要简单些)

def uni2gbk2(_str):

  if type(_str)!=str:
return _str
strl=len(_str)
a=””
i=0
while i<strl:
if ord(_str[i])>128:
a1=hex(ord(_str[i]))
a2=hex(ord(_str[i+1]))
i=i+2
ab=str(a1)[2:]+str(a2)[2:]
abb=bytearray.fromhex(ab)
a=a+abb.decode(“gbk”)
else:
a=a+_str[i]
i=i+1
return a

取数后,调用uni2gbk2转换即可

本文为原创文章,转载请注明出处!