ClosedXMLによるExcel編集がVirusBusterに強制終了させられる

ClosedXMLで、ファイルサーバの雛形ファイルをもとに編集して出力するということをよく行います。 この際、ClosedXMLの保存先がファイルサーバだと、当社のVirus Buster Business SecurityにUnauthorized Encryptionと言われて 強制終了させられることがあります。Excelファイルは作成できず、exeも消されてしまうので再インストールとなります。 テストした結果、ClosedXMLでの保存先がローカルであれば問題ないことが確認できたので、ClosedXMLではローカルに一時フォルダを作成してそこに保存し、System.IO.File.Copyでコピーすることで解消しました。

<span title='2018-09-14 00:00:00 +0900 +0900'>September 14, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

ClosedXMLでWindows7だけレイアウトが崩れる

アホな話です。 ClosedXMLで、一部コードでうっかり以下のようなコード書いてました。 using (IXLWorkbook targetBook = new XLWorkbook(filePath)) { using (IXLWorksheet targetSheet = targetBook.Worksheet(1)) { } targetBook.Save(); } usingの入れ子です。 普通、入れ子になるような階層があれば一番上位のクラスが下位のDispose呼んでくれるっと思いますよね〜。 でも、このときはusing句覚えたてで、とにかく使いたかったんです、using入れ子かっけ〜って思ってたんです… 症状としては、Windows 7の場合のみシートのフォーマットが崩れます。なぜかWindows 10は大丈夫。OSによって症状が違う理由は不明。 sourceを見ると、XLWorksheetのDisposeでrange情報をクリアしてるっぽいから、そこで情報が消えて、そのまま保存すればそりゃレイアウトは崩れるな〜と。 追記) どうも、最新の0.93.1で発生し、0.92.0では発生しなかったようだ。ライブラリのバージョンアップした途端に大量に問い合わせが…

<span title='2018-09-13 00:00:00 +0900 +0900'>September 13, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

ClosedXMLの画像追加におけるWorksheetの取り扱いについて

C#でClosedXMLを使用してExcelに画像を追加する処理をしていた際、なぜかWorkbookの保存時にObjectDisposedExceptionが発生するという事態になりました。 以下のようなコードです using (XLWorkbook wb = new XLWorkbook(filePath)) { IXLWorksheet ws_src = wb.Worksheet("Template"); using (IXLWorksheet ws = ws_src.CopyTo("1")) { var image = ws.AddPicture(imagePath1); image.MoveTo(ws.Cell(3, 3).Address); image.Scale(.5); image = ws.AddPicture(imagePath2); image.MoveTo(ws.Cell(20, 3).Address); image.Scale(2); } using (IXLWorksheet ws = ws_src.CopyTo("2")) { var image = ws.AddPicture(imagePath3); image.MoveTo(ws.Cell(3, 3).Address); image.Scale(.5); } ws_src.Delete(); wb.Save(); } wb.Save() を実行すると例外が発生します。imageの処理をコメントアウトするとエラーは発生しません。 結論として、Worksheetを割り当てるusing句を外したところ、正常に動作するようになりました。エラー調査の際にOpenXMLのコードもちらっと見たのですが、おそらく画像を追加する際にいったんWorksheetの情報を更新して再割り当てするような処理が必要となります。usingを使っていると再割り当てができないのでエラーになったのではないかと。 ただ、エラー箇所がusing句の中ではなく、Saveを実行した場所というのはよくわからないのですが… 再割り当てできない状態で内部変数をいろいろいじくって、それをファイルに保存する際にそれが検知されてエラーとなる、とかではないかと。 ClosedXMLのサンプルコードを見ていると、Workbookにusing句を使用するものはあるが、Worksheetに使用するものはほとんどない。WorkbookのDisposeで配下のすべてのリソースが解放されるので不要なのだろう。上記書き方が一般的ではないのかも。

<span title='2017-11-07 10:20:41 +0000 UTC'>November 7, 2017</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41