delphi--csv,txt文本转换成excel .

由于系统使用导出的格式是csv,但是如果数字的长度太长的话,用excle打开会用科学技术法自动截断了。所以开发了一个转换程序。

  1. unit Unit1;  
  2.   
  3.   
  4.   
  5. interface  
  6.   
  7.   
  8.   
  9. uses  
  10.   
  11.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  12.   
  13.   Dialogs, StdCtrls, ExtCtrls, ComCtrls, ComObj, StrUtils, WinSkinData,  
  14.   
  15.   WinSkinStore, Gauges, ShellApi, ClipBrd;  
  16.   
  17.   
  18.   
  19. type  
  20.   
  21.   TForm1 = class(TForm)  
  22.   
  23.     OpenDialog1: TOpenDialog;  
  24.   
  25.     SaveDialog1: TSaveDialog;  
  26.   
  27.     Panel1: TPanel;  
  28.   
  29.     Edit1: TEdit;  
  30.   
  31.     Edit2: TEdit;  
  32.   
  33.     Button1: TButton;  
  34.   
  35.     Button2: TButton;  
  36.   
  37.     Button3: TButton;  
  38.   
  39.     StatusBar1: TStatusBar;  
  40.   
  41.     SkinData1: TSkinData;  
  42.   
  43.     Timer1: TTimer;  
  44.   
  45.     Gauge1: TGauge;  
  46.   
  47.     progressBar: TProgressBar;  
  48.   
  49.     procedure Button1Click(Sender: TObject);  
  50.   
  51.     procedure Button2Click(Sender: TObject);  
  52.   
  53.     procedure Button3Click(Sender: TObject);  
  54.   
  55.     procedure FormPaint(Sender: TObject);  
  56.   
  57.     procedure StatusBar1DrawPanel(StatusBar: TStatusBar;  
  58.   
  59.       Panel: TStatusPanel; const Rect: TRect);  
  60.   
  61.     procedure FormCreate(Sender: TObject);  
  62.   
  63.     procedure Timer1Timer(Sender: TObject);  
  64.   
  65.   private  
  66.   
  67.     progressBarRect:TRect; // 进度条组件的尺寸   
  68.   
  69.   public  
  70.   
  71.     { Public declarations }  
  72.   
  73.     procedure   DropFiles(var   Message:   TMessage);   message   WM_DropFiles;  
  74.   
  75.   end;  
  76.   
  77.   
  78.   
  79. var  
  80.   
  81.   Form1: TForm1;  
  82.   
  83.   
  84.   
  85. implementation  
  86.   
  87.   
  88.   
  89. {$R *.dfm}  
  90.   
  91.   
  92.   
  93. procedure   TForm1.DropFiles(var   Message:   TMessage);    
  94.   
  95.   var    
  96.   
  97.       i,l:   Integer;  
  98.   
  99.       p:   array[0..254]   of   Char;  
  100.   
  101.       s:   String;  
  102.   
  103.   begin  
  104.   
  105.       i   :=   DragQueryFile(Message.wParam,   $FFFFFFFF,   nil,   0);    
  106.   
  107.       for   i   :=   0   to   i   -   1   do   begin    
  108.   
  109.           DragQueryFile(Message.wParam,   i,   p,   255);    
  110.   
  111.           //ShowMessage(StrPas(p));   
  112.   
  113.           s :=  StrPas(p);  
  114.   
  115.           l := Pos('.csv',s);  
  116.   
  117.           if (l > 0) then  
  118.   
  119.             Edit1.Text := StrPas(p)  
  120.   
  121.           else  
  122.   
  123.             ShowMessage('请选择csv文件!');  
  124.   
  125.       end;    
  126.   
  127.   end;     
  128.   
  129.   
  130.   
  131. procedure TForm1.Button1Click(Sender: TObject);  
  132.   
  133. begin  
  134.   
  135. StatusBar1.Panels[0].Text :='';  
  136.   
  137. OpenDialog1.Execute;  
  138.   
  139. Edit1.Text := OpenDialog1.FileName;  
  140.   
  141. end;  
  142.   
  143.   
  144.   
  145. procedure TForm1.Button2Click(Sender: TObject);  
  146.   
  147. begin  
  148.   
  149. StatusBar1.Panels[0].Text:='';  
  150.   
  151. SaveDialog1.Execute;  
  152.   
  153. Edit2.Text := SaveDialog1.FileName;  
  154.   
  155. end;  
  156.   
  157.   
  158.   
  159. procedure TForm1.Button3Click(Sender: TObject);  
  160.   
  161. var  
  162.   
  163.   Excel,WorkBook,xlQuery,A:Variant;  
  164.   
  165.   f:TextFile;  
  166.   
  167.   i,j,k,b,nLen:integer;  
  168.   
  169.   s,xlsFile:string;  
  170.   
  171.   pc:PChar;  
  172.   
  173.   StepCount : Integer;  
  174.   
  175.   vSL:   TStringList;  
  176.   
  177. begin  
  178.   
  179.     try  
  180.   
  181.           if   not   FileExists(Edit1.Text)   then  
  182.   
  183.           begin  
  184.   
  185.              StatusBar1.Panels[0].Text:='请选择CSV文件!!!!!!!';  
  186.   
  187.              exit;  
  188.   
  189.           end;  
  190.   
  191.           xlsFile := Edit1.Text;  
  192.   
  193.           xlsFile := AnsiReplaceText(xlsFile,'.csv','.xls');  
  194.   
  195.           if xlsFile = '' then  
  196.   
  197.           begin  
  198.   
  199.              StatusBar1.Panels[0].Text:='请选择另存为Excel!!!!!!!';  
  200.   
  201.              Exit;  
  202.   
  203.           end;  
  204.   
  205.           //AssignFile(f,Edit1.Text);   
  206.   
  207.           //Reset(f);   
  208.   
  209.           vSL   :=   TStringList.Create;  
  210.   
  211.           //vSL.Delimiter=',';   
  212.   
  213.           vSL.LoadFromFile(Edit1.Text);  
  214.   
  215.           try  
  216.   
  217.             Excel:=CreateOleObject('Excel.Application');  
  218.   
  219.             WorkBook:=CreateOleobject('Excel.Sheet');  
  220.   
  221.           except  
  222.   
  223.             ShowMessage('您的机器里未安装Microsoft Excel.');  
  224.   
  225.             Exit;  
  226.   
  227.           end;  
  228.   
  229.           //动态创建进度条组件progressBar   
  230.   
  231.   
  232.   
  233.           StepCount:=vSL.Count; // 循环的总数目   
  234.   
  235.           timer1.Enabled:=true;  
  236.   
  237.           with progressBar do  
  238.   
  239.           begin  
  240.   
  241.           // 先确定进度条组件的尺寸和位置   
  242.   
  243.           Top:=ProgressBarRect.Top;  
  244.   
  245.           Left:=ProgressBarRect.Left;  
  246.   
  247.           Width:=ProgressBarRect.Right-ProgressBarRect.Left;  
  248.   
  249.           Height:=ProgressBarRect.Bottom-ProgressBarRect.Top;  
  250.   
  251.           Parent:=StatusBar1; // parent属性设置为状态栏组件   
  252.   
  253.           Visible:=True; // 使进度条可见             
  254.   
  255.           Min:=0;// 设定进度条的范围和步长   
  256.   
  257.           Max:=StepCount div 300;  
  258.   
  259.           Step:=1;  
  260.   
  261.           end;  
  262.   
  263.           //pb.Visible := true;   
  264.   
  265.           WorkBook := Excel.workbooks.add;  
  266.   
  267.           Excel.worksheets[1].activate;  
  268.   
  269.           Excel.Visible:=false;  
  270.   
  271. //          Clipboard.AsText:=vSL.Text;   
  272.   
  273.           //计算有多少列   
  274.   
  275.           s:=vSL[0];  
  276.   
  277.           pc := PChar(s);  
  278.   
  279.           k:=0;  
  280.   
  281.           b:=1;  
  282.   
  283.           j:=1;  
  284.   
  285.           nLen := strlen(pc);  
  286.   
  287.           while k<nLen do  
  288.   
  289.               begin;  
  290.   
  291.                 if pc[k] = ',' then  
  292.   
  293.                 begin  
  294.   
  295.                   inc(j);  
  296.   
  297.                 end;  
  298.   
  299.                 inc(k);  
  300.   
  301.           end;  
  302.   
  303.   
  304.   
  305.         A:=VarArrayCreate([0,j],varVariant);  
  306.   
  307.         for   i:=0   to   j   do  
  308.   
  309.              A[i]:=2;  
  310.   
  311.   
  312.   
  313.         xlQuery := Excel.worksheets[1].QueryTables.Add('TEXT;'+Edit1.Text,Excel.worksheets[1].Range['A1']);  
  314.   
  315.         //xlQuery.Name := '';   
  316.   
  317.         xlQuery.FieldNames := True;  
  318.   
  319.         xlQuery.RowNumbers := False;  
  320.   
  321.         xlQuery.FillAdjacentFormulas := False;  
  322.   
  323.         xlQuery.PreserveFormatting := True;  
  324.   
  325.         xlQuery.RefreshOnFileOpen := False;  
  326.   
  327.         //xlQuery.RefreshStyle := 'xlInsertDeleteCells';   
  328.   
  329.         xlQuery.SavePassword := False;  
  330.   
  331.         xlQuery.SaveData := True;  
  332.   
  333.         xlQuery.AdjustColumnWidth := True;  
  334.   
  335.         xlQuery.RefreshPeriod := 0;  
  336.   
  337.         xlQuery.TextFilePromptOnRefresh := False;  
  338.   
  339.         xlQuery.TextFilePlatform := 936;  
  340.   
  341.         xlQuery.TextFileStartRow := 1;  
  342.   
  343.         //xlQuery.TextFileParseType := 'xlDelimited';   
  344.   
  345.         //xlQuery.TextFileTextQualifier := 'xlTextQualifierDoubleQuote';   
  346.   
  347.         xlQuery.TextFileConsecutiveDelimiter := False;  
  348.   
  349.         xlQuery.TextFileTabDelimiter := False;  
  350.   
  351.         xlQuery.TextFileSemicolonDelimiter := False;  
  352.   
  353.         xlQuery.TextFileCommaDelimiter := True;  
  354.   
  355.         xlQuery.TextFileSpaceDelimiter := False;  
  356.   
  357.         xlQuery.TextFileColumnDataTypes := A;  
  358.   
  359.         xlQuery.TextFileTrailingMinusNumbers := True;  
  360.   
  361.         xlQuery.Refresh;  
  362.   
  363.           if   FileExists(xlsFile)   then  
  364.   
  365.               DeleteFile(xlsFile);  
  366.   
  367. //          Excel.worksheets[1].Paste;   
  368.   
  369.           WorkBook.SaveAs(xlsFile);  
  370.   
  371.           StatusBar1.Panels[0].Text:='转换成功!!!!!!!';  
  372.   
  373.           progressBar.Visible:=false;  
  374.   
  375.     finally  
  376.   
  377.       if   vSL<>nil then  
  378.   
  379.         vSL.Free;  
  380.   
  381.       if not VarIsEmpty(WorkBook) then WorkBook.close;  
  382.   
  383.       if not VarIsEmpty(Excel) then Excel.quit;  
  384.   
  385.       //if not VarIsEmpty(A) then varfree(A);   
  386.   
  387.       timer1.Enabled:=false;  
  388.   
  389.     end;  
  390.   
  391. end;  
  392.   
  393.   
  394.   
  395. procedure TForm1.FormPaint(Sender: TObject);  
  396.   
  397. begin  
  398.   
  399. StatusBar1.Panels[0].Text:='中国建设银行版权所有..........';  
  400.   
  401.   
  402.   
  403. end;  
  404.   
  405.   
  406.   
  407. procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;  
  408.   
  409.   Panel: TStatusPanel; const Rect: TRect);  
  410.   
  411. begin  
  412.   
  413. progressBarRect:=Rect;  
  414.   
  415. end;  
  416.   
  417.   
  418.   
  419. procedure TForm1.FormCreate(Sender: TObject);  
  420.   
  421. begin  
  422.   
  423. DragAcceptFiles(Handle,   True);  
  424.   
  425. end;  
  426.   
  427.   
  428.   
  429. procedure TForm1.Timer1Timer(Sender: TObject);  
  430.   
  431. begin  
  432.   
  433.      progressBar.Stepit;       
  434.   
  435.           //Application.ProcessMessages;   
  436.   
  437.           //Sleep(ProgressBar.Position);   
  438.   
  439. end;  
  440.   
  441.   
  442.   
  443. end.  

原来使用的是

  1.          for i:=1 to StepCount do  
  2.   
  3.           begin  
  4.   
  5.             //Readln(f,s);   
  6.   
  7.             progressBar.Stepit;// 循环使进度显示条累加   
  8.   
  9.             s:=vSL[i-1];  
  10.   
  11.             pc := PChar(s);  
  12.   
  13.             k:=0;  
  14.   
  15.             b:=1;  
  16.   
  17.             j:=0;  
  18.   
  19.             nLen := strlen(pc);  
  20.   
  21.             while k<nLen do  
  22.   
  23.               begin;  
  24.   
  25.                 if pc[k] = ',' then  
  26.   
  27.                 begin  
  28.   
  29.                   inc(j);  
  30.   
  31.                   Excel.cells[i,j].NumberFormat:='@';  
  32.   
  33.                   Excel.cells[i,j].value:=Copy(s,b,k-b+1);  
  34.   
  35.                   b:=k+2;  
  36.   
  37.                 end;  
  38.   
  39.                 inc(k);  
  40.   
  41.             end;  
  42.   
  43.             inc(j);  
  44.   
  45.             Excel.cells[i,j].NumberFormat:='@';  
  46.   
  47.             Excel.cells[i,j].value:=Copy(s,b,k-b+1);  
  48.   
  49.           end;  
  50.   
  51. 上面的代码是遍历整个文件,判断是否有逗号,然后对每个格子插入数据。这样做的效率很低,  
  52. 3千多行的数据转换用了5分钟。后来使用vba,先用excle录制了一段外部数据导入的宏。  
  53. <PRE class=vb.net name="code">Sub Macro3()  
  54.   
  55. '  
  56.   
  57. ' Macro3 Macro  
  58.   
  59. ' 宏由 ZHL 录制,时间: 2008-7-3  
  60.   
  61. '  
  62.   
  63.   
  64.   
  65. '  
  66.   
  67.     Cells.Select  
  68.   
  69.     With ActiveSheet.QueryTables.Add(Connection:= _  
  70.   
  71.         "TEXT;C:/Documents and Settings/zhl/桌面/200807021528053658.csv", Destination:= _  
  72.   
  73.         Range("A1"))  
  74.   
  75.         .Name = "200807021528053658_1"  
  76.   
  77.         .FieldNames = True  
  78.   
  79.         .RowNumbers = False  
  80.   
  81.         .FillAdjacentFormulas = False  
  82.   
  83.         .PreserveFormatting = True  
  84.   
  85.         .RefreshOnFileOpen = False  
  86.   
  87.         .RefreshStyle = xlInsertDeleteCells  
  88.   
  89.         .SavePassword = False  
  90.   
  91.         .SaveData = True  
  92.   
  93.         .AdjustColumnWidth = True  
  94.   
  95.         .RefreshPeriod = 0  
  96.   
  97.         .TextFilePromptOnRefresh = False  
  98.   
  99.         .TextFilePlatform = 936  
  100.   
  101.         .TextFileStartRow = 1  
  102.   
  103.         .TextFileParseType = xlDelimited  
  104.   
  105.         .TextFileTextQualifier = xlTextQualifierDoubleQuote  
  106.   
  107.         .TextFileConsecutiveDelimiter = False  
  108.   
  109.         .TextFileTabDelimiter = False  
  110.   
  111.         .TextFileSemicolonDelimiter = False  
  112.   
  113.         .TextFileCommaDelimiter = True  
  114.   
  115.         .TextFileSpaceDelimiter = False  
  116.   
  117.         .TextFileColumnDataTypes = Array(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _  
  118.   
  119.         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)  
  120.   
  121.         .TextFileTrailingMinusNumbers = True  
  122.   
  123.         .Refresh BackgroundQuery:=False  
  124.   
  125.     End With  
  126.   
  127. End Sub  
  128.   
  129. 然后根据上面的宏写了如下的delphi代码:  
  130. <PRE class=csharp name="code">        xlQuery := Excel.worksheets[1].QueryTables.Add('TEXT;'+Edit1.Text,Excel.worksheets[1].Range['A1']);  
  131.   
  132.         //xlQuery.Name := '';   
  133.   
  134.         xlQuery.FieldNames := True;  
  135.   
  136.         xlQuery.RowNumbers := False;  
  137.   
  138.         xlQuery.FillAdjacentFormulas := False;  
  139.   
  140.         xlQuery.PreserveFormatting := True;  
  141.   
  142.         xlQuery.RefreshOnFileOpen := False;  
  143.   
  144.         //xlQuery.RefreshStyle := 'xlInsertDeleteCells';   
  145.   
  146.         xlQuery.SavePassword := False;  
  147.   
  148.         xlQuery.SaveData := True;  
  149.   
  150.         xlQuery.AdjustColumnWidth := True;  
  151.   
  152.         xlQuery.RefreshPeriod := 0;  
  153.   
  154.         xlQuery.TextFilePromptOnRefresh := False;  
  155.   
  156.         xlQuery.TextFilePlatform := 936;  
  157.   
  158.         xlQuery.TextFileStartRow := 1;  
  159.   
  160.         //xlQuery.TextFileParseType := 'xlDelimited';   
  161.   
  162.         //xlQuery.TextFileTextQualifier := 'xlTextQualifierDoubleQuote';   
  163.   
  164.         xlQuery.TextFileConsecutiveDelimiter := False;  
  165.   
  166.         xlQuery.TextFileTabDelimiter := False;  
  167.   
  168.         xlQuery.TextFileSemicolonDelimiter := False;  
  169.   
  170.         xlQuery.TextFileCommaDelimiter := True;  
  171.   
  172.         xlQuery.TextFileSpaceDelimiter := False;  
  173.   
  174.         xlQuery.TextFileColumnDataTypes := A;  
  175.   
  176.         xlQuery.TextFileTrailingMinusNumbers := True;  
  177.   
  178.         xlQuery.Refresh;</PRE>  
  179. 使用excle的导入功能后转换原来的文件之用了10秒钟。</PRE>  
posted on 2012-12-02 16:13  为人民服务  阅读(1373)  评论(0编辑  收藏  举报