프로델에서 네신 Excel 작성을 자동화하고 싶다 폰트 사이즈편 #1

절차 정리



지난번 에서는 단단히 접었습니다만, 구체적으로 정리하면 다음과 같은 순서가 됩니다.

sharedStrings.xml의 sst/si 아래의 t 요소에 포함 된 기호에 따라 주어진 문자열 (제목, 날짜, 이름 이름 등)으로 대체 한 후,
1. si 요소의 인덱스 번호를 얻습니다 (위에서 몇 번째, 숫자는 0 기점).
2. sheet1.xml의 sheetData/row/c 아래의 v 요소 값에서 1.과 일치하는 것을 찾습니다 (문자열 셀은 t 속성 = "s"이고 바로 아래에 v 요소가 있음).
3. 일치하는 v 요소의 부모 인 c 요소에서 s 속성의 값을 가져옵니다 (이것은 서식 정의의 인덱스 번호, s라고 함).
4. styles.xml의 styleSheet/cellXfs 아래의 s 번째 xf 요소를 복사하여 부모 노드에 추가합니다. (이것도 1.과 마찬가지로 위에서 몇번째가 인덱스 번호가 된다).
5. 추가한 xf 요소의 fontId 속성 값을 가져옵니다(f로 설정).
6. styleSheet/fonts 아래 위에서 f 번째 font 요소를 복사하여 부모 노드에 추가합니다 (이것은 글꼴 정의).
7. 추가 된 xf 요소의 fontId 속성 값을 6.에서 추가 한 font 요소의 인덱스 번호로 변경합니다.
8. sheet1.xml의 sheetData/row 아래의 c 요소의 s 속성 값을 4.에서 추가 한 xf 요소의 인덱스 번호로 변경합니다.

요소나 속성의 복사는 어떻게 하는가?



이 중에서, 4.와 6.는 한 번 이상 걸릴 것 같습니다. 요소나 속성을 취득→그것을 새롭게 추가라고 하는 처리를 계속해서 써 줄 수 있을 것입니다만, 나중을 위해서도 가능한 한 간결하게 정리하고 싶은 곳입니다. font 요소에 대해서는, 아이 요소가 설정치를 가지고 있으므로, 적당한 요소의 XML을 취득해 사용하면 됩니다만, xf 요소에 대해서는 요소 자신의 속성에 설정치를 갖게 하고 있으므로, 이 방법은 사용할 수 없습니다. 부모 노드의 XML에서 필요한 부분을 잘라낼 것 같습니다. 이것은 정규 표현으로 어떻게 쓰면 좋을까?

시도한 시트



어쨌든 써 보자고 하는 것으로, 이런 간단한 시트로 시험하기로 했습니다.

오른쪽의 셀(셀 2)만 폰트 사이즈를 20pt로 합니다. .rdr 파일과 같은 폴더의 temp 폴더에 이 .xlsx 파일이 압축 해제되어 있다고 가정합니다.

xlsx 서식 조작.rdr
書式xmlは、「[プログラムの位置]temp\xl\styles.xml」をXMLとして開いたもの
シートxmlは、「[プログラムの位置]temp\xl\worksheets\sheet1.xml」をXMLとして開いたもの
文字列xmlは、「[プログラムの位置]temp\xl\sharedStrings.xml」をXMLとして開いたもの
文字列番号一覧は、{}
セル書式番号一覧は、{}
フォントサイズ一覧は、{}

臨時一覧は、文字列xmlから「sst\si」を取得したもの
[臨時一覧の個数]回値へカウントしながら繰り返す
    [臨時一覧(値)の要素一覧]を箱へそれぞれ繰り返す
        もし箱の名前が「t」かつ箱の内容が「セル2」ならば
            文字列番号一覧に(値-1)を加える
        もし終わり
    繰り返し終わり
繰り返し終わり

臨時一覧は、シートxmlから「worksheet\sheetData\row」を取得したもの
[臨時一覧の個数]回値へカウントしながら繰り返す
    [臨時一覧(値)の要素一覧]を箱へそれぞれ繰り返す
        箱の属性一覧を器へそれぞれ繰り返す
            もし器の名前=「t」かつ器の内容=「s」かつ[箱の要素一覧](1)の内容=文字列番号一覧(1)ならば    ーーt属性が存在するとは限らないのでこうする
                箱を、セル書式番号一覧に加える   ーーv要素の値が一致したc要素を格納
            もし終わり
        繰り返し終わり
    繰り返し終わり
繰り返し終わり

ーーフォント定義を追加
臨時一覧は、書式xmlから「styleSheet\fonts\font」を取得したもの
テンプレは、臨時一覧(1)のXML
臨時は、書式xmlから「styleSheet\fonts」を取得したもの
新規フォントidは、臨時(1)の「count」の内容
臨時(1)の「count」の内容は、[新規フォントid]+1
臨時(1)へ「font」という要素を作って臨時に加える
臨時(2)のXMLを、[正規表現でテンプレを「sz val="[[]\d.[]]+\d+"」から「sz val="20"」へ置換したもの]に変える
ーー属性から名前空間定義を削除
臨時(1)のXMLを、[正規表現で臨時(1)のXMLを「xmlns="[[]^"[]]*"」から「」へ置換したもの]に変える

ーーセルの書式定義を追加
臨時一覧は、書式xmlから「styleSheet\cellXfs」を取得したもの
s属性は、セル書式番号一覧(1)の「s」の内容
s属性を報告
テンプレは、[[臨時一覧(1)のXML]から「<xf[[]^>[]]+>[[]^>[]]+></xf>」という正規表現で区別して取り出したもの](s属性+1)
臨時一覧(1)のXMLは、臨時一覧(1)のXML&テンプレ
臨時一覧(1)のXMLを報告
xf要素は、[臨時一覧(1)の要素一覧]([臨時一覧(1)の要素一覧]の個数)   ーー末尾のxf要素を取得
xf要素の「fontId」の内容は、新規フォントid

新規xf要素idは、臨時一覧(1)の「count」の内容
臨時一覧(1)の「count」の内容は、[新規xf要素id]+1
ーー属性から名前空間定義を削除
削除前は、[臨時一覧(1)のXML]
削除後は、[正規表現で[削除前]を「xmlns="[[]^"[]]*"」から「」へ置換したもの]
臨時一覧(1)のXMLを、削除後に変える
セル書式番号一覧(1)の「s」の内容は、新規xf要素id

「[プログラムの位置]temp\xl\styles.xml」に書式xmlを保存する
「[プログラムの位置]temp\xl\worksheets\sheet1.xml」にシートxmlを保存する

수정한 xml 파일을 zip 압축하여 Excel에서 열면 이렇게 되었습니다.

서식이 무너지지 않고 잘 변경된 것 같습니다.
덧붙여서, 프로델에서는 요소를 추가하면(자) 네임스페이스를 설정하는 xmlns 속성이 확실히 붙습니다. XML 파일 시작 부분의 네임스페이스가 들어가는데 공백인 경우도 있는 것 같기 때문에, 만약을 위해 삭제해 두기로 했습니다. font 엘리먼트와 xf 엘리먼트를 추가한 각각의 부분에서 치마치마와 실행하고 있습니다만, xf 엘리먼트에서는 잘 삭제할 수 없는 것 같습니다. 같은 네임스페이스라면 동작에 영향을 주지 않겠습니까?

좋은 웹페이지 즐겨찾기