2

私はこのようなことをしようとしています:

public void ImportClick(object sender, EventArgs e) //the button used after selecting the spreadsheet file
{
    if (fileUpload.HasFile) //ASP.Net FileUpload control
    {
        if (fileUpload.FileName.EndsWith(".xls", StringComparison.OrdinalIgnoreCase) || fileUpload.FileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase))
        {
            Excel sheet = new Excel(fileUpload.Open()); //not sure how to do this part

            using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["our_database"].ConnectionString))
            {
                using (SqlCommand command = new SqlCommand("INSERT INTO table_name SELECT * FROM " + sheet, connection))
                {
                    connection.Open();
                    command.ExecuteQuery(); //Intellisense only has "ExecuteNonQuery()" method, but that's for T-SQL
                    connection.Close();
                }
            }
        }
        else
        {
            error.Text = "File must be either *.xls or *.xlsx";
            error.Visible = true;
        }
    }
    else
    {
        error.Text = "No file was selected";
        error.Visible = true;
    }
}

Microsoft.Office.Interop.Excel名前空間には多くのクラスとインターフェイスがあり、どれを使用すればよいかわかりません。

SQLコマンドと一緒にExcelオブジェクトを作成することは、おそらく私がここに持っているものほど簡単ではないことを知っていますが、これらは私が助けを必要としている2つのことです。

任意の提案/アドバイスをいただければ幸いです!

4

2 に答える 2

5

MicrosoftJetEngineの使用をお勧めします。

private static void UploadExcelToDB(string p)
    {
        try
        {
            using (SqlConnection conn = new SqlConnection(DBConnString))
            {
                conn.Open();
                if (conn.State == ConnectionState.Open)
                {
                    Log("Opened connection to DB");
                }
                SqlBulkCopy sbk = new SqlBulkCopy(conn);
                sbk.BulkCopyTimeout = 600;
                sbk.DestinationTableName = DbTableName;
                DataTable excelDT = new DataTable();
                OleDbConnection excelConn = new OleDbConnection(ExcelConnString.Replace("xFILEx",p));
                excelConn.Open();
                if (excelConn.State == ConnectionState.Open)
                {
                    Log("Opened connection to Excel");
                }
                OleDbCommand cmdExcel = new OleDbCommand();
                OleDbDataAdapter oda = new OleDbDataAdapter();
                cmdExcel.CommandText = "SELECT * FROM ["+ExcelTableName+"]";
                cmdExcel.Connection = excelConn;
                oda.SelectCommand = cmdExcel;
                oda.Fill(excelDT);
                if (excelDT != null)
                {
                    Log("Fetched records to local Data Table");
                }
                excelConn.Close();
                SqlCommand sqlCmd = new SqlCommand("TRUNCATE TABLE ICN_NUGGET_REPORT_RAW",conn);
                sqlCmd.CommandType = CommandType.Text;
                Log("Trying to clear current data in table");
                int i = sqlCmd.ExecuteNonQuery();
                Log("Table flushed");
                Log("Trying write new data to server");
                sbk.WriteToServer(excelDT);
                Log("Written to server");
                conn.Close();
            }
        }
        catch (Exception ex)
        {
            Log("ERROR: " + ex.Message);
            SendErrorReportMail();
        }
        finally
        {
            #if (DEBUG)
            {
            }
            #else
            {
            string archive_file = ArchiveDir+"\\" + DateTime.Now.ToString("yyyyMMdd-Hmmss") + ".xlsx";
            File.Move(p, archive_file);
            Log("Moved processed file to archive dir");
            Log("Starting archive process...");
            }
            #endif
        }
    }

これはどのようExcelConnStringに見えるかです:

public static string ExcelConnString { get { return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xFILEx;Extended Properties=\"Excel 12.0;HDR=YES\";";} }

HDR = YES-これは、スプレッドシートに列名がある場合、それらが互いに一致するターゲットテーブルの列名として扱われることを意味します。

于 2012-06-29T20:29:14.570 に答える
0

excel.applicationクラスのインスタンスを作成し、セルをループするコードを作成することを考えています。また、SQL挿入クエリを使用して、行を1つずつSQLテーブルにコピーします。とにかく私はまだそれを解決していて、終わったらコードを貼り付けます。

于 2013-01-18T09:17:21.010 に答える