1

データテーブルからWebアプリケーションのExcelファイルにデータを挿入しようとしています。ボタンを押すと、データテーブルが入力され、Excelファイルに挿入されます。問題は、データが正しく挿入され、ファイルを保存してから閉じると、データが消えてしまうことです。そして、Excelドキュメントが閉じられたときに発生します。

これは私のコードです:

public  bool ExportDataTableToExcel(DataTable dt, string filepath)
{

    Excel.Application oXL;
    Excel.Workbook oWB;
    Excel.Worksheet oSheet;
    Excel.Range oRange;

    try
    {
        // Start Excel and get Application object. 
        oXL = new Excel.Application();

        // Set some properties 
        oXL.Visible = true;
        oXL.DisplayAlerts = false;

        // Get a new workbook. 
        oWB = oXL.Workbooks.Add(Missing.Value);

        // Get the Active sheet 
        oSheet = (Excel.Worksheet)oWB.ActiveSheet;
        oSheet.Name = "Data";

        int rowCount = 1;
        foreach (DataRow dr in dt.Rows)
        {
            rowCount += 1;
            for (int i = 1; i < dt.Columns.Count + 1; i++)
            {
                // Add the header the first time through 
                if (rowCount == 2)
                {
                    oSheet.Cells[1, 1] = "CustID";
                    oSheet.Cells[1, 2] = "Alias";
                    oSheet.Cells[1, 3] = "AdrID";
                    oSheet.Cells[1, 4] = "Truck Delivery Days";
                    oSheet.Cells[1, 5] = "Truck Delivery Hours";
                    oSheet.Cells[1, 6] = "Truck Delivery Type";
                    oSheet.Cells[1, 7] = "Plane Delivery Days";
                    oSheet.Cells[1, 8] = "Plane Delivery Hours";
                    oSheet.Cells[1, 9] = "Plane Delivery Type";
                    oSheet.Cells[1, 10] = "Other Delivery Days";
                    oSheet.Cells[1, 11] = "Other Delivery Hours";
                    oSheet.Cells[1, 12] = "Other Delivery Type";
                    oSheet.Cells[1, 13] = "Distance to Dealer";
                }
                oSheet.Cells[rowCount, i] = dr[i - 1].ToString();
            }
        }
        oRange = oSheet.Range[oSheet.Cells[1, 1],oSheet.Cells[rowCount, dt.Columns.Count]];
        oRange.EntireColumn.AutoFit();

        // Save the sheet and close 
        oSheet = null;
        oRange = null;
        oWB.SaveAs(filepath, Excel.XlFileFormat.xlWorkbookNormal,
            Missing.Value, Missing.Value, Missing.Value, Missing.Value,
            Excel.XlSaveAsAccessMode.xlExclusive,
            Missing.Value, Missing.Value, Missing.Value,
            Missing.Value, Missing.Value);
        oWB.Close(Missing.Value, Missing.Value, Missing.Value);
        oWB = null;
        oXL.Quit();
    }
    catch
    {
        throw;
    }
    finally
    {
        // Clean up 
        // NOTE: When in release mode, this does the trick 
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
    }

    return true;
} 

そして、この行が実行されると、データは消えます。

 oWB.Close(Missing.Value, Missing.Value, Missing.Value);

誰かがこれで私を助けることができますか?

ありがとう

4

1 に答える 1

6

相互運用機能は、MSによるサーバーシナリオ(ASP ...など)ではサポートされていません

サーバーにExcelを相互運用/インストールせずにExcelファイルを読み取り/編集/作成するための多くのオプションがあります。

MSは無料のOpenXMLSDKV 2.0を提供しています-http://msdn.microsoft.com/en-us/library/bb448854%28office.14%29.aspx(XLSXのみ)を参照しください

これにより、MS Officeファイル(Excelを含む)の読み取りと書き込みが可能になります。

別の無料オプションは、http://www.codeproject.com/KB/office/OpenXML.aspx(XLSXのみ)を参照してください。

古いExcelバージョン(XLSXだけでなくXLSなど)の処理、レンダリング、PDFの作成、数式などが必要な場合は、ClosedXML(無料、XLSXのみ)、EPPlus(無料、XLSXのみ)などのさまざまな無料および商用ライブラリがあります。 、Aspose.CellsSpreadsheetGearLibXLFlexcelなど。

于 2013-01-07T07:30:18.067 に答える