1. 程式人生 > 實用技巧 >Progress使用COM元件操作EXCEL

Progress使用COM元件操作EXCEL

1.類定義

/*
PROGRESS COM元件 操作EXCEL FOR WINDOWS GUI USE
Notes:
1.相容10.1A起見  故沒使用 屬性 過載 等後續版本新增的OOP功能
2.本機已安裝office com元件
3.基於COM元件功能可擴充
*/

CLASS pexcel:
    DEFINE PROTECTED VARIABLE excel AS COM-HANDLE NO-UNDO.    /*excel程序物件*/
    DEFINE PROTECTED VARIABLE xbook AS COM-HANDLE NO-UNDO.    /*工作表物件*/
    DEFINE PROTECTED VARIABLE xsheet AS COM-HANDLE EXTENT NO-UNDO.    /*sheet物件*/
    DEFINE PRIVATE VARIABLE i AS INTEGER NO-UNDO.
 
    CONSTRUCTOR PUBLIC pexcel():
    END CONSTRUCTOR.
 
    METHOD PUBLIC LOGICAL newExcel(INPUT s AS INTEGER):    /*生成s個sheet*/
        IF s <= 0 THEN s = 1.
        EXTENT(xsheet) = s.
        CREATE "Excel.Application" excel NO-ERROR. 
        IF ERROR-STATUS:ERROR THEN RETURN NO.
        excel:VISIBLE = NO.
        excel:SheetsInNewWorkbook = s.
        xbook = excel:workbooks:ADD().
        DO i = 1 TO s:
            xsheet[i] = xbook:worksheets(i).
        END.
        RETURN YES.
    END METHOD.
 
    METHOD PUBLIC LOGICAL startExcel(INPUT filepath AS CHARACTER,INPUT s AS INTEGER):    /*啟動EXCEL程序*/
        IF s <= 0 THEN s = 1.
        EXTENT(xsheet) = s.
        IF filepath NE "" THEN
        DO:
            IF SEARCH(filepath) NE ? THEN
            DO:
                CREATE "Excel.Application" excel NO-ERROR.    
                IF ERROR-STATUS:ERROR THEN RETURN NO.    
                excel:VISIBLE = NO.    
                xbook = excel:workbooks:OPEN(SEARCH(filepath),,,,,,,,,,,,,,).
                DO i = 1 TO s:    
                    xsheet[i] = xbook:worksheets(i).    
                END.    /*do i to s*/
            END.
            ELSE
            RETURN NO.
        END.    /*file path*/
        ELSE RETURN 
        newexcel(s). 
        RETURN YES.
    END METHOD.
 
    METHOD PUBLIC VOID setSheetname(INPUT st AS INTEGER,INPUT stname AS CHARACTER):    /*設定工作表名*/
        xsheet[st]:NAME = stname.
    END METHOD.    
 
    METHOD PROTECTED CHARACTER getChar(INPUT exdata AS CHARACTER):
        DEFINE VARIABLE iseq AS LOGICAL NO-UNDO.
        IF exdata = ? THEN RETURN "".
        ELSE 
        DO:
            IF INDEX(exdata,".0") > 0 THEN DO:
                iseq = INTEGER(exdata) EQ DECIMAL(exdata) NO-ERROR.
                IF NOT ERROR-STATUS:ERROR AND iseq THEN
                RETURN TRIM(SUBSTRING(exdata,1,INDEX(exdata,".") - 1)).    /*擷取字串*/
                ELSE 
                RETURN TRIM(exdata).
            END.
            ELSE
            RETURN TRIM(exdata).
        END.
    END METHOD.  /*消除小數點 和 前後空格    取被識別為數值的文字字串*/
 
    METHOD PUBLIC VOID writeCell(INPUT st AS INTEGER,INPUT irow AS INTEGER,INPUT icol AS INTEGER,INPUT idata AS CHARACTER):  /*寫資料*/
        xsheet[st]:cells(irow,icol):VALUE(10) = idata.
    END METHOD.
 
    METHOD PUBLIC VOID mergeCell(INPUT st AS INTEGER,INPUT irow AS INTEGER,INPUT icol AS INTEGER,INPUT trow AS INTEGER,INPUT tcol AS INTEGER):  /*調整跨行列數*/
        IF trow > 1 OR tcol > 1 THEN
        xsheet[st]:Range(xsheet[st]:cells(irow,icol),xsheet[st]:cells(irow + trow - 1,icol + tcol - 1)):merge. 
    END METHOD.
 
    METHOD PUBLIC VOID setLineStyle(INPUT st AS INTEGER,INPUT irow AS INTEGER,INPUT icol AS INTEGER,INPUT trow AS INTEGER,INPUT tcol AS INTEGER):  /*設定邊框*/
        xsheet[st]:Range(xsheet[st]:cells(irow,icol),xsheet[st]:cells(irow + trow - 1,icol + tcol - 1)):Borders:LineStyle = 1.
    END METHOD.
 
    METHOD PUBLIC CHARACTER getCell(INPUT st AS INTEGER,INPUT irow AS INTEGER,INPUT icol AS INTEGER):  /*讀資料*/
        RETURN xsheet[st]:Cells(irow,icol):VALUE(10).
    END METHOD.
 
    METHOD PUBLIC CHARACTER charCell(INPUT st AS INTEGER,INPUT irow AS INTEGER,INPUT icol AS INTEGER):  /*讀資料*/
        RETURN getchar(STRING(xsheet[st]:Cells(irow,icol):VALUE(10))).
    END METHOD.
 
    METHOD PUBLIC VOID changeColor(INPUT st AS INTEGER,INPUT irow AS INTEGER,INPUT icol AS INTEGER,INPUT colornum AS INTEGER):   /*改變單元格顏色 RGB number*/
        xsheet[st]:cells(irow,icol):Interior:ColorIndex = colornum.
    END METHOD.
 
    METHOD PUBLIC VOID setColColor(INPUT st AS INTEGER,INPUT num AS INTEGER,INPUT colornum AS INTEGER):   /*改變列顏色 RGB number*/
        xsheet[st]:COLUMNS(num):Interior:ColorIndex = colornum.
    END METHOD.
 
    METHOD PUBLIC VOID setRowColor(INPUT st AS INTEGER,INPUT num AS INTEGER,INPUT colornum AS INTEGER):    /*改變行顏色 RGB number*/
        xsheet[st]:rows(num):Interior:ColorIndex = colornum.
    END METHOD.
 
    METHOD PUBLIC VOID clearContent(INPUT st AS INTEGER):   /*清除內容*/
        xsheet[st]:cells:ClearContents.
    END METHOD.  
 
    METHOD PUBLIC VOID autofilter(INPUT st AS INTEGER):
        xsheet[st]:rows(1):AutoFilter(,,,,).
    END METHOD.                                   /*以首行篩選*/
 
    METHOD PUBLIC VOID setValid(INPUT st AS INTEGER,INPUT irow AS INTEGER,INPUT icol AS INTEGER,INPUT trow AS INTEGER,INPUT vlist AS CHARACTER):  /*資料驗證  引數 range */
        IF LENGTH(vlist) <= 255 THEN  /*不能超過255個字元*/ 
        xsheet[st]:Range(xsheet[st]:cells(irow,icol),xsheet[st]:cells(trow,icol)):Validation:Add(3,1,1,vlist).  /*xlValidateList,xlValidAlertStop,xlBetween*/
    END METHOD.  /* 依次 sheet 開始單元格 行 列  最大行  驗證列表*/
 
    METHOD PUBLIC VOID autofit(INPUT st AS INTEGER):
        xsheet[st]:cells:select.
        excel:SELECTION:COLUMNS:AutoFit.
        xsheet[st]:cells(1,1):select.
    END METHOD.
 
    /*最後處理 釋放OR顯示OR儲存OR另存為*/
    METHOD PUBLIC VOID rlsExcel():  /*關閉程序*/
        excel:DisplayAlerts = NO.    /*提示框 FALSE 不出現*/
        excel:ActiveWorkbook:CLOSE(,,).
        excel:QUIT().    
        DO i = 1 TO EXTENT(xsheet):
            IF VALID-HANDLE(xsheet[i]) THEN 
            DO:
                RELEASE OBJECT xsheet[i]. 
                ASSIGN xsheet[i] = ?.    
            END.
        END.    
        RELEASE OBJECT xbook.    
        RELEASE OBJECT excel.    
        ASSIGN xbook = ? excel = ?.    
    END METHOD.
 
    METHOD PUBLIC VOID showExcel():  /*顯示excel*/
        excel:VISIBLE = YES.    
        DO i = 1 TO EXTENT(xsheet):
            IF VALID-HANDLE(xsheet[i]) THEN 
            DO:
                RELEASE OBJECT xsheet[i]. 
                ASSIGN xsheet[i] = ?.    
            END.
        END.    
        RELEASE OBJECT xbook.
        RELEASE OBJECT excel.
        ASSIGN xbook = ? excel = ?.
    END METHOD.
 
    METHOD PUBLIC VOID saveExcel():
        excel:DisplayAlerts = NO.    /*儲存時的提示框 FALSE 不出現*/
        xbook:SAVE().  /*儲存*/
        excel:ActiveWorkbook:CLOSE(,,).
        excel:QUIT().          
        DO i = 1 TO EXTENT(xsheet):
            IF VALID-HANDLE(xsheet[i]) THEN 
            DO:
                RELEASE OBJECT xsheet[i]. 
                ASSIGN xsheet[i] = ?.     
            END.
        END.
        RELEASE OBJECT xbook.
        RELEASE OBJECT excel.
        ASSIGN xbook = ? excel = ?.    
    END METHOD.
 
    METHOD PUBLIC VOID saveas(INPUT filepath AS CHARACTER):    /*另存為*/
        excel:DisplayAlerts = NO.    /*儲存時的提示框 FALSE 不出現*/
        excel:ActiveWorkbook:saveas(filepath,,,,,,,,,,,).
        excel:ActiveWorkbook:CLOSE(,,).
        excel:QUIT().
        DO i = 1 TO EXTENT(xsheet):
            IF VALID-HANDLE(xsheet[i]) THEN 
            DO:
                RELEASE OBJECT xsheet[i]. 
                ASSIGN xsheet[i] = ?.    
            END.
        END.
        RELEASE OBJECT xbook.
        RELEASE OBJECT excel.
        ASSIGN xbook = ? excel = ?.
    END METHOD.
 
    DESTRUCTOR PUBLIC pexcel():
    END DESTRUCTOR.

END CLASS.

2.例子

define variable p as pexcel no-undo.
p = new pexcel().
if p:newExcel(1) then
do:
    p:writecell(1,1,1,"TEST").
p:setSheetname(1,"sheet0"). p:showexcel(). end. delete object p. p = ?.