注册 登录
编程论坛 VFP论坛

求教excel单元格中,有TAB,APPEND FROM后不能正常,怎么解决,谢谢!

fifowl2001 发布于 2021-05-25 17:56, 3977 次点击
上面的图是APPEND后的,下面的是原来的CSV文件,直接用XLS转的,求教,如何解决这种问题,不能反映为同一记录内,WIN10,VFP9.0 感谢ing!

    myexcel.workbooks(f_t1).SaveAs(f_t2,6)

APPEND FROM  &f_t2 TYPE DELIMITED

只有本站会员才能查看附件,请 登录
24 回复
#2
sdta2021-05-25 18:07
没有测试环境,无能为力
纸上谈兵是解决不了问题的

[此贴子已经被作者于2021-5-25 18:12编辑过]

#3
laowan0012021-05-26 08:26
CSV文件那个单元格里有回车符吧
#4
xuminxz2021-05-26 08:38
最可靠的方法是地导入到ACCESS中,它与Excel是一个套装的软件,兼容性好。再导到DBF中。因为ACCESS与DBF都是数据库,有共同的数据规则。
#5
fifowl20012021-05-26 09:31
以下是引用xuminxz在2021-5-26 08:38:17的发言:

最可靠的方法是地导入到ACCESS中,它与Excel是一个套装的软件,兼容性好。再导到DBF中。因为ACCESS与DBF都是数据库,有共同的数据规则。



好的,谢谢咯,我试试,也算曲线救国了,没办法,原来SQL里面导出来的,操作流程问题,数据乱七八糟的
#6
xuminxz2021-05-26 09:59
回复 5楼 fifowl2001
SQL可以直接导为DBF啊
#7
mywisdom882021-05-26 12:33
代码问题,我们公司的ERP,以前导出数据时CSV,经常N条记录导在一起的,后来,好像记录中有些特殊字符导致的
#8
laowan0012021-05-26 14:22
把CSV文件读进来,把TAB都删除掉就可以了
#9
吹水佬2021-05-26 15:16
从XLS转过来的
给个XLS示范文件看看
#10
fifowl20012021-05-26 15:35
以下是引用吹水佬在2021-5-26 15:16:45的发言:

从XLS转过来的
给个XLS示范文件看看

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


就这个了,我做了节选记录,第一条就是直接导入有问题
#11
吹水佬2021-05-26 16:53
回复 10楼 fifowl2001
是换行符(0h0A),首尾都有,一个0h0A就相当多了一行。
要处理一下,先清除首尾,其他替换为其他分隔符。
#12
fifowl20012021-05-27 08:56
回复 11楼 吹水佬
尝试使用VBA写入查找替换功能?会不会是比较好的解决方案
#13
wengjl2021-05-27 10:26
用VFP打开EXCEL,再从单元格读取数据到DBF,测试正常
#14
fifowl20012021-05-27 10:42
回复 13楼 wengjl
逐个格读取Value是正常的,但在数据比较多的时候,速度就比较慢了
#15
fifowl20012021-05-27 13:58
更新一下,找到replace,但是还没试对“换行符”的写法,试过了0h0A,char(10)
语法情况如下

myexcel.ActiveWorkbook.sheets(1).cells(&cell1).replace(0h0A," ") 无效
myexcel.ActiveWorkbook.sheets(1).cells(&cell1).replace(char(10)," ")报错
myexcel.ActiveWorkbook.sheets(1).cells(&cell1).replace(""," ") 无效

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

#16
吹水佬2021-05-27 14:12
用APPEND FROM 命令应该不适合
不只是“规格说明”换行符的问题
还有“采购金额”的千分位问题,CSV是以分号分隔的不好处理
试试改用TAB分隔,再替换转换类型写入DBF
程序代码:
CLEAR
CLEAR ALL
SET SAFETY OFF
cPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
cXLS = cPath + "pupi_CUR_TEST.xls"
cTXT = cPath + "pupi_CUR_TEST.txt"
oExcel = CREATEOBJECT("Excel.Application")
oExcel.DisplayAlerts = .F.
oExcel.WorkBooks.Open(cXLS)
oExcel.ActiveWorkBook.SaveAs(cTXT, -4158)
oExcel.WorkBooks.Close
oExcel.Quit
CREATE CURSOR tt (操作员 V(10), 采购合同号 V(20), 供应商 V(30), 签约日期 V(10),;
                  交货日期 V(10), 产品编码 V(10), 规格编号 V(20), 商品名称 V(30),;
                  规格说明 V(100), 商品总量 I, 单位 V(10), 币种 V(10), 采购金额 N(12,2))  
FOR i=2 TO ALINES(aRow,FILETOSTR(cTXT),0h0D0A)
    ALINES(aCol, aRow[i], 0h09)
    INSERT INTO tt VALUES (aCol[1],aCol[2],aCol[3],aCol[4],aCol[5],aCol[6],aCol[7],aCol[8],;
                           STRTRAN(STRTRAN(aCol[9],0h0A,"、"),0h22,""),;  &&规格说明
                           VAL(aCol[10]),;  &&商品总量
                           aCol[11],aCol[12],;
                           VAL(CHRTRAN(aCol[13],0h222C,"")))  &&采购金额
ENDFOR
SELECT * FROM tt
RETURN
#17
fifowl20012021-05-27 14:24
回复 16楼 吹水佬
DBF里面的字段什么的,我不打算在这步骤里面处理,稍后使用MYDLL里面的FTRIM搞,试过,没太大问题
#18
fifowl20012021-05-27 14:31
回复 16楼 吹水佬
谢谢大佬的方法,蛮香的,可以解决大部分问题,我修改了一下,我不只是针对这个文件用的,SQL服务器上出来的CSV文件,因为实际问题,前端客户填写随意,导致后期只能靠程序补救统计记录,谢谢!
#19
fifowl20012021-05-28 11:19
稍作了修改,应该是Aline函数不熟,提示“下界超标”
#20
吹水佬2021-05-28 14:20
以下是引用fifowl2001在2021-5-28 11:19:40的发言:

稍作了修改,应该是Aline函数不熟,提示“下界超标”

可能是要处理的字符串或使用的分隔符与实际不符
可以先判断ALINES()的返回值(下标界限值)
#21
sdta2021-05-28 15:33
程序代码:
SET SAFETY OFF
CREATE CURSOR tt (操作员 V(10), 采购合同号 V(20), 供应商 V(30), 签约日期 V(10),;
                  交货日期 V(10), 产品编码 V(10), 规格编号 V(20), 商品名称 V(30),;
                  规格说明 V(100), 商品总量 I, 单位 V(10), 币种 V(10), 采购金额 N(12,2))
cPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
cXLS = cPath + "pupi_CUR_TEST.xls"
cTXT = cPath + "pupi_CUR_TEST.txt"
oExcel = NEWOBJECT("Excel.Application")
WITH oExcel
    .WorkBooks.Open(cXLS)
    .ActiveSheet.UsedRange.Select
    WITH .Selection
        .Columns.WrapText = .F.
        .Columns.AutoFit
        nRow = .Rows.Count - 1
        nColumn = .Columns.Count
         LOCAL ArrayName[nRow, nColumn]
        ArrayName = .Cells(2, 1).Resize(nRow, nColumn).Value
    ENDWITH
    INSERT INTO TT FROM ARRAY ArrayName
    .DisplayAlerts = .F.
    .WorkBooks.Close
    .Quit
ENDWITH
BROWSE  

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


[此贴子已经被作者于2021-5-28 16:05编辑过]

#22
fifowl20012021-05-29 11:34
回复 21楼 sdta
厉害,算是暴力重新规则化,再导入
#23
fifowl20012021-05-29 11:57
已经解决,多谢各位大神帮忙
#24
sdta2021-05-29 15:44
以下是引用fifowl2001在2021-5-29 11:57:56的发言:

已经解决,多谢各位大神帮忙

能公布下解决方案吗,供大家学习
#25
fifowl20012021-05-31 10:18
程序代码:

f_t1='E:\futong\pupi_CUR.xls'

f_tp= JUSTpath(f_t1)+'\'
f_tn=JUSTSTEM(f_t1)
f_tt=JUStext(f_t1)
f_t3=f_tp+f_tn+'.txt'

IF USED('feildname ')
SELECT feildname
USE
ELSE
CREATE CURSOR feildname (fname c(20))
ENDIF

myexcel=createobject('excel.application')
WITH myexcel
   .visible=.F.
   .DisplayAlerts=.f.
   .workbooks.open(f_t1)

    Usedrow1 =.workbooks(f_t1).sheets(1).UsedRange.Rows.Count
    Usedcol1 =.workbooks(f_t1).sheets(1).UsedRange.columns.Count


  FOR i1=1 TO Usedcol1
     cell2=+'1,'+ALLTRIM(STR(i1))
     feild_t=.ActiveWorkbook.sheets(1).cells(&cell2).value
 
     ?feild_t
     ?ISNULL(feild_t)
  
     SELECT * FROM feildname WHERE  ALLTRIM(fname)=ALLTRIM(feild_t)into CURSOR temp1
     rec_t=recc()
 
     DO CASE
     CASE ISNULL(feild_t)=.t.
      feild_t='a'+ALLTRIM(STR(i1))
     CASE (BETWEEN(asc(LEFT(feild_t,1)),65,90)or BETWEEN(asc(LEFT(feild_t,1)),97,122)) AND rec_t#0
      feild_t=ALLTRIM(feild_t)
     CASE  ASC(LEFT(feild_t,2))>10000
      feild_t=ToPy(feild_t)
     ENDCASE
 
     INSERT INTO feildname (fname )values (feild_t)
 
      IF i1=1
         CREATE CURSOR &f_tn (&feild_t v(100))
      ELSE
         ALTER table &f_tn ADD COLUMN &feild_t v(100)
      ENDIF  

   ENDFOR

          .ActiveSheet.UsedRange.Select
           WITH .Selection
               .Columns.WrapText = .F.
               .Columns.AutoFit
                nRow = .Rows.Count - 1
                nColumn = .Columns.Count
                LOCAL ArrayName[nRow, nColumn]
                ArrayName = .Cells(2, 1).Resize(nRow, nColumn).Value
           ENDWITH
    INSERT INTO &f_tn FROM ARRAY ArrayName

   .ActiveWorkbook.saved=.f.
   .Workbooks.Close
   .DisplayAlerts=.t.
   .quit
ENDWITH
1