質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

EPPlusを使用したEXCELファイルの上書きがうまくいきません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,820

score 12

前提・実現したいこと

VB.NETでEPPlusを使用してEXCELの内容を書き換えるプログラムを作成中なのですが、上書き処理に失敗してしまい途方に暮れています。
原因究明の為に、NUGETでEPPlusだけを追加した新規プロジェクトで小さいサンプルプログラムを動作させてみたのですが、やはり例外が発生し、メッセージには「Error overwriting file」や「Error saving file」と表示されます。
何かお心当たりのある方は、ご連絡いただけないでしょうか。
ちなみに「Console.WriteLine(sheet.Cells("A1").Value)」でEXCELの内容が読み込めているので、ファイルの設置場所に間違いはないです。

発生している問題・エラーメッセージ

System.InvalidOperationException はハンドルされませんでした。
  HResult=-2146233079
  Message=Error saving file [ファイルパス]
  Source=EPPlus
  StackTrace:
       場所 OfficeOpenXml.ExcelPackage.Save()
       場所 EPPlusSample.Form1.Button1_Click(Object sender, EventArgs e) 場所 C:\Users\[ユーザ名]\Documents\visual studio 2015\Projects\EPPlusSample\EPPlusSample\Form1.vb:行 13
       場所 System.Windows.Forms.Control.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       場所 System.Windows.Forms.Control.WndProc(Message& m)
       場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
       場所 System.Windows.Forms.Button.WndProc(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       場所 EPPlusSample.My.MyApplication.Main(String[] Args) 場所 :行 81
       場所 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       場所 System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
       HResult=-2146233088
       Message=Error overwriting file [ファイルパス]
       Source=EPPlus
       StackTrace:
            場所 OfficeOpenXml.ExcelPackage.Save()
       InnerException: 
            HResult=-2147024864
            Message=別のプロセスで使用されているため、プロセスはファイル [ファイルパス] にアクセスできません。
            Source=mscorlib
            StackTrace:
                 場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
                 場所 System.IO.File.InternalDelete(String path, Boolean checkHost)
                 場所 System.IO.File.Delete(String path)
                 場所 OfficeOpenXml.ExcelPackage.Save()
            InnerException: 

該当のソースコード

Imports OfficeOpenXml
Imports System.IO

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim file = New FileInfo("locked.xlsx")

        Using package = New ExcelPackage(file, "123456789")
            Dim sheet = package.Workbook.Worksheets.First
            Console.WriteLine(sheet.Cells("A1").Value)

            sheet = package.Workbook.Worksheets.Add("sampleAdd")
            Dim wRange = sheet.Cells("A2")
            wRange.Style.Numberformat.Format = "yyyy/m/d hh:mm:ss"
            wRange.Value = Date.Now
            package.Save()
            Console.WriteLine("Saved!")
        End Using
    End Sub
End Class

補足情報(FW/ツールのバージョンなど)

Windows 10 Pro
VS2015
EPPlus 4.5.3.1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

私はEPPlusという物を使った事が無いので全くの解決にならないかもしれませんが、

別のプロセスで使用されているため、プロセスはファイル [ファイルパス] にアクセスできません。

と出ていいるのでプログラムが起動していない時、タスクマネージャーにプロセスExcelが残ったままになっていませんか?
残っているならExcelプロセスの終了を行い再度試してみてはどうでしょうか?
残っていなければ私の的外れですのでこのコメントはスルーしてください。

残っているならこれは、Excelアプリを起動するライブラリでしょうか?
Excelアプリを起動するライブラリでかつタスクマネージャーにExcelプロセスが残っていた場合は、オブジェクトの解放が出来ていない可能性があります。
Usingを使われているので解放出来ていなという事では無いか・・・。
いずれにしても、すでに開かれているものにアクセスしている気がします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/02 13:55

    > あと、"123456789"はパスワードになるのでしょうか?
    パスワードになります。

    > Save("パスワード値")
    効果がなかったです...

    キャンセル

  • 2019/04/02 16:59

    やはりパスワードとかそういう問題ではなかったですね。
    .NET3.5だけっていうのも何ででしょう。
    こちらExcel2015?2016?を持っていないので試せませんでしたが
    EPPlusのNugetを見てみると2か月前のバージョンもあるので対応していないなんて事は確かになさそうですよね。

    キャンセル

  • 2019/04/16 18:39

    EXCEL2016でした。
    上で追記したのですが、コードは変えていないのに再現しなくなってしまったので、迷宮入りしてしまいました...

    キャンセル

check解決した方法

0

根本原因はまだ不明ですが、[target framework]を[.net framework 3.5 ClientProfile]にすると上記のコードのまま、上書き保存が可能になりました。

EPPlusのソースコードからサンプルプロジェクトを開くと、プロジェクト設定で[target framework]が[.net framework 3.5 ClientProfile]になっていたので、自分のサンプルプロジェクトでも同じように設定したところ、上書き保存が可能になりました。その後以下のバージョンで行いましたが3.5以外では上書き時に上記の例外が発生してしまいました。

  • 4
  • 4.5
  • 4.6.1

根本原因は改めて調査してみようと思いますが、今回の質問についてはココで閉め切ろうと思います。
ご連絡をくださった shinami 様, またこの質問を見てくださった他の方々、ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/16 18:38

    後日確認したところ、.net frameworkのバージョンに関わらず、読み書きできていました...
    全く想定外のプロセスがEXCELファイルをロックしたままになっていたようです。
    その後現在までロックされることがなかったので、原因は全く別のところにあったようですが、今度は再現しなくなってしまったので、調査は打ち切りとしました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る