后台:我正在使用Microsoft.Office.Interop.Excel库在我的Windows窗体程序中打开,操作和保存Excel文件。由于我不能完全进入的原因,我需要在屏幕上显示的信息在任何时候都是最小的,所以我使用DataTables和DataGridViews来操纵存储在excel文件中的信息。我可以很好地引入和编辑信息,但我的问题在于保存。
我的问题:
尝试使用WorkBook.Save()函数保存回excel文件时,在Excel中打开文件时不会反映更改。作为测试,我尝试使用.SaveAs()函数查看原因并获得原始文件以只读模式打开的错误。我使用.SaveCopyAs()函数来确保我的信息输出正确,保存的副本包含我所做的更改。
我已经尝试了我能找到的任何和所有只读和保存属性的所有可能组合,并且以下两个属性似乎解决了大多数其他人的问题,但对我不起作用。
xlWorkBook = xlApp.Workbooks.Open(currFile, IgnoreReadOnlyRecommended:=True, ReadOnly:=False)
我的代码分布在多个函数中,因为我使用按钮和菜单项来操作程序,但它遵循与本网站的Save示例相同的工作流程,除了我设置xlApp.Visible = False
:{{3 }}
我很感激任何帮助。
编辑: 忘记提及,我使用的是Excel 2010,Visual Studio 2015和VB Windows窗体应用程序模板。
答案 0 :(得分:0)
我找到了问题的答案。通过移动代码行TnTinMn,我能够可靠地以读/写或只读模式打开文件。它不是excel运行的ghost实例,至少不是真的:当它在同一程序中仍然使用另一种方法打开时,您无法以读/写模式打开文件。我发现打开文件的方法或多或少看起来像这样(这是一个非常简化的版本,所以现在它比我处理时更加引人注目。它):
rowspan="2"
现在我知道问题是什么,我觉得好像很明显,如果我试图存储文件,我会通过If openFileDialog1Result = System.Windows.Forms.DialogResult.OK Then
Try
myStream = openFileDialog1.OpenFile()
If myStream IsNot Nothing Then
wb = DirectCast(Marshal.BindToMoniker(currFile), Excel.Workbook) : wb.Application.Visible = True : wb.Application.UserControl = True : wb.Windows(1).Visible = True
'Do work
End If
Catch Ex As Exception
MessageBox.Show("Cannot read file from disk. Original error: " & Ex.Message)
Finally
' Check this again, since we need to make sure we didn't throw an exception on open.
If myStream IsNot Nothing Then
myStream.Close()
End If
End Try
End If
或任何其他方法打开,而我仍然用Excel.Workbook.Open()
打开它,当然它只能以只读方式打开。遗憾的是,我没有及早发现这一点,因为我之前的示例片段还有很多。我发现我甚至不需要为我的目的使用流,我的代码现在遵循这个结构:
openFileDialog1.OpenFile()
我感谢所有得到的帮助,而且我为带你们大肆追逐而道歉。