2
OpenFileDialog ofImport = new OpenFileDialog();
ofImport.Title = "Select file";
ofImport.InitialDirectory = @"c:\";
ofImport.FileName = txtFileName.Text;
ofImport.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*";
ofImport.FilterIndex = 1;
ofImport.RestoreDirectory = true;

if (ofImport.ShowDialog() == DialogResult.OK)
{

     string path = System.IO.Path.GetFullPath(ofImport.FileName);
     string query = "SELECT * FROM Customer.xlsx";
     OleDbConnection conn = new OleDbConnection();
     conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ofImport.FileName+";Extended Properties=" + "\"Excel 12.0 Xml;HDR=YES;IMEX=1\"";
     OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);

     //DataSet dataSet = new DataSet();
     adapter.Fill(dsSource);
     dataGridView1.DataSource = dsSource;

}
else
{
     ofImport.Dispose();
}   

DataGridViewを使用してExcelデータを取得したいdatasetdsSource使用されるデータセットです。

私が取得しているエラーは次の行にありますadapter.Fill(dsSource);

MicrosoftAccessデータベースエンジンはオブジェクト'xlsx'を見つけることができませんでした。オブジェクトが存在し、その名前とパス名のスペルが正しいことを確認してください。'xlsx'がローカルオブジェクトでない場合は、ネットワーク接続を確認するか、サーバー管理者に連絡してください。

ファイルを選択できますが、データセットを入力していません。

何をすべきか?

4

3 に答える 3

4

次の行では、ファイルから選択しています:

string query = "SELECT * FROM " + ofImport.FileName;

ただし、シートから選択する必要があるため、次のようになります。

string query = "SELECT * FROM [Sheet1$]"; // Note the '$' sign!!

Excel ファイルのシート名を見つけて、そこから選択できるようにする必要があります (シート名はシートのタブに表示されます -$記号を追加するだけです)。ファイル名は 接続文字列でのみ使用されるため、データベース エンジンはどのファイルを開くかを認識します。

.NET での通常の SQL データベース アクセスとの類似性を次のように考えてください。

file name = database name
sheet name = table name

編集
わかりやすくするために: 次の図では、シート名が赤丸で囲まれています。コードでは、select ステートメントにシート名を記述し、その後にドル記号を付けます。

ここに画像の説明を入力

于 2012-12-06T09:02:08.623 に答える
1
    DialogResult dialogResult = MessageBox.Show("Sure", "Some Title", MessageBoxButtons.YesNo);
    if (dialogResult == DialogResult.Yes)
    {
        dt = dsSource.Tables[Index];
        dt.Reset();
        Excel.Workbook workbook;
        Excel.Worksheet NwSheet;
        Excel.Range ShtRange;
        Microsoft.Office.Interop.Excel.Application ExcelObj = new Microsoft.Office.Interop.Excel.Application();
        OpenFileDialog filedlgExcel = new OpenFileDialog();
        filedlgExcel.Title = "Select file";
        filedlgExcel.InitialDirectory = @"c:\";
        //filedlgExcel.FileName = textBox1.Text;
        filedlgExcel.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*";
        filedlgExcel.FilterIndex = 1;
        filedlgExcel.RestoreDirectory = true;
        if (filedlgExcel.ShowDialog() == DialogResult.OK)
        {

            workbook = ExcelObj.Workbooks.Open(filedlgExcel.FileName, Missing.Value, Missing.Value,
                 Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                 Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);
            ShtRange = NwSheet.UsedRange;
            for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
            {
                dt.Columns.Add(new DataColumn((ShtRange.Cells[1, Cnum] as Excel.Range).Value2.ToString()));
            }
            dt.AcceptChanges();
            string[] columnNames = new String[dt.Columns.Count];
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                columnNames[0] = dt.Columns[i].ColumnName;
            }
            //string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray();


            for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++)
            {
                DataRow dr = dt.NewRow();
                for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
                {
                    if ((ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null)
                    {
                        dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString();
                    }
                }
                dt.Rows.Add(dr);
                dt.AcceptChanges();
            }
            workbook.Close(true, Missing.Value, Missing.Value);
            ExcelObj.Quit();

            dataGridView1.DataSource = dt;  
于 2012-12-11T08:57:35.180 に答える