RT
用这样的方式连接EXCEL时,可以编辑里面的数据 ,但是里面纯数字无法显示,显示为空,比如: 123 ,显示时为空
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+OpDExcel.FileName+';Extended Properties="Excel 8.0;Persist Security Info=False;"'
用这个连接串则可以显示所有的东西,但是无法修改数据:
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+OpDExcel.FileName+';Extended Properties="Excel 8.0;IMEX=1;Persist Security Info=False;"'  //多加了一个 IMEX=1 即以文本的方式显示
哪位有碰到过这种情况的?该怎么处理,让它即可以完整的显示内容,又可以修改数据?....谢谢!!!!

解决方案 »

  1.   

    补充一下,程序已经这样设置了 adoconnection1.mode := cmReadWrite ;
      

  2.   

    Selection.NumberFormatLocal = "@"先将单元格的格式改为文本,才行,DELPHI是调用EXCEL里面的动态联接库,所以,你遇到这样的问题可以直接在EXCEL里面录制下宏,然后查看宏的原码,拿过来DELPHI,直接就可以用。
      

  3.   

    谢谢楼上的,不太明白你说的呢
    我是把EXCEL的数据显示到表格中,你说的代码在哪里写哪?
      

  4.   

    我想你的问题也是如何操作xls并从中取得数据吧?刚回答别人的类似问题,我写一个简单的范例,希望对你有所帮助:var
        xlsFile:   String;
        xlsApp,   Sheet:   OleVariant;
    begin
        Result   :=   '';
        try
            xlsFile   :=   'c:\file1.xls';
            xlsApp   :=   CreateOleObject('Excel.Application');   //需要引用   ComObj   单元
            try
                //打开xls文件
                xlsApp.WorkBooks.Open(xlsFile);
                Sheet   :=   xlsApp.Sheets[1];
                try
                    //光标归位到Excel档第一页第一格
                    if   xlsApp.ActiveSheet.Index   <>   Sheet.Index   then
                        Sheet.Select;
                    Sheet.Cells.Item[1,1].Select;
                    //显示第3行第5列的数据,可参考此句用循环与判断取出xls中所有数据
                    ShowMessage(VarToStr(Sheet.Cells.Item[3,5].Value));
                end;
            finally
                Sheet   :=   unassigned;
                xlsApp.Quit;
                xlsApp   :=   Unassigned;
            end;
        except
            ShowMessage('无法启动Excel程式,请检查!');
        end;
    end; 
      

  5.   

    谢谢楼上的,现在要的不是获取EXCEL数据,已经用ADO连接到EXCEL,采用下面这种连接方式时 可以显示,问题是不能修改数据,修改后会提示,操作必须用到一个可更新的查询
    'Provider=Microsoft.Jet.OLEDB.4.0;Data   Source='+OpDExcel.FileName+';Extended   Properties="Excel   8.0;IMEX=1;Persist   Security   Info=False;"'     //多加了一个   IMEX=1   即以文本的方式显示
    如果把连接串中的 IMEX=1 去掉,则可以修改,但是全为数字的单元格内容显示不出来,显示为空,比如 1 2 3 4 5 
    那在程序的表格中,显示全为空的!
      

  6.   

    将EXCEL的单元格格式改为文本,则可以显示和修改,只是不知道如何在程序中设置EXCEL的单元格格式....
    哪位高人帮忙..
      ExcelApplication1.Connect;
      ExcelApplication1.Visible[0] := false;  
      ExcelApplication1.Workbooks.Open(OpDExcel.FileName,  null, null, null, null, null, null,
           null, null, null, null, null, null, 0);
      ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks[1]); 
      ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Worksheets[1] as _Worksheet);
      ExcelWorkSheet1.Range[GetRepRange(x1,y1),GetRepRange(x2,y2)].Select;
      ExcelApplication1.Selection.NumberFormatLocal := '@';
     //最后一句出错.....哪位知道如何设置打开的EXCEL文件的单元格格式??谢谢.....
      

  7.   

    竟然一个人都没...
     我在程序里修改单元格式后,要重新写一次单元格数据,再用ADO连接才能正常显示.....有没有办法让它修改格式后立即可以正常显示的??
      

  8.   

    不明白为什么非要使用ADO连接Excel,
    用VBA(ActiveX)不行吗?(这个VB的代码到处都是)
    用 DevExpress 控件组中有一个可以直接存取Excel 97格式文件的不行吗?(这个我用过)
    ADO的连接只是ADO参考说可以,从来没有试过。
    对不起,帮不了。
      

  9.   

    谢谢楼上的提醒,
    装三方控件比较麻烦....
    我的程序是这样的,可以打开一个EXCEL文件,然后在表格中显示出现,让用户修改数据,最后保存()主要是显示在表格中
    至于用VBA.感觉跟手动打开一个EXCEL表,修改数据没什么差别....
    并且,我在程序里要取EXCEL表中的数据
    这个问题已解决,绕了很多圈子....
    再补充一个问题..
    有一个BIN文件
       /#음악
       /#동영상
       /#라디오
    将这些字符转换成UNICODE码,比如 음악 ,则转换后的UNICODE为:C74CC545(16进制)
    然后以字符的形式写入到文件中,现在要将这个文件读出来,用16进制和流的方式.可以读出 C74CC545 这些值,
    但是要将这个字符串(C74CC545 )还原时就出错了,全部都显示为 ?? 的形式.中文和英文的不会出错,
    就其它国的语言转换出错
    请问有什么方法可以正确的转换得到我要的字符?
    万分感谢!!!!!这个问题折磨很久了.....
      

  10.   

    装三方控件比较麻烦....  这个我赞同
    用VBA.感觉跟手动打开一个EXCEL表,修改数据没什么差别.... 
      这个可以通过将Excel作为窗口嵌入到我们的程序中解决你的新问题,我试验了一下似乎和平台处理能力有关。
    把韩文复制到Word Excel中都不会有问题,
      但是到Ultraedit就不行,
    我觉得是字体问题,至少和字体有关,
      这个韩文字在word中看到 是在一个叫做Batang的字库里面的
      我们的宋体里面没有这个字,
    我觉得似乎Ultraedit(包括 记事本)这样的软件限制了字符集的空间就显示 ??
    word和操作系统的字符空间都比较大因此显示正常过剪贴板都不行,更不要说转换一下了。
      

  11.   

    谢谢楼上的.....在网上看到一篇文章是这样说的:
    举例来说,你可以把 Unicode 字符串 Hello (U+0048 U+0065 U+006C U+006C U+006F) 编码(encode)为
    ASCII, 或者古老的 OEM 希腊语编码,或者希柏莱 ANSI 编码,等等。而有些字符串不能显示!
    也就是说,假如你要表示一个在某个编码中没有对应的 Unicode code point, 通常会显示为一个 ? 或者一个白色的小方框。
    也不知道要怎么解决这个问题....
    哪位高人现身帮忙一下.........
      

  12.   

    用这个函数:
    function TFrmMenu.DecodeChinese(InputStr: string): Variant;
      var   
      Buf:Array[0..299]   of   WideChar;   
      i:integer;
      Temp:Variant;
    begin
       i:=0   ;
       while(i<Length(InputStr))do
       begin
          Buf[(i  div  4)]:=WideChar(StrToInt('0x'+Copy(InputStr,i+1,4)));
          inc(i,4);
       end;
       Buf[Length(InputStr)div   4]:=WideChar(0);
       Temp := WideCharToString(Buf);
       result:= Temp;
    end; 
    发现韩文,希伯莱,阿拉伯语,几乎都显示为 ? 而葡萄牙,西班牙,德文,希腊语则有部分显示为?,法文,日文,俄文,意大利,荷兰语则可以正常的显示在TntStringGrid 中,.....不知道不能正常显示的要怎么解决....