zoukankan      html  css  js  c++  java
  • delphicsv,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>  
  • 相关阅读:
    Python学习笔记--8.3 函数--返回值
    Python学习笔记--8.2 函数--默认值参数
    Python学习笔记--9 非空即真,非零即真
    [Robot Framework] 支持python 3 的 robot framework 安装
    Mysql DB 无法创建 function,报错:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL
    vue项目中console.log报错 No Console
    git命令合并分支代码
    远程桌面连接时如何使用本地扬声器和麦克风
    [Grafana] 如何把不同series的点用线连接起来
    POM 文件参考
  • 原文地址:https://www.cnblogs.com/hssbsw/p/2798322.html
Copyright © 2011-2022 走看看