回覆列表
  • 1 # Bdsfjn

    簡單的,用CopytoEXCEL表名.xlstypexl5,注意的是,執行此命令時須使要轉換的DBF表在當前工作區,可以透過Select來擇取工作區。

    VFP導成XLS&&DbfToExcel.PRG

    &&記得要安裝Excel啊,否則不好用

    CLOSEDATABASESALL

    SETDATEYMD

    SETCENTURYON

    cDbfFile=GETFILE("dbf")

    IFEMPTY(cDbfFile)

    RETURN

    ENDIF

    USE(cDbfFile)ALIASFoxTableIN0

    IFNOTUSED("FoxTable")

    =MESSAGEBOX("開啟表失敗,程式將中止!",16,"Error")

    RETURN

    ENDIF

    cExcelFile=PUTFILE("儲存為(&N):",JUSTSTEM(cDbfFile)+".xls","xls")

    IFEMPTY(cExcelFile)

    CLOSEDATABASESALL

    RETURN

    ENDIF

    SELECTFoxTable

    oExcelSheet=GETOBJECT("","Excel.Sheet")&&產生Excel物件

    IFNOTTYPE("oExcelSheet")="O"

    =MESSAGEBOX("Excel物件建立失敗,程式將中止!",16,"Error")

    RETURN

    ENDIF

    oExcelApp=oExcelSheet.Application

    oExcelApp.Workbooks.Add()

    oExcelApp.ActiveWindow.WindowState=2

    oSheet=oExcelApp.ActiveSheet

    nFldCount=AFIELDS(aFldList,"FoxTable")

    FORi=1TOnFldCount

    oSheet.Cells(1,i).Value=aFldList[i,1]

    ENDFOR

    cRecc=STR(RECCOUNT("FoxTable"))

    SCAN

    WAITWINDOWALLTRIM(STR(RECNO()))+"/"+cReccNOWAIT

    FORi=1TOnFldCount

    vValue=.NULL.

    IFAT(aFldList[i,2],"CDLMNFIBYT")=0

    LOOP

    ENDIF

    cFldName=aFldList[i,1]

    vValue=EVALUATE(cFldName)

    DOCASE

    CASEaFldList[i,2]="C"&&字元/字串

    vValue=TRIM(vValue)

    CASEaFldList[i,2]="D"&&日期

    vValue=DTOC(vValue)

    CASEaFldList[i,2]="T"&&日期時間

    vValue=TTOC(vValue)

    CASEINLIST(aFldList[i,2],"N","F","I","B","Y")&&數值

    CASEaFldList[i,2]="L"&&邏輯

    CASEaFldList[i,2]="M"&&備註型

    OTHERWISE

    vValue=.NULL.

    ENDCASE

    IFVARTYPE(vValue)="C"ANDEMPTY(vValue)

    LOOP

    ENDIF

    IFNOTISNULL(vValue)

    oSheet.Cells(RECNO("FoxTable")+1,i).Value=vValue

    ENDIF

    ENDFOR

    ENDSCAN

    cChrStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    FORi=1TOnFldCount

    cColumn=SUBSTR(cChrStr,INT((i-1)/26),1)+SUBSTR(cChrStr,IIF(MOD(i,26)=0,26,MOD(i,26)),1)

    oSheet.Columns(cColumn+":"+cColumn).ColumnWidth=12

    IFaFldList[i,2]="M"

    oSheet.Columns(cColumn+":"+cColumn).WrapText=.F.

    ENDIF

    ENDFOR

    oExcelApp.ActiveWorkbook.SaveAs(cExcelFile)

    oExcelApp.ActiveWorkbook.Close(.F.)

    oExcelApp.ActiveWorkbook.Close(.F.)

    oExcelApp.Quit

    oExcelSheet=.NULL.

    oExcelApp=.NULL.

    WAITCLEAR

    =MESSAGEBOX("轉換完畢!",64,"OK")

    CLOSEDATABASESALL

    程式是用VFP8寫的,在VFP6中也可以,沒有問題。只要能夠執行完成,就會是正確的,行數只受你安裝的Excel最大行數限制,至少大於65535行

    這個程式支援所有欄位型別,包括MEMO型別欄位。

    在VFP中全面控制ExcelVFP和Excel都可以用來進行處理資料庫表格,如果巧妙地將二者的優點結合起來,將會大大方便我們的工作。比如我們可以利用VFP進行處理資料,而利用Excel的預覽列印功能進行報表列印。這就需要我們在VFP中直接來控制Excel。下面就在開發VFP應用專案時對Excel的控制作一下介紹:

    1.建立Excel物件

    eole=CREATEOBJECT(′Excel.application′)

    2.新增新工作簿

    eole.Workbooks.add

    3.設定第3個工作表為啟用工作表

    eole.Worksheets(〃sheet3〃).Activate

    4.開啟指定工作簿

    eole.Workbooks.Open(〃c:\temp\ll.xls〃)

    5.顯示Excel視窗

    eole.visible=.t.

    6.更改Excel標題欄

    eole.Caption=〃VFP應用程式呼叫MicrosoftExcel〃

    7.給單元格賦值

    eole.cells(1,4).value=XM(XM為資料庫欄位名)

    8.設定指定列的寬度(單位:字元個數)

    eole.ActiveSheet.Columns(1).ColumnWidth=5

    9.設定指定行的高度(單位:磅)

    eole.ActiveSheet.Rows(1).RowHeight=1/0.035

    (設定行高為1釐米,1磅=0.035釐米)

    10.在第18行之前插入分頁符

    eole.Worksheets(〃Sheet1〃).Rows(18).PageBreak=1

    eole.ActiveSheet.Columns(4).PageBreak=0

    12.指定邊框線寬度(Borders引數如下)

    ole.ActiveSheet.Range(〃b3:d3〃).Borders(2).Weight=3

    13.設定四個邊框線條的型別

    eole.ActiveSheet.Range(〃b3:d3〃).Borders(2).LineStyle=1

    (其中Borders引數:1-左、2-右、3-頂、4-底、5-斜、6-斜/;LineStyle值:1與7-細實、2-細虛、4-點虛、9-雙細實線)

    14.設定頁首

    eole.ActiveSheet.PageSetup.CenterHeader=〃報表1〃

    15.設定頁尾

    eole.ActiveSheet.PageSetup.CenterFooter=〃第&P頁〃

    16.設定頁首到頂端邊距為2釐米

    eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035

    17.設定頁尾到底邊距為3釐米

    eole.ActiveSheet.PageSetup.FooterMargin=3/0.035

    18.設定頂邊距為2釐米

    eole.ActiveSheet.PageSetup.TopMargin=2/0.035

    19.設定底邊距為4釐米

    eole.ActiveSheet.PageSetup.BottomMargin=4/0.035

    20.設定左邊距為2釐米

    veole.ActiveSheet.PageSetup.LeftMargin=2/0.035

    21.設定右邊距為2釐米

    eole.ActiveSheet.PageSetup.RightMargin=2/0.035

    22.設定頁面水平居中

    eole.ActiveSheet.PageSetup.CenterHorizontally=.t.

    23.設定頁面垂直居中

    eole.ActiveSheet.PageSetup.CenterVertically=.t.

    24.設定頁面紙張大小(1-窄行851139-寬行1411)

    eole.ActiveSheet.PageSetup.PaperSize=1

    25.列印單元格網線

    eole.ActiveSheet.PageSetup.PrintGridlines=.t.

    26.複製整個工作表

    eole.ActiveSheet.UsedRange.Copy

    27.複製指定區域

    eole.ActiveSheet.Range(〃A1:E2〃).Copy

    28.貼上

    eole.WorkSheet(〃Sheet2〃).Range(〃A1〃).PasteSpecial

    29.在第2行之前插入一行

    eole.ActiveSheet.Rows(2).Insert

    30.在第2列之前插入一列

    eole.ActiveSheet.Columns(2).Insert

    31.設定字型

    eole.ActiveSheet.Cells(2,1).Font.Name=〃黑體〃

    32.設定字型大小

    eole.ActiveSheet.Cells(1,1).Font.Size=25

    33.設定字型為斜體

    eole.ActiveSheet.Cells(1,1).Font.Italic=.t.

    34.設定整列字型為粗體

    eole.ActiveSheet.Columns(1).Font.Bold=.t.

    35.清除單元格公式

    eole.ActiveSheet.Cells(1,4).ClearContents

    36.列印預覽工作表

    eole.ActiveSheet.PrintPreview

    37.列印輸出工作表

    eole.ActiveSheet.PrintOut

    38.工作表另為

    eole.ActiveWorkbook.SaveAs(〃c:\temp\22.xls〃)

    39.放棄存檔

    eole.ActiveWorkbook.saved=.t.

    40.關閉工作簿

    eole.Workbooks.close

    41.退出Excel

    eole.quit

    以上控制呼叫語句在中文VFP5.0企業版下執行透過,執行環境為Excel97及中文Windows98。

    Grid轉Excel的類

    *------------------------------------*

    rex1105

    ************

    *****轉excel類,編寫日期:2006-05-23ByRex1105

    ********

    PARAMETERSoGrid,cHeader

    IFPARAMETERS()<2

    Return.F.

    ENDIF

    cRec=ALLTRIM(oGrid.RECORDSOURCE)

    SelectALIAS(cRec)

    FILE_NAME=PUTFILE("","","XLS")

    IFEMPTY(FILE_NAME)

    Return.F.

    ENDIF

    ***檢查是否有安裝office軟體***

    excelsheet=GETOBJECT("","excel.sheet")

    IFTYPE("excelsheet")#"O"

    MESSAGEBOX("您沒有安裝office辦公軟體!",16,"資訊提示")

    RELEASEexcelsheet

    Return.F.

    ENDIF

    ****檢查檔案有無開啟*****

    LOCALloldsetopt,mChanNum,nWS

    nWs=2

    loldsetopt=DDESETOPTION("safety")

    =DDESETOPTION("safety",.F.)

    mChanNum=DDEINITIATE("excel","&file_NAME")

    IF<>mChanNum-1

    MESSAGEBOX("有同名的Excel檔案開啟!請先關閉它!",64,"資訊提示")

    =DDETERMINATE(mChanNum)

    =DDESETOPTION("safety",loldsetopt)

    Return.F.

    ELSE

    =DDETERMINATE(mChanNum)

    =DDESETOPTION("safety",loldsetopt)

    ENDIF

    LOCALcCopy,oexl

    DIMENSION[oGrid.ColumnCount,2]dColumn

    FORi=1TOoGrid.COLUMNCOUNT

    FORii=1TOoGrid.COLUMNCOUNT

    nOrder=oGrid.COLUMNS(ii).COLUMNORDER

    IFnOrder=i

    [i,1]dColumn=oGrid.COLUMNS(ii).header1.CAPTION

    [i,2]dColumn=oGrid.COLUMNS(ii).CONTROLSOURCE

    EXIT

    ENDIF

    ENDFOR

    ENDFOR

    ****建立輸出檔案*****

    cCopy=""

    FORi=1TOALEN(dColumn,1)

    cCopy=cCopy+[i,2]dColumn+","

    NEXT

    cCopy=LEFT(cCopy,LEN(cCopy)-1)

    cCopy="COPYTO"+"""+FILE_NAME+"""+"TYPEXL5FIELDS"+cCopy

    &cCopy

    &&建立excel表,並寫表頭

    oexl=CREATEOBJECT("excel.APPLICATION")

    WITHoexl

    .workbooks.OPEN(FILE_NAME)

    .VISIBLE=.T.

    .cells.Select

    .Selection.FONT.Size=10

    ENDWITH

    SelectALIAS(cRec)

    =AFIELDS(cField,cRec)

    ****第一行加中文標題*****

    FORi=1TOALEN(dColumn,1)

    oexl.cells(1,i).VALUE=[i,1]dColumn

    ****每列資料處理,分字元與數值日期*****

    DOCASE

    CASETYPE([i,2]dColumn)="N"

    ***查詢數值的小數位****

    FORii=1TOALEN(cField,1)

    IFUPPER([i,2]dColumn)=UPPER(cRec)+"."+[ii,1]cField

    nWS=[ii,4]cField

    EXIT

    ENDIF

    NEXT

    oexl.COLUMNS(retuabc(i)+":"+retuabc(i)).NumberFormatLocal="#,##0."+REPLICATE("0",nWs)+"_);[紅色](#,##0."+REPLICATE("0",nWs)+")"

    CASETYPE([i,2]dColumn)="D"ORTYPE([i,2]dColumn)="T"

    oexl.COLUMNS(retuabc(i)+":"+retuabc(i)).NumberFormatLocal="yyyy/mm/dd"

    ENDCASE

    NEXT

    ****表格線****

    oexl.RANGE("A1:"+retuabc(ALEN(dColumn,1))+ALLTRIM(Str(RECCOUNT()+1))).Select

    oexl.Selection.BorderS(5).LineStyle=-4142

    oexl.Selection.BorderS(6).LineStyle=-4142

    WITHoexl.Selection.BorderS(7)

    .LineStyle=1

    .Weight=2

    .ColorIndex=-4105

    ENDWITH

    WITHoexl.Selection.BorderS(8)

    .LineStyle=1

    .Weight=2

    .ColorIndex=-4105

    ENDWITH

    WITHoexl.Selection.BorderS(9)

    .LineStyle=1

    .Weight=2

    .ColorIndex=-4105

    ENDWITH

    WITHoexl.Selection.BorderS(10)

    .LineStyle=1

    .Weight=2

    .ColorIndex=-4105

    ENDWITH

    WITHoexl.Selection.BorderS(11)

    .LineStyle=1

    .Weight=1

    .ColorIndex=-4105

    ENDWITH

    WITHoexl.Selection.BorderS(12)

    .LineStyle=1

    .Weight=1

    .ColorIndex=-4105

    ENDWITH

    ***第一行顯示灰色加粗體****

    WITHoexl.RANGE("A1:"+retuabc(ALEN(dColumn,1))+"1")

    .HorizontalAlignment=3

    .VerticalAlignment=2

    .WrapText=.T.

    .FONT.bold=.T.

    .Interior.ColorIndex=40

    ENDWITH

    oexl.Rows("1:1").Select

    oexl.Selection.INSERT

    oexl.Selection.INSERT

    oexl.Selection.INSERT

    &&抬頭

    WITHoexl.RANGE("A1:"+retuabc(ALEN(dColumn,1))+"1")

    .merge

    .VALUE=cHeader

    .FONT.Size=14

    .HorizontalAlignment=3

    .VerticalAlignment=2

    .FONT.bold=.T.

    ENDWITH

    &&加報表時間

    WITHoexl.RANGE("A2:d2")

    .merge

    .VALUE="報表時間:"+TTOC(DATETIME())

    ENDWITH

    &&加表格第一列

    oexl.cells.Select

    oexl.Selection.COLUMNS.AUTOFIT()

    RELEASEoexl

    Return.T.

  • 中秋節和大豐收的關聯?
  • pony牌的鞋脫膠了,怎麼辦?