使用VB.NET,我试图通过单击导出按钮来保存由Web应用程序打开的excel文件(文件保持打开状态,临时名称为“Book1”)。我正在尝试使用vb.net创建一个exe文件,它将现有的excel文件保存为给定的格式,比如xlsx或xls或html。这是一个迷你自动化项目,我想用标准产品“VB.NET”实现
我非常精通vba,在我使用工作簿索引循环所有现有文件而不知道文件的名称,在vb.net(我是新手)我不能。这是一个迷你迷你项目,我正在尝试实施。
问题:Excel Interop无法识别打开的文件。
使用“workbook.count”获取计数时,它会报告为零,但如果文件是由interop使用“workbook.add”创建的,则会将计数报告为1。
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Dim xlApp As New Application
fileCount1 = xlApp.Workbooks.Count
filecount1 = 0(在上面代码的最后一行之后观察它)
有人可以指导我找到解决方案。
谢谢!
更新 主要思想是使用.net或vbscript或任何其他技术将文件保存为xls或html格式。这是我们正在尝试实施的自动化测试的一部分。我的目标是vb.net,因为它可以更好地与MS Excel集成。可以从自动化工具触发此外部exe(.net)或函数(vbscript)。
答案 0 :(得分:1)
关于这个问题的更新,有点决定使用vbscript来保存从应用程序打开的任何excel流。
使用vb.net函数,我遇到了excel.interop无法识别已经打开的文件(由某些外部程序打开)的问题。
在某些情况下,在vbscript无法识别excel文件的情况下,我尝试将焦点设置在不同的对象集合上,如浏览器并将其重新设置为excel,我能够识别它。
感谢您的帮助。
答案 1 :(得分:0)
您需要获取对Web应用程序打开且仍在运行的Excel应用程序的引用。如果您有此引用,则可以使用Excel.Interop并使用所需名称保存/关闭工作簿
public bool SaveOpenExcel(string fileName)
{
int iSection = 0, iTries = 0;
Microsoft.Office.Interop.Excel.Application oExcel;
tryAgain:
try
{
iSection = 1; // Attempting GetObject.
oExcel = (Microsoft.Office.Interop.Excel.Application)
System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
iSection = 0; // Resume normal error handling.
oExcel.ActiveWorkbook.SaveAs(@"d:\temp\running.xlsx",
Microsoft.Office.Interop.Excel.XlFileFormat.xlXMLSpreadsheet,
System.Type.Missing, System.Type.Missing, System.Type.Missing,
System.Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing,
System.Type.Missing);
oExcel.Quit();
oExcel = null;
return true;
}
catch (Exception err)
{
if (iSection == 1)
{
//GetObject may have failed because the
//Shell function is asynchronous; enough time has not elapsed
//for GetObject to find the running Office application. Wait
//1/2 seconds and retry the GetObject. If you try 20 times
//and GetObject still fails, assume some other reason
//for GetObject failing and exit the procedure.
iTries++;
if (iTries < 20)
{
System.Threading.Thread.Sleep(500); // Wait 1/2 seconds.
goto tryAgain; //resume code at the GetObject line
}
else
{
Console.WriteLine("GetObject still failing. Process ended.");
return false;
}
}
else
{
//iSection = 0 so use normal error handling:
Console.WriteLine(err.Message);
return false;
}
}
}
此代码示例已从Microsoft支持文章改编而来,与WinWord有类似问题。你可以read the article更好地理解这种方法的问题 我真的建议您更改Web应用程序以完成保存文件的任务。
答案 2 :(得分:0)
Dim fileTest As String = "C:\Temp\ExcelTest\test.xlsx"
If File.Exists(fileTest) Then
File.Delete(fileTest)
End If
Dim oExcel As Object
oExcel = CreateObject("Excel.Application")
Dim oBook As Excel.Workbook
Dim oSheet As Excel.Worksheet
oBook = oExcel.Workbooks.Add
oSheet = oExcel.Worksheets(1)
oSheet.Name = "Test Name"
oSheet.Range("A1").Value = "SOME VALUE"
oBook.SaveAs(fileTest)
oBook.Close()
oBook = Nothing
oExcel.Quit()
oExcel = Nothing
http://howtodomssqlcsharpexcelaccess.blogspot.ca/2012/08/vbnet-how-to-creae-excel-file-simple.html