rubyXl에서 excel이 파괴되는 것을 피하기 위해 조심스럽게 조작하면서 내용의 주의사항을 변경합니다

9886 단어 RubyXLRails

비즈니스에서 rubyXl 사용 후 알 수 있는 고려 사항


오늘은 Ruby의gem 중 하나인 루비Xl을 이용해서 이해된 이용 요령, 기타를 적어보려고 합니다.

호출


우선gem를 설치합니다
gem 'rubyxl'
bundle install그런 다음 컨트롤러로 rubyXl 메소드 그룹을 호출합니다.
#コントローラーです
#ver3.4.0からリソースの無駄を抑えるように、利用用途に応じて、メソッド群を分けて呼び出せるようになっている様子。
#今回はとりあえずメモリの消費を恐れず、次のように呼び出しを行います。

require 'rubyXL/convenience_methods'
# require 'rubyXL/convenience_methods/cell'
# require 'rubyXL/convenience_methods/workbook'
# require 'rubyXL/convenience_methods/worksheet'

#既存ワークブックの読み込み
workbook = RubyXL::Parser.parse("path/test.xlsx")
#ワークシーとの指定(sheet_nameにはシート名'Sheet1'等)
work_sheet = workbook[sheet_name]

※ 필자는 작업표를 잘 복제할 수 없습니다.다른 사이트가 잘 진행되고 있는 사례를 참고했지만 늘 잘 진행되지 않았다.

행 작업/삽입

#例えば次のようにして行を指定(行・列を二次元配列として捉えているためか、indexは0から始まる)
#したがって、A1セルはwork_sheet[0][0],B2はwork_sheet[1][1]となる
row = work_sheet[0] #これは最初の行
#row全体に罫線を引くこともできる(実際するかどうかは別として)
work_sheet.change_row_border(0,:top,'thin')
#rowの高さを変更
work_sheet.cahnge_row_height(0,30)
#指定した行に真っさらな行を追加(注意!行の挿入ではなく、行の上書きのような形)
work_sheet.add_row(1)
#指定した行に、行を挿入(要注意!!あとで説明します)
work_sheet.insert_row(1)

행 삽입(insert row) 고려 사항


예를 들어 디렉터 측에서 DB의 일부 정보를 얻어 1줄로 동적 생성 줄을 기록한다.
이때
- 삽입된 행 아래에 결합된 셀이 있으면 결합 상태가 손상되고 Excel 자체가 손상될 가능성이 큽니다.
- 삽입할 행 아래의 셀에 방정식 등이 포함된 경우 Excel 자체가 손상될 가능성이 높음
- 공식에서 참조하는 셀 정보와 일치하지 않기 때문에 Excel 삽입 행을 실제로 여는 번역문과 다릅니다.공식 문서에도 주의사항이 적혀 있다.
inserts row at row_index, pushes down, copies style from below (row previously at that index) USE OF THIS METHOD will break formulas which reference cells which are being “pushed down”
브레이크라는 불길한 단어

셀 작업

#セルのvalue値(表示する文字列等)を変更する時には以下の2つの方法が使える。ここも注意点を後述。

#①指定したセルに真っさらなセルを上書きし、そこに指定したvalue(文字列等)を追加する。当然セルの書式なども真っさらになる・・・
work_sheet.add_cell(0,0,m_"テストですよ")
#②指定したセルのvalue値だけ変更する。セルの書式などは変わらないが、valueがnullだとエラーになる・・・
work_sheet.change_contents(0,0,"テストですよ")

#セルの結合(A1からC2まで結合)
work_sheet.merge_cells(0,0,2,1)

#セルの背景色変更(color = 'FFFFFF'のように指定。16真数だけどCSSみたいに#は不要)
work_sheet[0][0].change_fill(color)

#セル内文字の右寄せ、左寄せ
work_sheet[0][0].change_horizontal_alignment("right")#center,left指定可能

#セル内文字を折り返して表示(falseで折り返しなし)
work_sheet[0][0].change_text_wrap(true)

칸value 값 변경 시 주의사항

  • add_cell의value는nil의 칸에도 사용할 수 있지만, 새로운 칸을 덮어쓴 그림이기 때문에 형식 등은 완전히 다시 고칠 수 있습니다
  • change_value가 nil의 칸에 contents를 사용하면 오류가 발생합니다.하지만 격식 등은 손상되지 않는다.
  • 상기의 기록에 의하면
    value를 정적으로 다시 쓰는 칸을 확인하면 change_contents 을 사용합니다.(반각 공간이든 뭐든지 가능합니다.value를 넣으면nil 오류가 발생하지 않습니다)
    동적으로 추가된 줄과 같은 작은 구역에value를 압축하면 add_cell 을 사용합니다.
    참고로 저는 아직 실행하지 못했습니다. change_contens 방법을 다시 써서 value가nil에서도 사용할 수 있도록 하는 방법도 있다고 생각합니다.

    xlsm 파일에 대한 주의사항


    필자가 이용하고자 하는 상황에서 다음과 같은 것을 주의하면 xlsm 파일에 삽입된 매크로를 파괴하지 않을 수 있다.(스스로 책임지세요.)
  • 예를 들어 바코드 등 액티브x를 이용한 대상이 포함된 책이 파괴
  • 보이는 느낌은 이미지 데이터, excel로 만든 도표 등이 고장나지 않았다
  • 기타 자제 방법


    자신의 작품이라고는 하지만 참고했다여기..
    삽입 행의 높이를 동적으로 조정하는 방법입니다.
    참고로 줄 바꿈 수량에 따라 높이를 조정하지만 제 경우는 줄 바꿈 칸이 있어서 줄 바꿈이 없기 때문에 문자 수에 제한이 있습니다.(셀의 폭과 글꼴 크기를 조정해야 합니다. 참고 가치가 없어서 죄송합니다.)
    #メソッドの呼び出し方(行では行を指定)
    row_height_auto(work_sheet,gyou)
    
    def row_height_auto(worksheet,row_num)
        mojisuu = []
        worksheet[row_num]&.cells.each do |cell|
            if cell.class != NilClass
                if cell.value != "" 
                    mojisuu.push(cell.value.size) if cell.value
                end
            end
        end
        mojisuu = mojisuu.max
        if mojisuu >= 13#この辺はセルの横幅、およびフォントサイズで調整を
            num = (mojisuu / 13.0).ceil
        else
            num = 1
        end
        worksheet.change_row_height(row_num, 15 * num )
    end
    
    이상은 루비Xl을 이용해서 주의해야 할 점

    좋은 웹페이지 즐겨찾기