0

使用 VB.NET,我试图通过单击导出按钮保存由 Web 应用程序打开的 excel 文件(文件保持打开状态,临时名称为“Book1”)。我正在尝试使用 vb.net 创建一个 exe 文件,它将现有的 excel 文件保存为给定的格式,比如 xlsx 或 xls 或 html。这是一个迷你自动化项目,我想用标准产品“VB.NET”来实现

我精通vba,在我使用工作簿索引循环所有现有文件而不知道文件名的情况下,在vb.net(我是新手)中我做不到。这是一个迷你项目,我正在尝试实施。

问题:Excel Interop 无法识别打开的文件。

使用“workbook.count”获取计数时,它报告为零,但如果文件是通过互操作使用“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)。

4

3 回答 3

1

关于这个问题的更新,有点决定使用 vbscript 来保存从应用程序打开的任何 excel 流。

使用 vb.net 函数时,我遇到了 excel.interop 无法识别已经打开的文件(由某些外部程序打开)的问题。

在某些情况下,vbscript 无法识别 excel 文件,我尝试将焦点设置在浏览器等不同的对象集合上并将其设置回 excel,我能够识别它。

感谢所有的帮助。

于 2012-10-15T20:56:21.843 回答
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;
        }
    }
}

此代码示例改编自有关 WinWord 的类似问题的 Microsoft 支持文章。您可以阅读这篇文章以更好地理解这种方法的问题。
我真的建议更改您的 Web 应用程序以完成保存文件的任务。

于 2012-08-30T22:34:34.360 回答
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

于 2012-09-02T15:03:23.403 回答