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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

12224閲覧

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

SNMAGN

総合スコア12

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/04/01 09:29

編集2019/04/01 09:32

前提・実現したいこと

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:

該当のソースコード

VB

1Imports OfficeOpenXml 2Imports System.IO 3 4Public Class Form1 5 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 6 Dim file = New FileInfo("locked.xlsx") 7 8 Using package = New ExcelPackage(file, "123456789") 9 Dim sheet = package.Workbook.Worksheets.First 10 Console.WriteLine(sheet.Cells("A1").Value) 11 12 sheet = package.Workbook.Worksheets.Add("sampleAdd") 13 Dim wRange = sheet.Cells("A2") 14 wRange.Style.Numberformat.Format = "yyyy/m/d hh:mm:ss" 15 wRange.Value = Date.Now 16 package.Save() 17 Console.WriteLine("Saved!") 18 End Using 19 End Sub 20End Class

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

Windows 10 Pro
VS2015
EPPlus 4.5.3.1

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

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

投稿2019/04/01 14:04

編集2019/04/01 14:14
shinami

総合スコア334

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SNMAGN

2019/04/02 00:02 編集

ご連絡ありがとうございます。 EPPlusはOffice Open XML形式で作成されたEXCELファイルを読み書きできるライブラリになります。 参考:https://chawatoyo.blog.fc2.com/blog-entry-1.html#c03 > 別のプロセスで使用されているため、プロセスはファイル [ファイルパス] にアクセスできません。 についてですが、EXCEL2015を閉じて他にEXCELファイルを開いているものがない状態で動かしています。なので、上で載せているサンプルコード以外のプログラム以外では開いていないはずなのですが、上書きができるsaveメソッド実行時に他所で開かれていることになっていて正常に終了できていません。 「自分自身が開いている」ので、ファイルロックがかかっている?という事も考えたのですが、それだとSaveメソッドの存在意義が全くないし、公式のサンプルにもSaveメソッドで上書きするコードはあるので、解決策が見当たらずに困っています。 参考:https://github.com/JanKallman/EPPlus/wiki/Getting-Started
shinami

2019/04/02 02:55

そうですねぇ、他に起動していないとなると何でしょう・・。 別名で保存のSaveAsメソッドなんてのもあるみたいですが別名では保存されるでしょうし・・。 あと、"123456789"はパスワードになるのでしょうか? 開くときに指定していれば無くても良いらしいのですがSave("パスワード値")というのもあるらしいです。
SNMAGN

2019/04/02 04:55

> あと、"123456789"はパスワードになるのでしょうか? パスワードになります。 > Save("パスワード値") 効果がなかったです...
shinami

2019/04/02 07:59

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

2019/04/16 09:39

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

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/02 05:01

SNMAGN

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SNMAGN

2019/04/16 09:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問