VB.NET - 保存由Web应用程序打开的excel文件

时间:2012-08-30 16:22:33

标签: vb.net

使用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)。

3 个答案:

答案 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