0

VB.NET を使用して、エクスポート ボタンをクリックして Web アプリケーションで開いた Excel ファイルを保存しようとしています (ファイルは「Book1」という一時名で開いたままです)。vb.net を使用して、既存の Excel ファイルを xlsx、xls、html などの特定の形式で保存する exe ファイルを作成しようとしています。標準製品「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 形式で保存することです。これは、実装しようとしている自動化テストの一部です。MS Excelとの統合が改善されるため、vb.netをターゲットにしています。この外部 exe (.net) または関数 (vbscript) の一部は、自動化ツールからトリガーできます。

4

3 に答える 3

1

質問の更新、vbscript を使用して、アプリケーションから開かれた Excel ストリームを保存することにちょっと落ち着きました。

vb.net関数を使用すると、excel.interopがすでに開いているファイル(外部プログラムによって開かれた)を認識しないという問題がありました。

Excel ファイルが vbscript によって認識されない場合に、ブラウザなどの別のオブジェクト コレクションにフォーカスを設定しようとし、それを 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 に答える