注册 登录
编程论坛 VFP论坛

请教excel数据导入dbf问题?

wxzd123 发布于 2023-06-15 21:02, 2345 次点击
Excel数据是从网上粘到表格的如图
只有本站会员才能查看附件,请 登录

Replace 字段 With excel.cells(1,1).Value
在dbf表中
只有本站会员才能查看附件,请 登录

多出不是文字的字符,请教各位老师如何解决?谢谢
27 回复
#2
吹水佬2023-06-15 21:14
字段是C类型吧,改M类型看看
#3
wxzd1232023-06-16 06:48
版主您好,m型也有,这些好像是网页上的一些设置,不一定是?,还有其他的,不同的网页粘回来的不一样
#4
吹水佬2023-06-16 07:02
回复 3楼 wxzd123
取出来看看就清楚是什么字符,通常是一些不可打印的控制符,不需要就去掉。
#5
laowan0012023-06-16 09:32
excel表里有不可见的字符,试试把chr(9),chr(10)去掉看看
#6
wxzd1232023-06-17 21:13
两位版主好,目前转换后多出
只有本站会员才能查看附件,请 登录
,以前转时好像还有其他,请帮忙看一下如何去掉,现把表格上传,谢谢
只有本站会员才能查看附件,请 登录

#7
吹水佬2023-06-18 08:16
excel用unicode编码,可能有些字VFP识别不了就当是?号了。
如果确定所有正常数据都不包含?号就好办,清除掉就是。
否则,就有点麻烦,要区分清楚哪些?号是不能清除的。
或者可先在excel里清除掉那些“乱码”字,下图是截取一段的unicode编码,其中A0就是那个“?”
只有本站会员才能查看附件,请 登录



#8
吹水佬2023-06-18 10:07
只有本站会员才能查看附件,请 登录

程序代码:
cPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
sc = CREATEOBJECT("ScriptControl")
sc.Language = "VBScript"
TEXT TO vbsCode TEXTMERGE NOSHOW PRETEXT 7
    function fun(cFile)
        dim excel
        set excel = createobject("Excel.Application")
        excel.workbooks.open(cFile)
        excel.Cells.Replace ChrW(&hA0), ""
        nRow = excel.sheets(1).UsedRange.Rows.Count
        nCol = excel.sheets(1).UsedRange.Columns.Count
        fun = excel.Cells(1,1).Resize(nRow,nCol).Value   
        excel.ActiveWorkBook.Saved = 1
        excel.workbooks.close
        excel.quit
    end function
ENDTEXT  
sc.AddCode(vbsCode)
arr = sc.Run("fun", cPath+"表格.xls")
CREATE CURSOR tt (f1 M)
INSERT INTO tt FROM ARRAY arr
SELECT * FROM tt
#9
wxzd1232023-06-18 15:11
版主这也太神奇了,速度还快,有些地方看不太懂,请问如果没有安装EXCEL或WPS,判断代码写在set excel = createobject("Excel.Application")后面?
#10
nbwww2023-06-18 15:44
试试LIBXL的方式   2万记录  秒取


[此贴子已经被作者于2023-6-18 18:41编辑过]

#11
wxzd1232023-06-18 16:52
回复 10楼 nbwww
您好,这个libxl.dll有什么限制吗
#12
nbwww2023-06-18 17:01
如果是自己闹着玩的  有KEY就放心用
如果商用购买见下图
只有本站会员才能查看附件,请 登录
#13
schtg2023-06-18 17:04
回复 8楼 吹水佬
高!
#14
schtg2023-06-18 17:04
回复 10楼 nbwww
好!
#15
wxzd1232023-06-18 17:45
回复 8楼 吹水佬
版主您好 set excel = createobject("Excel.Application")和excel = createobject("Excel.Application")有什么区别?
上面一行加Try不行?
#16
wxzd1232023-06-18 21:25
只有本站会员才能查看附件,请 登录

这个表格出现对话框
只有本站会员才能查看附件,请 登录
#17
吹水佬2023-06-18 21:41
回复 16楼 wxzd123
表格.xls
有提示.xls
两个文件不一样,“表格.xls”的问题不等于也是“有提示.xls”的问题,不一定能用解决“表格.xls”问题的方法来解决“有提示.xls”的问题。
#18
吹水佬2023-06-18 21:55
以下是引用wxzd123在2023-6-18 17:45:39的发言:

版主您好 set excel = createobject("Excel.Application")和excel = createobject("Excel.Application")有什么区别?
上面一行加Try不行?

不同一种编程语言,VBS与VFP的区别吧。
#19
wxzd1232023-06-19 05:42
回复 17楼 吹水佬
版主您好,请问如何加一个判断是否包含A0,如果包含就执行 excel.Cells.Replace ChrW(&hA0), ""语句,谢谢
#20
吹水佬2023-06-19 07:38
以下是引用wxzd123在2023-6-19 05:42:44的发言:

版主您好,请问如何加一个判断是否包含A0,如果包含就执行 excel.Cells.Replace ChrW(&hA0), ""语句,谢谢

加个查找判断。但要看具体情况,不只是A0才会出现?,所有VFP不能识别的字都会被换成?
程序代码:

        wA0 = ChrW(&hA0)
        if not excel.Cells.Find(wA0) is nothing then
            excel.Cells.Replace wA0,""
        end if
#21
厨师王德榜2023-06-19 14:04
1 , 你的DBF,最好用M型 字段来装这些题目.
2 , 我觉得无需判断哪些字符要过滤,因为VFP已经帮我们过滤了,VFP不认识的,他全转换为"?",我们把"?"过滤了就行了.

参考代码如下:
原语句: REPLACE z1 WITH  oExcelApp.cells(i,1).Value
改为:   REPLACE z1 WITH  str1_str2(oExcelApp.cells(i,1).Value)
加一个Function:
FUNCTION str1_str2(s0 as String) as String
    RETURN STRTRAN(s0,CHR(63),CHR(32))   
ENDFUNC
#22
wxzd1232023-06-19 21:28
回复 20楼 吹水佬
版主您好,?去掉了但还有方块如图
只有本站会员才能查看附件,请 登录
#23
wxzd1232023-06-19 21:32
回复 21楼 厨师王德榜
您好,这种方法原文中有?会去掉,同样有方块没有去掉如图
只有本站会员才能查看附件,请 登录
#24
吹水佬2023-06-19 23:02
以下是引用wxzd123在2023-6-19 21:28:13的发言:

版主您好,?去掉了但还有方块如图

那个是“换行”符,原本是多行。
#25
wxzd1232023-06-20 05:51
哦,谢谢版主
#26
wxzd1232023-07-15 14:55
请教吹水佬版主
以下是引用吹水佬在2023-6-18 10:07:15的发言:


cPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
sc = CREATEOBJECT("ScriptControl")
sc.Language = "VBScript"
TEXT TO vbsCode TEXTMERGE NOSHOW PRETEXT 7
    function fun(cFile)
        dim excel
        set excel = createobject("Excel.Application")
        excel.workbooks.open(cFile)
        excel.Cells.Replace ChrW(&hA0), ""
        nRow = excel.sheets(1).UsedRange.Rows.Count
        nCol = excel.sheets(1).UsedRange.Columns.Count
        fun = excel.Cells(1,1).Resize(nRow,nCol).Value   
        excel.ActiveWorkBook.Saved = 1
        excel.workbooks.close
        excel.quit
    end function
ENDTEXT  
sc.AddCode(vbsCode)
arr = sc.Run("fun", cPath+"表格.xls")
CREATE CURSOR tt (f1 M)
INSERT INTO tt FROM ARRAY arr
SELECT * FROM tt


这段代码,当excel表格是数字无论单元格式是常规还是文本导入到字符型字段后,在数字后面加点和0.
#27
wxzd1232023-07-15 14:57
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
#28
吹水佬2023-07-15 20:54
VFP表的列元素数据类型一个样,excel表的列元素数据不一样是不是先要统一一下
1