2017-07-31 126 views
2

背景:我正在使用Microsoft.Office.Interop.Excel庫在我的Windows窗體程序中打開,處理和保存excel文件。由於我無法完全理解的原因,我需要將屏幕上顯示的信息一次最小化,所以我使用DataTable和DataGridView來操縱存儲在excel文件中的信息。我可以插入和編輯信息,但我的問題是保存。以讀/寫模式打開Excel文件的VB問題

我的問題:

當試圖救回來了使用WorkBook.Save()函數的Excel文件,這些更改不會當我在Excel中打開文件反映。作爲一個測試,我嘗試了.SaveAs()函數來查看發生了什麼,並得到了原始文件以只讀模式打開的錯誤。我使用了.SaveCopyAs()函數來確保我的信息正確輸出,並且保存的副本包含我所做的更改。

我嘗試過任何和所有隻讀和保存屬性的每種可能的組合,我可以找到,以下兩個屬性似乎可以解決大多數其他人的問題,但不會爲我工作。

xlWorkBook = xlApp.Workbooks.Open(currFile, IgnoreReadOnlyRecommended:=True, ReadOnly:=False) 

我的代碼是在幾個職能分散,因爲我使用按鈕和菜單項進行操作的程序,但它遵循相同的工作流程從本網站保存例子,除了我設置xlApp.Visible = Falsehttp://www.siddharthrout.com/2012/09/12/saving-and-closing-the-excel-file-savesave-as-method/

我很感激任何幫助。

編輯: 忘了提及,我正在使用Excel 2010和Visual Studio 2015與VB Windows窗體應用程序模板。

+0

該行代碼嘗試將Workbook(它沒有)的[默認值](https://stackoverflow.com/a/19200523/11683)賦給預定義的Excel枚舉值'XlWindowType.xlWorkbook '。重命名你的變量並[使用'Set'](https://stackoverflow.com/a/17877644/11683)。 – GSerg

+0

也許 - 但它聽起來好像pmackni正在將數據導入到數據表中,然後將其轉化爲datagridview,然後進行編輯。現在他想要把數據表放回excel文件,所以這個Saveas將不起作用 – codeMonger123

+0

codeMonger123是對的,這是我正在使用的方法。至於Set路由,我使用的VB版本不再支持Sets和Lets,所以這個解決方案對我來說不起作用。我用這行代碼聲明xlWorkBook變量:'Private xlWorkBook As Excel.Workbook'。 – pmackni

回答

0

我找到了我的問題的答案。我可以通過移動TnTinMn代碼,以我的open方法提供的方式,以可讀/寫或只讀模式可靠地打開文件。它不是一個運行excel的幽靈實例,至少不是真的:當它仍然用另一種方法在同一個程序中打開時,您無法以讀/寫模式打開文件。我發現打開一個文件的方法看起來或多或少像這樣(這是一個非常從我所擁有的簡化版本,所以它將是一個比我處理它時更明顯的問題):

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(),當然它只能以只讀方式打開。不幸的是,我沒有趕上這一點,因爲我比之前的例子片段還要多。我發現,我甚至都不需要使用流對於我而言,現在我的代碼如下這種結構:

If openFileDialog1Result = System.Windows.Forms.DialogResult.OK Then 
    Try 
     currFile = openFileDialog1.FileName 

     wb = DirectCast(Marshal.BindToMoniker(currFile), Excel.Workbook) : wb.Application.Visible = True : wb.Application.UserControl = True : wb.Windows(1).Visible = True 
    Catch Ex As Exception 
     MessageBox.Show("Cannot read file from disk. Original error: " & Ex.Message) 
    End Try 
End If 

我感謝所有我得到的幫助,我爲帶大家在雁道歉追。