سؤال

لدي ملف Excel في هذا النموذج:

Column 1    Column 2    Column 3  
 data1        data2    
 data1        data2  
 data1        data2  
 data1        data2  
 data1        data2       data3  

أي أن العمود 3 بأكمله فارغ باستثناء الصف الأخير. سأصل إلى ملف Excel عبر OLEDBDATAADAPTER ، وإرجاع DATATable: إليك الرمز.

query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;

النقطة المهمة هي ، في هذا السيناريو ، يعيد الكود الخاص بي dataTable مع العمود 1 والعمود 2 فقط.
أظن أن المحرك Jet يحاول استنتاج نوع العمود حسب نوع الخلية الأولى في كل عمود ؛ كونه القيمة الأولى الخالية ، يتم تجاهل العمود بأكمله.
حاولت ملء الأصفار وهذا الرمز يعيد بالفعل جميع الأعمدة الثلاثة ؛ من الواضح أن هذا هو الحل الأقل تفضيلًا لأنني يجب أن أقوم بمعالجة أعداد كبيرة من الملفات الصغيرة.
إن عكس نطاق الاختيار (من ، أي "A1: C5" إلى "C5: A1") لا يعمل أيضًا. أبحث عن شيء أكثر أناقة.
لقد وجدت بالفعل بعض المنشورات التي تناقش عدم تطابق النوع (خلايا Varchar في أعمدة INT والعكس صحيح) ولكن في الواقع لم تجد أي شيء يتعلق بهذا.
شكرا للقراءة!

تعديل

سلوك غريب مرة أخرى. يجب أن أعمل على ملفات Excel 2003 .xls في الغالب ، ولكن منذ أن تمت الإجابة على هذا السؤال ، اعتقدت أنه يمكنني اختبار الكود الخاص بي مقابل ملفات excel 2007 .xslx. سلسلة الاتصال هي ما يلي:

string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";

أحصل على "الجدول الخارجي ليس بالتنسيق المتوقع" الذي أعتقد أنه الاستثناء القياسي عندما يكون هناك عدم تطابق إصدار بين ACE/JET والملف الذي يتم فتحه.

السلسلة

Provider=Microsoft.ACE.OLEDB.12.0 

يعني أنني أستخدم أحدث إصدار من OLEDB ، لقد أخذت نظرة خاطفة سريعة حولها ويتم استخدام هذا الإصدار في كل مكان هناك حاجة إلى الاتصال بملفات .xlsx.
لقد جربت مع مزود الفانيليا (Just Excel 12.0 ، بدون IMEX أو HDR) لكنني أحصل على نفس الاستثناء.
أنا على .NET 2.0.50727 SP2 ، ربما حان الوقت للترقية؟

هل كانت مفيدة؟

المحلول

قمت بإعادة إنشاء موقفك وأعادت المتابعة الأعمدة الثلاثة بشكل صحيح. وهذا يعني أن العمودين الأولين مكتظان بالكامل بالبيانات والثالث الذي يحتوي على فارغ حتى الصف الأخير ، الذي يحتوي على بيانات.

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";";
DataTable dt = new DataTable();
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);

adapter.Fill(dt);

لاحظ أنني استخدمت Access Database Engine(ACE) المزود الذي خلف القديم Joint Engine Technology(JET) المزود ، ونتائجي قد تمثل فرق السلوك بين الاثنين. بالطبع ، إذا كنت لا تستخدمه بالفعل ، أقترح استخدام ACE مزود كما أعتقد أن Microsoft سوف أيضا. أيضا ، لاحظ الاتصال Extended Properties:

"HDR = نعم ؛" يشير إلى أن الصف الأول يحتوي على أسماء الأعمدة ، وليس البيانات. "HDR = لا ؛" يشير إلى العكس.

"imex = 1 ؛" يخبر السائق دائمًا بقراءة أعمدة البيانات "intermixed" (الأرقام والتواريخ والسلاسل وما إلى ذلك) كنص. لاحظ أن هذا الخيار قد يؤثر على ورقة Excel Write Access سالبة.

اعلمني اذا كان هذا مفيدا لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top