Progress使用COM元件操作EXCEL
阿新 • • 發佈:2020-10-07
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 = ?.