web-dev-qa-db-ja.com

Excel相互運用機能で保存ダイアログを表示せずにブックを保存する方法は?

DataSetをExcelにエクスポートするコンソールアプリケーションを作成する必要があります。問題は、保存ウィンドウをポップアップするのではなく、Excelファイルを自動的に作成することです。これまでのところ、次のコードがありますが、自動的に保存する方法がわかりません。どんな助けにも感謝します。

public static void CreateWorkbook(DataSet ds, String path)
{
    int rowindex = 0;
    int columnindex = 0;

    Microsoft.Office.Interop.Excel.Application wapp = new Microsoft.Office.Interop.Excel.Application();
    Microsoft.Office.Interop.Excel.Worksheet wsheet;
    Microsoft.Office.Interop.Excel.Workbook wbook;

    wapp.Visible = false;

    wbook = wapp.Workbooks.Add(true);
    wsheet = (Worksheet)wbook.ActiveSheet;

    try
    {
        for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
        {
            wsheet.Cells[1, i + 1] = ds.Tables[0].Columns[i].ColumnName;

        }

        foreach (DataRow row in ds.Tables[0].Rows)
        {
            rowindex++;
            columnindex = 0;
            foreach (DataColumn col in ds.Tables[0].Columns)
            {
                columnindex++;
                wsheet.Cells[rowindex + 1, columnindex] = row[col.ColumnName];
            }
        }
    }
    catch (Exception ex)
    {
        String err = ex.Message;
    }
    wapp.UserControl = true;
}
12
ha1ogen

WorkBook.SaveAs()への引数はすべてオプションですが、必要に応じて、ほとんどの場合にType.Missingを使用できます。

典型的な呼び出しは次のようになります。

wbook.SaveAs("c:\\temp\\blah", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing,
            false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wbook.Close();

ファイル拡張子を含めなかったことに注意してください。 Excelが設定します。

Workbook.SaveAsメソッド(Microsoft.Office.Tools.Excel)| Microsoft Docs は、各引数について説明します。

29
Igby Largeman

ConflictResolutionXlSaveConflictResolution.xlLocalSessionChangesに追加
そして、アプリケーションのDisplayAlertsプロパティをfalseに設定して、ウィンドウが表示されないようにします。

m_xlApp.DisplayAlerts = false;

// Quit Excel and clean up.
m_xlWorkbook.SaveAs(Filename: m_xlFilePath, FileFormat: excelFileExtension,
Password: false, ReadOnlyRecommended: XlSaveAsAccessMode.xlNoChange,
ConflictResolution: XlSaveConflictResolution.xlLocalSessionChanges);  

m_xlWorkbook.Close();

詳細については、「 XlSaveConflictResolution列挙型(Microsoft.Office.Interop.Excel)| Microsoft Docs 」を参照してください。

5
Guy Cohen

ブックのSaveAsメソッドを呼び出してみてください。多くのパラメータについては、Type.Missing最初のパラメーター以外のすべてのパラメーター(ファイル名)。

5
Felice Pollano
wapp.DisplayAlerts = false;

設定 Application.DisplayAlertsfalseのプロパティは、そのすべてのワークブックのすべてのアラートの表示を停止します。

3
HuBeZa
3
Stephan Bauer

使用する open xml sdk自動化の代わりにドキュメントを生成します。それははるかに信頼できます。

2
user2344263

DisplayAlertsプロパティを使用します。その非常にシンプルで高速です。

private void SaveAs(Excel.Workbook WorkBook, string FileName)
    {
        m_Saving = true;
        try
        {
            if (Global.CreatingCopy)
                this.ExcelApp.DisplayAlerts = false;

            WorkBook.SaveAs(FileName);
        }
        finally
        {
            m_Saving = false;
            if (this.ExcelApp.DisplayAlerts == false)
                this.ExcelApp.DisplayAlerts = true;
        }
    }

ファイルを保存するときに、Excelにファイルの種類を定義させないでください。形式が変更される可能性があるためです。

元のドキュメントが.xlsで、現在のユーザーがOffice 2013のデフォルトの形式である.xlsxを持っている場合、Excelはファイルを.xlsxに変換し、Excel 2010以降ではユーザーはファイルを開くことができません。

2