XLSReadWriteII 读取EXCEL数据 动态响应字段的列编号
我们在通过XLSReadWriteII读取EXCEL表中的数据时,往往通过EXCEL中二个列,对应数据库中的指定字段,通过索引“字段”找到数据“字段”,实现读取相关数据。
报税系统,导出的个人所得税数据,就是存入在一个EXCEL表格中:EXCEL列编号B存放“姓名”,列编号AL存放"个人所得税"。
通过编程,我们很容易地,读取“个人所得税”的数据,加入到下一个月“工资报表”中的抵扣项的“个人所得税”中。
但是,由税务软件导出的EXCEL表“姓名”和“个所所得税”项目的“列编号”是动态变化的。2022年10份的EXCEL表,列编号AL存放"个人所得税",至2022年11月,列编号AM存放"个人所得税",列编号增长了。常规编程的处理方式,遇到问题。
解决办法,在导入数据前,加入一个对列编号的确认选择项。
代码如下:
xls := TXLSReadWriteII4.Create(Self);
XLS.Filename := sEdit2.Text;
XLS.Read;
S1:=sComboBox1.Text;
S2:=sComboBox2.Text;
iCow1:=TextToCol(S1); // 由Excel列英文字符获取Col A=1 AA=27 获取Col值
iCow2:=TextToCol(S2); // 由Excel列英文字符获取Col A=1 AA=27 获取Col值
// 外循环 EXCEL Row 0 至 N-1
for i:=XLS.Sheets[0].FirstRow+1 to XLS.Sheets[0].LastRow do // 行循环 +1 从第2行开始
begin
S1:=XLS.Sheets[0].AsFmtString[iCow1,i]; // 姓名 [列,行] 0..n-1 1
S2:=XLS.Sheets[0].AsFmtString[iCow2,i]; // 个税
// 内循环
with ClientDataSet1 do
begin
First;
while not Eof do
begin
if Trim(S1)=Trim(FieldByName('姓名').AsString) then
begin
Edit;
FieldByName(sDate).AsString:=S2;
Post;
end;
Next;
end;
First;
end;
end;
XLS.Free;