설명
이 모델은 GAMS 무료 슬롯를 사용하여 Excel 통합 문서를 읽고 씁니다. 그것은 또한 무료 슬롯 에이전트 PythonCode를 사용하여 일부 레이블 조작을 수행하고 Excel 표를 읽는 다양한 방법(RawExcelReader와 ExcelReader)을 비교합니다. 기고자: Michael Bussieck, 2022년 3월
카테고리 : 무료 슬롯 데이터 유틸리티 라이브러리
메인 파일 : connect01.gms 포함: connect01.gms labdata.xlsx
$title 스프레드시트를 사용한 복합 연결 예(CONNECT01,SEQ=144)
$onText
이 모델은 GAMS 무료 슬롯를 사용하여 Excel 통합 문서를 읽고 씁니다. 그것은 또한
무료 슬롯 에이전트 PythonCode를 사용하여 일부 레이블 조작을 수행하고
Excel 표를 읽는 다양한 방법(RawExcelReader와 ExcelReader)을 비교합니다.
기고자: Michael Bussieck, 2022년 3월
$offText
코드 설정, labId, cut, rr(code<,labId);
매개변수 labdata(코드,labid,컷);
$onEcho > getdata.gms
* RawExcelReader의 기호
별칭(u,*); s,w,r,c,ws(s,w),vs(s,r,c),vu(s,r,c,u)를 설정합니다. 매개변수 vf(s,r,c);
$onEmbeddedCode 연결:
- RawExcelReader:
파일: labdata.xlsx
- GAMS작성기:
기호: 모두
$offEmbeddedCode
* 채워야 할 기호
별칭(*,코드,labId,컷); 매개변수 raw(code,labId,cut); cutId, rr(code,labId) 설정
cX(c,cut) '열 인덱스', rX(r,code,labId) '행 인덱스'를 설정합니다.
싱글톤 세트 cLast(c); 스칼라 lastPos;
루프(ws(s,'ZAg'),
lastPos = smax(vu(s,r,c,u), c.pos); cLast(c) = c.pos=lastPos;
루프(r$(ord(r)>4),
rX(r,code,labId) $= vu(s,r,'C1',code) 및 vu(s,r,cLast,labId));
loop(c$(ord(c)>1이고 cLast(c)가 아님),
cX(c,컷) $= vu(s,'R4',c,컷));
루프((rX(r,code,labId),cX(c,cut)),
원시(코드,labId,컷) = vf(s,r,c))
루프(cX(c,컷),
cutId(컷) = 예)
);
옵션 rr<rX;
$offEcho
$call.checkErrorLevel gams getdata.gms lo=%gams.lo% gdx=getdata.gdx
$onEmbeddedCode 연결:
- GDX리더:
파일: getdata.gdx
기호: [ name: rr, name: raw, name: cutId, newName: cut ]
- 프로젝션:
이름: rr(코드,labid)
새로운 이름: labid(labid)
- Python코드:
코드: |
labid_records = sorted([ 'L'+t[0] for t in 무료 슬롯container['labid'].records.values ], key=lambda t: int(t[1:]))
rr_records = sorted([ (t[0],
무료 슬롯container['rr'].records.values ], key=lambda t: int(t[0]))의 t에 대해 'L'+t[1])
# set cut의 요소를 소수점 이하 두 자리까지 자릅니다.
cut_records = sorted([ ':.2f'.format(float(t[0])) for t in 무료 슬롯container['cut'].records.values ], key=float)
labdata_records = [ (t[0],
'L'+t[1],
':.2f'.format(float(t[2])),
무료 슬롯container['raw'].records.values ]의 t에 대한 t[-1])
무료 슬롯container.addSet('labid_mod', ['*'], records=labid_records)
무료 슬롯container.addSet('rr_mod', ['*']*2, records=rr_records)
무료 슬롯container.addSet('cut_mod', ['*'], records=cut_records)
무료 슬롯container.addParameter('labdata', ['*']*3, records=labdata_records)
- GAMS작성기:
기호: [ 이름: labid_mod, newName: labid, name: rr_mod, newName: rr, name: cut_mod, newName: cut, name: labdata ]
중복 레코드: 첫 번째
$offEmbeddedCode
Execute_unload 'labdata.gdx', labdata, 컷, rr;
* 0(제로)을 다시 도입합니다.
labdata(rr,컷) = labdata(rr,컷) + eps;
'rm -f labdatanew.xlsx'를 실행합니다.
* 좋은 테이블로 새 통합 문서 작성
임베디드 코드 연결:
- GAMS리더:
기호: [ 이름: labdata ]
- 엑셀작성기:
파일: labdatanew.xlsx
값대체: EPS: 0
기호:
- 이름 : labdata
범위: ZAg!A4
endEmbeddedCode
옵션 클리어=rr, 클리어=labdata;
임베디드 코드 연결:
- 엑셀리더:
파일: labdatanew.xlsx
기호:
- 이름 : labdata
행차원: 2
범위: ZAg!A4
- 프로젝션:
이름: labdata(코드,labid,cut)
새 이름: rr(코드,labid)
자산 세트: 참
- GAMS작성기:
기호: 모두
중복 레코드: 첫 번째
endEmbeddedCode
Execute_unload 'labdatanew.gdx', labdata, 컷, rr;
Execute.checkErrorLevel 'gdxdiff labdata.gdx labdatanew.gdx > %system.NullFile%';