mixiユーザー(id:65933753)

2019年03月26日19:22

584 view

Excelize(golangライブラリ)のAddPicture関数のバグ

excelize
https://github.com/360EntSecGroup-Skylar/excelize
のAddPicture系のバグの話をしよう。

Xuri
https://github.com/xuri
にあとでissue投げとこうかと思っている。

発生条件は、新規作成したエクセル(SaveASしていない)状態に複数シートを生成し、あるシートのセルに画像を貼り付けた後、別のシートのセルに画像を貼り付けると発生する。
あるシートのセルに画像を貼り付け終了した際には発生しない。
同じシートに複数枚貼る場合も発生しない。

つまり、
func main() {
xlsx := excelize.NewFile()
// ワークシートを作成する
index := xlsx.NewSheet("Sheet2")
//シート1のA2セルにimage1.jpgを貼り付ける
//この時点ではまだ大丈夫
err := xlsx.AddPicture("Sheet1", "A2", "./image1.jpg", "")
if err != nil {
fmt.Println(err)
return err
}
//シート2のA20セルにimage2.jpgを貼り付ける
//これを実行すると、シート1とシート2のA2にそれぞれimage1.jpgが、A20にそれぞれimage2.jpgが貼り付けられる。
err := xlsx.AddPicture("Sheet1", "A20", "./image1.jpg", "")
if err != nil {
fmt.Println(err)
return err
}
// エクセルを保存
err := xlsx.SaveAs("./Book1.xlsx")
if err != nil {
fmt.Println(err)
}
return nil
}

セルの文字列やオートシェイプでは発生していないことから、おそらく画像情報に関してはスライスにバイト情報をひたすら保存するまで持ち続けている結果、別シートにシフトした際にシート指定情報がコピーされて増殖していくものではないかと推測している。delveをこの時点では起動していなかったので、状況判断としてはこんな感じだな・・・。

となると対処は、保存すること、になる。とりあえず、先にSaveASを実行し、再度開いて画像の際だけでも実行後にSaveを実行すると、保持情報が消えるためか、正常に動作する。もちろん、画像1を貼り付けてから、SaveASを実行し開き直してから画像2を貼り付けても問題ない。
今のところissueにこのような問い合わせはなかったので、こういう使い方で不思議に思うケースがなかったのかもしれない。

func main() {
xlsx := excelize.NewFile()
// ワークシートを作成する
index := xlsx.NewSheet("Sheet2")
// エクセルを保存
err := xlsx.SaveAs("./Book1.xlsx")
if err != nil {
fmt.Println(err)
}
//作成したエクセルを展開
xlsx, err := excelize.OpenFile("./Book1.xlsx")
if err != nil {
fmt.Println(err)
return err
}
//シート1のA2セルにimage1.jpgを貼り付ける
err := xlsx.AddPicture("Sheet1", "A2", "./image1.jpg", "")
if err != nil {
fmt.Println(err)
return err
}
// エクセルを保存
err := xlsx.Save()
if err != nil {
fmt.Println(err)
}
//シート2のA20セルにimage2.jpgを貼り付ける
err := xlsx.AddPicture("Sheet1", "A20", "./image1.jpg", "")
if err != nil {
fmt.Println(err)
return err
}
// エクセルを保存
err := xlsx.Save()
if err != nil {
fmt.Println(err)
}
return nil
}

これを実行すると、シート1のA2にのみimage1.jpgが、シート2のA20にのみimage2.jpgが貼り付けられたBook1.xlsxが生成される。


0 0

コメント

mixiユーザー

ログインしてコメントを確認・投稿する