1

ファイルアップロードコントロールを使用して Excel スプレッドシート (xls および xlsx) を選択し、それをファイルストリームオブジェクトで解析してからデータセットに入力する最良の方法を見つけようとしています。

これはこれまでのところ私のコードですが、違いは、Excel スプレッドシートをソリューションのフォルダーに保存してから、Microsoft ACE OLEDB 接続を使用してデータを照会していることです。

protected void btnUpload_Click(object sender, EventArgs e)
    {
        string connectingString = "";
        if (ctrlFileUpload.HasFile)
        {
            string fileName =
                Path.GetFileName(ctrlFileUpload.PostedFile.FileName);

            string fileExtension =
                Path.GetExtension(ctrlFileUpload.PostedFile.FileName);
                //Path.GetExtension(ctrlFileUpload.PostedFile.ContentType);

            string fileLocation =
                Server.MapPath("~/App_Data/" + fileName);
            ctrlFileUpload.SaveAs(fileLocation);

            // Check whether file extension is xls or xslx
            if (fileExtension == ".xls")
            {
                connectingString =
                    "Provider=Microsoft.ACE.OLEDB.4.0;Data Source=" +
                    fileLocation + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=2\"";
            }

            else if (fileExtension == ".xlsx")
            {
                connectingString =
                    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
                    fileLocation + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=2\"";
            }

            // Create OleDb Connection and OleD Command
            using (OleDbConnection con = new OleDbConnection(connectingString))
            {
                try
                {
                    OleDbCommand cmd = new OleDbCommand();
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = con;
                    OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
                    //DataTable dtExcelRecords = new DataTable();
                    DataSet ds = new DataSet();
                    con.Open();
                    DataTable dtExcelSheetName = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                    string getExcelSheetName = dtExcelSheetName.Rows[0]["Table_Name"].ToString();
                    cmd.CommandText = "Select * FROM [" + getExcelSheetName + "]";
                    dAdapter.SelectCommand = cmd;
                    //dAdapter.Fill(dtExcelRecords);
                    dAdapter.Fill(ds);
                    //GridView1.DataSource = dtExcelRecords;
                    //GridView1.DataBind();
                }
                catch (Exception ex)
                {

                }
            }

        }
    }

要約すると、スプレッドシートでデータを読み取り、それをデータセットにバインドしますが、ファイルを物理パスに保存する必要はありません。

私が見逃しているこのコードを書くためのよりクリーンな方法はありますか? ありがとう!!

4

1 に答える 1

0

サーバーにファイルを保存せずにデータを取得することはできないと思います

アップロードしたファイルを保存できない場合Data Source、oleDbConnection 文字列にどのように指定できますか??

ファイルを保持したくない場合は、この実行が終了した後にファイルを削除できます。

この方法で参照することもできます https://stackoverflow.com/a/12420416/284240

于 2012-09-14T11:10:09.807 に答える