注册 登录
编程论坛 VFP论坛

xls工作表有表头的想导入DBF字段要如何处理一下

ls_y041 发布于 2021-11-13 19:27, 4864 次点击
这个表想不要表头字段,想用第4行的做为DBF的表的字段,数据类型正常就行,不知道能不能实现,谢谢



只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-11-13 20:10编辑过]

46 回复
#2
吹水佬2021-11-13 21:19
只有本站会员才能查看附件,请 登录

程序代码:
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
xlsFile = cDefPath + "信息管理.xls"
WITH CREATEOBJECT("Excel.Application")
    .DisplayAlerts = 0
    .WorkBooks.Open(xlsFile)
    nRow = .CountA(.Range("A:A")) - 2
    nCol = .CountA(.Range("4:4"))
    arr  = .Cells(5,1).Resize(nRow,nCol).Value
    .WorkBooks.Close
    .Quit
ENDWITH
CREATE CURSOR tt (序号 I, 零部件代码 C(10),零部件名称 C(10),建议销售价 I,销售分类 C(10),拼音代码 C(10),单位 C(10))
INSERT INTO tt FROM ARRAY arr
SELECT * FROM tt
#3
laowan0012021-11-13 21:25
吹版方法简洁明了

[此贴子已经被作者于2021-11-13 21:26编辑过]

#4
schtg2021-11-14 06:49
回复 楼主 ls_y041
你的建议销售价一定是整数吗?若有小数呢?
#5
ls_y0412021-11-14 12:29
吹版主做的太好了,已实现,但还有一个问题是想实现对一个表的按内容进行分表处理的

只有本站会员才能查看附件,请 登录
这个是个导入的模板我想用VFP写出来进行数据处理但一直没有搞成功,谢谢!!

[此贴子已经被作者于2021-11-14 12:38编辑过]

#6
吹水佬2021-11-14 14:05
以下是引用ls_y041在2021-11-14 12:29:47的发言:

吹版主做的太好了,已实现,但还有一个问题是想实现对一个表的按内容进行分表处理的

这个是个导入的模板我想用VFP写出来进行数据处理但一直没有搞成功,谢谢!!

不清楚具体做什么
具体说说数据处理的过程
#7
ls_y0412021-11-14 15:16
        COPY TO (ALLTRIM(I)+T+ ".XLS") TYPE XLS

这个模板中的SHEET1的名称必须是“销售出库明细导入”

这样可以运行,只是不太明白,速度慢了一点
LOCAL fsheet,fname,oExcel,fname1
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
xlsFile = cDefPath + "维修发料统计.xls"
WITH CREATEOBJECT("Excel.Application")
    .DisplayAlerts = 0
    .WorkBooks.Open(xlsFile)
    nRow = .CountA(.Range("A:A")) - 2
    nCol = .CountA(.Range("4:4"))
    arr  = .Cells(5,1).Resize(nRow,nCol).Value
    .WorkBooks.Close
    .Quit
ENDWITH
CREATE CURSOR tt (序号 I,经销商简称    C(10),工单号 c(12),零部件代码 C(18),零部件名称 C(30),仓库代码 C(10),库位代码 C(12),零部件数量 N(6,2),销售单价 N(6,2),零部件销售金额 N(6,2),零部件成本金额 N(6,2),车牌号 C(10),车系 C(10),领料人 C(10))
INSERT INTO tt FROM ARRAY arr
SELECT * FROM tt INTO DBF 细.dbf
  REPLACE 仓库代码 WITH Iif("TW-" $ 零部件代码, '配件仓库B', '配件仓库A') ALL
  REPLACE 工单号 WITH righ(工单号,10) all
  SELECT  序号 ,工单号,零部件代码,零部件名称,销售单价,SUM(零部件数量) as  数量,领料人,仓库代码,车牌号 FROM 细 GROUP BY 工单号,零部件代码,销售单价,领料人 ,车牌号,零部件名称 ,仓库代码,序号  INTO DBF 明细.dbf
               **     序号    经销商简称    工单号    零部件代码    零部件名称    仓库代码    库位代码    零部件数量    零部件销售单价    零部件销售金额    零部件成本金额    车牌号    车系    领料人    维修类型
SET DEFAULT TO d:\xls
SELECT DISTINCT 工单号 FROM 明细 INTO CURSOR RKD
oExcel=Createobject("Excel.application") && 打开EXCEL
oExcel.Visible=.F. && 不显示EXCEL界面
SCAN
    SELECT 序号 as 行,车牌号 as T,零部件代码 AS 项目,零部件名称 as 说明,序号 AS 套餐,序号 AS W,数量,;
    销售单价 as 含税单价,序号 as 折扣,序号 as 总计,序号 as V,序号 as P,工单号 AS I,仓库代码 as 仓库名称 ;
    FROM 明细 WHERE 工单号 == RKD.工单号 INTO CURSOR TEMP
   fsheet = ALLTRIM(I)+ALLTRIM(T) && sheet 的名称
   fname  = fsheet + ".XLS"
   COPY TO (fname) TYPE XLS
   *!* 修改Sheet1名称
   oExcel.Workbooks.Open("D:\xls\"+ fname)
   oExcel.Worksheets(fsheet).Activate && 激活sheet表格,因为导进去的名称是文件名称
   oExcel.ActiveSheet.Name="销售出库明细导入"
   oExcel.ActiveWorkbook.Save
   oExcel.Workbooks.Close

   USE IN TEMP
ENDSCAN
oExcel.Quit && 退出EXCEL


[此贴子已经被作者于2021-11-14 19:08编辑过]

#8
laowan0012021-11-14 18:02
* 楼上后半段程序是不是下面这个意思

scan
    ....
    copy to 销售出库明细导入.xls type xls
    rename 销售出库明细导入.xls to &fname
endscan
#9
ls_y0412021-11-14 18:56
结果是不对的,修改名称后sheet1的名称也修改了,不行,不能导入

[此贴子已经被作者于2021-11-14 19:28编辑过]

#10
ls_y0412021-11-14 19:42
回复 6楼 吹水佬
工作流程是这样的,从一个表中把数据取出来按工单号对表中数据进行分表,以工单号为工作表的名称,每个工作表的SHEET1的名称为"销售单导入"这个不会处理了,谢谢
想再问一下如何工作表的字段顺序是变化的,要如何处理字段,就是说字段名是排序是不固定。

[此贴子已经被作者于2022-3-20 08:01编辑过]

#11
laowan0012021-11-14 21:33
回复 9楼 ls_y041
我的想法确实有问题,因为基本不用xls,所以没注意到还会这样子
你7楼的程序里不是已经改了sheet的名字了吗?
   oExcel.Worksheets(fsheet).Activate && 激活sheet表格,因为导进去的名称是文件名称
   oExcel.ActiveSheet.Name="销售出库明细导入"
   oExcel.ActiveWorkbook.Save
#12
吹水佬2021-11-15 10:00
回复 10楼 ls_y041
7楼的做法就可以,喜欢用EXCEL就要接受慢的感觉
#13
laowan0012021-11-15 10:50
一定要用xls格式吗?
#14
ls_y0412021-11-15 12:43
回复 12楼 吹水佬
只有本站会员才能查看附件,请 登录
#15
wengjl2021-11-17 14:25
以下是引用吹水佬在2021-11-13 21:19:06的发言:


cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
xlsFile = cDefPath + "信息管理.xls"
WITH CREATEOBJECT("Excel.Application")
    .DisplayAlerts = 0
    .WorkBooks.Open(xlsFile)
    nRow = .CountA(.Range("A:A")) - 2
    nCol = .CountA(.Range("4:4"))
    arr  = .Cells(5,1).Resize(nRow,nCol).Value
    .WorkBooks.Close
    .Quit
ENDWITH
CREATE CURSOR tt (序号 I, 零部件代码 C(10),零部件名称 C(10),建议销售价 I,销售分类 C(10),拼音代码 C(10),单位 C(10))
INSERT INTO tt FROM ARRAY arr
SELECT * FROM tt


吹版好:
上述代码测试很灵光。所以,换成我的EXCEL表,因为有31万多条记录,25个字段,我想提高效率,结果执行到上面标红的那一句数组,就卡住了。
请问 数组里最多能存放多少条记录?

因为我一个一个单元格读,要花一节课左右的时间,想提高效率,还有点难啊!

[此贴子已经被作者于2021-11-17 14:27编辑过]

#16
laowan0012021-11-17 15:00
做个循环呗,5000或10000条读一次就没问题了
#17
吹水佬2021-11-17 15:06
回复 14楼 ls_y041
可能是EXCEL版本兼容问题
试试将 oExcel.ActiveWorkbook.Save 这句改为:
ActiveWorkbook.SaveAs("D:\xls\"+ fname, 56, "", "", 0, 0)
#18
吹水佬2021-11-17 15:16
回复 15楼 wengjl
31万多行,够强大的EXCEL表,不是用手编辑的吧。
可能分配给数组的资源有限,或是数据量大一时应付不来。
参考16楼意见,可以分块处理。
#19
wengjl2021-11-17 15:32
参考16楼,500条一次,数次以后就不行了。 我判断是arr  = .Cells(i,1).Resize(i+500,nCol).Value 循环中使用时,之前的不会清空

所以问一下,数组里的数据清空的命令是什么?
#20
wengjl2021-11-17 15:33
历史库存 31万多,是ERP系统中导出来的
#21
wengjl2021-11-17 15:35
以下是引用laowan001在2021-11-17 15:00:16的发言:

做个循环呗,5000或10000条读一次就没问题了


一语点醒梦中人。
试了,循环几次就卡壳了。 猜想是 数组里 前一次的数据不清空造成超额了。不知道清空数组的命令是什么?
#22
laowan0012021-11-17 15:38
循环中加一句
dimension arr[1]
试试
#23
wengjl2021-11-17 15:45
试了,还是不行
#24
laowan0012021-11-17 15:52
回复 23楼 wengjl
报错在哪一句?
#25
wengjl2021-11-17 15:55
仔细研究,每次500条记录
第1次追加到DBF的是500
第2次追加到DBF的是1000
第3次追加到DBF的是1500
第4次追加到DBF的是2000
第5次追加到DBF的是2500
第6次追加到DBF时 就提示出错,即超越了数组的承载量。
所以循环中需要对数组里的数据,进行清空,再写入。   我现在最大的难处 就是不知道如何清空数组时第一次写入的500条

#26
wengjl2021-11-17 15:58
程序代码:
SET SAFETY OFF
CLOSE DATABASES

  PUBLIC mypath,c_ym
  cCurrentProcedure = SYS(16,1)
  nPathStart = AT(":",cCurrentProcedure)- 1
  nLenOfPath = RAT("\", cCurrentProcedure) - (nPathStart)
  mypath=SUBSTR(cCurrentProcedure, nPathStart, nLenofPath)
  SET DEFAULT TO (mypath)
  
  *xlsFile = cDefPath + "lskc_2110.xlsx"         &&& 设置EXCEL表的变量赋值
  SELECT 0
  USE lskc_sjk ALIAS bmk
  ZAP
  M_File=getfile()
  myexcel=createobject('excel.application')          &&创建一个对象
  IF !VARTYPE(myexcel)$"Oo"      &&& 如果用户的电脑上未装EXCEL软件,则结束运行。
    MESSAGEBOX("建立EXCEL文件失败,请检查OFFICE是否正常!",48,"提醒:")
    RETURN
  ENDIF
  myexcel.visible=.T.                                && 对象不可见
  bookexcel=myexcel.workbooks.open(M_File)            && 打开指定文件
  WITH myexcel         &&& 创建EXCEL项目对象,并进行相关属性的循环
      .DisplayAlerts = 0         &&& 关闭对话框
*      .WorkBooks.[color=#0000FF]Open(xlsFile)         &&& 打开EXCEL工作簿[/color]
      nRow = .CountA(.Range("B:B")) - 1         &&& 获取数据行数(.CountA(.Range("A:A")这个函数记的是A列中内容不空的单元格个数。)
*      ? nRow
      nCol = .CountA(.Range("1:1"))         &&& 获取数据列数
*      ? nCol
*      arr  [color=#808080]= .Cells(2,1).Resize(nRow,nCol).Value         &&& 将数据存入数组中[/color]
*      .WorkBooks.[color=#0000FF]Close         &&& 关闭工作簿[/color]
*      .Quit          [color=#808080]&&& 退出项目[/color]
  ENDWITH          &&& 结束循环
  FOR i=2 TO nRow STEP 500
  ? i
     arr= myexcel.cells(i,1).resize(i+499,nCol).value
     SELECT bmk
     INSERT INTO bmk FROM ARRAY arr        &&& 将数组中的数据,追加到DBF表中
     *dimension arr
  NEXT i
SELECT * FROM bmk         &&& 选定表浏览
CLOSE DATABASES


就是     arr= myexcel.cells(i,1).resize(i+499,nCol).value  这一句
#27
wengjl2021-11-17 16:01
只有本站会员才能查看附件,请 登录
#28
wengjl2021-11-17 16:02
进到DBF里有数据7500,按理5次 是2500 的
#29
吹水佬2021-11-17 18:48
arr= myexcel.cells(i,1).resize(i+499,nCol).value
resize是每次的行数和列数
arr= myexcel.cells(i,1).resize(500,nCol).value
#30
吹水佬2021-11-17 18:51
还有最后不足500行的问题,会产生空记录
#31
laowan0012021-11-17 19:01
realease arr 呢
#32
吹水佬2021-11-17 21:16
以下是引用吹水佬在2021-11-17 18:51:05的发言:

还有最后不足500行的问题,会产生空记录

这样试试
程序代码:
rs = 500  && 每次行数
FOR i=1 TO nRow STEP rs
    r = IIF((i+rs)<=nRow, rs, nRow-i+1)
    arr = myexcel.cells(i,1).resize(r,nCol).value  
    INSERT INTO bmk FROM ARRAY arr        &&& 将数组中的数据,追加到DBF表中
ENDFOR
#33
wengjl2021-11-18 08:17
以下是引用吹水佬在2021-11-17 18:48:00的发言:

arr= myexcel.cells(i,1).resize(i+499,nCol).value
resize是每次的行数和列数
arr= myexcel.cells(i,1).resize(500,nCol).value


非常感谢吹版的指导。 原来是我没明白 的缘故。 完美解决,原来要40分钟,现在只是1分钟解决了31万多数据的转换,最后有多余的空行,只要加一个dele和pack就好了。再次感谢!
#34
ls_y0412021-11-24 06:09
想问一下用vfp 可以生成excel 2003版本的吗文件吗
#35
wengjl2021-11-24 08:31
SET SAFETY OFF
MyPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (MyPath)   
WITH CREATEOBJECT("Excel.Application")     
    .visible=.t.
    .DisplayAlerts = 0  
    .workbooks.add
    .cells(1,1).value="测试EXCEL另存为各种格式的参数"
    .activeworkbook.SaveAs(MyPath+"测试EXCEL另存为各种格式的参数.xls",56)     &&& 39-表示:5.0/95工作簿,56-EXCEL 97-2003工作簿
    .WorkBooks.Close
    .Quit
ENDWITH  

以上VFP8 和 EXCEL2007 通过

[此贴子已经被作者于2021-11-24 10:09编辑过]

#36
ls_y0412021-11-24 18:56
还想再问一下如果是csv的文件吹版主的代码要如何实现,谢谢
#37
吹水佬2021-11-24 19:19
以下是引用ls_y041在2021-11-24 18:56:15的发言:

还想再问一下如果是csv的文件吹版主的代码要如何实现,谢谢

CSV格式VFP的 APPEND FROM 就支持
 
#38
ls_y0412021-11-24 20:03
主要是想应用您写的前面的示例代码,把表头的文件去掉,谢谢
#39
吹水佬2021-11-24 20:11
以下是引用ls_y041在2021-11-24 20:03:25的发言:

主要是想应用您写的前面的示例代码,把表头的文件去掉,谢谢

什么“表头的文件”
给个文件看看
#40
ls_y0412021-11-24 20:24
只有本站会员才能查看附件,请 登录

再想问一下,我想把这个代码生成EXE,只是一个PRG实现一下要如何处理,谢谢
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-11-24 21:06编辑过]

#41
吹水佬2021-11-24 20:37
回复 40楼 ls_y041
编译VFP的项目生成EXE
#42
ls_y0412022-03-21 11:15
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
xlsFile = cDefPath + "信息管理.xls"
WITH CREATEOBJECT("Excel.Application")
    .DisplayAlerts = 0
    .WorkBooks.Open(xlsFile)
    nRow = .CountA(.Range("A:A")) - 2
    nCol = .CountA(.Range("4:4"))
    arr  = .Cells(5,1).Resize(nRow,nCol).Value
    .WorkBooks.Close
    .Quit
ENDWITH
CREATE CURSOR tt (序号 I, 零部件代码 C(10),零部件名称 C(10),建议销售价 I,销售分类 C(10),拼音代码 C(10),单位 C(10))
INSERT INTO tt FROM ARRAY arr
SELECT * FROM tt

想问一下如何这个工作表的字段是不固定的时候,CREATE CURSOR tt (序号 I, 零部件代码 C(10),零部件名称 C(10),建议销售价 I,销售分类 C(10),拼音代码 C(10),单位 C(10))这个要如何处理一下来适应,谢谢!!!
#43
吹水佬2022-03-21 14:28
回复 42楼 ls_y041
先取出EXCEL表栏目的行,然后动态生成语句:code = "CREATE CURSOR tt (,,,,,,)" 串,用 EXECSCRIPT(code)
#44
ls_y0412022-03-21 14:46
有空帮助示例一下吧,这个不太会处理。谢谢!!!!
#45
吹水佬2022-03-21 21:13
以下是引用ls_y041在2022-3-21 14:46:23的发言:

有空帮助示例一下吧,这个不太会处理。谢谢!!!!

上面的代码不是有行列变量值,乱改也能撞得到吧,动动手好过在等
#46
wengjl2022-03-22 08:12
以下是引用ls_y041在2022-3-21 14:46:23的发言:

有空帮助示例一下吧,这个不太会处理。谢谢!!!!

把数据发上来,帮你做一个。因为这二天有时间
#47
ls_y0412022-03-22 09:20
只有本站会员才能查看附件,请 登录
这个是我想实现的表,带黄色是我想要的字段,其他的字段都 可以不要了,但这个表是别人的有时字段总不是固定的,左右顺序不固定,我想要的字段是有的,请帮助示例一下,谢谢。。。。
1