أفضل طريقة للحصول على القيمة النصية للخلايا في ملف Excel (*.xls).

StackOverflow https://stackoverflow.com/questions/1685501

  •  18-09-2019
  •  | 
  •  

سؤال

أحاول كتابة وظيفة استيراد لإخراج البيانات من ملف Excel.كيف أفعل ذلك حاليًا هو كما يلي:

Private Sub ReadExcel(ByVal childform As PhoneDiag.frmData, ByVal FileName As String)

        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet

        xlApp = New Excel.ApplicationClass
        xlWorkBook = xlApp.Workbooks.Open(FileName)
        xlWorkSheet = xlWorkBook.Worksheets(1)
        Dim columnrange = xlWorkSheet.Columns
        Dim therange = xlWorkSheet.UsedRange

        ''Add rows by column
        For rCnt = 2 To therange.Rows.Count

            Dim rowArray(therange.Columns.Count) As String

            For cCnt = 1 To therange.Columns.Count

                Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
                Dim celltext As String
                celltext = Obj.Value.ToString
                rowArray((cCnt - 1)) = celltext

            Next

            childform.datagridSample.Rows.Add(rowArray)

        Next

        '' make sure we close the excel.exe service after use
        xlWorkBook.Close()
        xlApp.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

    End Sub

المشكلة، بطبيعة الحال، هي أنها تعمل بشكل فظيع.ومما يمكنني جمعه، فمن المرجح أن يصل الأمر إلى هذا السطر:

Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)

كل ما أحتاجه هو النص من الخلايا، وليس إنشاء كائن لكل خلية (ثم عدم إرسالها إلى مجموعة البيانات المهملة).هل هناك طريقة أسهل للحصول على النص؟

من الناحية المثالية، إذا كان بإمكاني الحصول على طريقة للحصول على القيم النصية للخلية، فأنا أرغب في إضافة الصفوف المتعددة () إلى مصفوفة رئيسية وتحديث قيم البرنامج لاحقًا.

إذا رأيت أي نصائح أخرى للأداء، فأخبرني بذلك.وسيكون موضع تقدير كبير.= ب

يحرر:أدرك أيضًا أن لدي خيارين إذا أردت إنشاء مصفوفة رئيسية، مثل mArr، للاحتفاظ بجميع البيانات.هل سيكون من الأفضل من حيث الأداء أن يكون mArr كبيرًا والمصفوفات الفرعية صغيرة، أو أن يكون mArr صغيرًا والمصفوفات الفرعية تحتوي على المزيد من المعلومات؟

أسأل لأن الملفات التي سيتم استيرادها ستحتوي على صفوف أكثر من الأعمدة، لذلك كنت أتساءل عما إذا كانت هناك أي طريقة "ضبط" للقيام بذلك.

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

المحلول

تعد قراءة محتوى الخلية بشكل فردي بمثابة قاتل كبير للأداء.نصيحتي هي قراءة النطاق بأكمله أولاً في مصفوفة من الكائنات، ثم استرداد البيانات من تلك المصفوفة.أنا لا أكتب في VB.NET، ولكن في C# يبدو الكود كما يلي:

Excel.Range firstCell = excelWorksheet.get_Range("A1", Type.Missing);
Excel.Range lastCell = excelWorksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
object[,] cellValues;
Excel.Range worksheetCells = excelWorksheet.get_Range(firstCell, lastCell);
cellValues = worksheetCells.Value2 as object[,];

يقرأ هذا المثال محتويات الورقة بالكامل في قيم الخلايا (كن حذرًا بشأن القيم الخالية).تنطبق نفس النصيحة على الكتابة على الورقة - افعل ذلك مرة واحدة باستخدام مصفوفة واحدة.
إذا كنت مهتما، لدي وظيفة أطول حول هذا الموضوع هناك
أوه وراجع للشغل، استبدال

xlApp = New Excel.ApplicationClass

بواسطة

xlApp = New Excel.Application

نصائح أخرى

إليك إصدار C # (لكنك تحصل على GIST) الذي سيحصل على البيانات في DataTable ...

con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+SpreadsheetLocation+";Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"");
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM ["+Worksheet+"$]", con);
DataTable dt = new DataTable();
da.Fill(dt);

حيث "StreationShetElocation" و "ورقة عمل" هي مسار الملف وأسماء عمل ورقة العمل على التوالي. يمكنك بعد ذلك تحويل صفوف DataTable إلى صفائف إذا أردت.

تحديث: لا تحتاج أيضا إلى Excel مثبتة في الجهاز لهذا الحل ...

للحصول على قراءة بسيطة، كنت أستخدم Excel Data Reader. متاح في Codeplex.

لا تحتاج الآلات التي تستخدم المكون إلى تثبيت Excel وهو سهل الاستخدام. يمكنك قراءة ورقة عمل في مجموعة بيانات.

streationshetgear ل .NET. سوف تتيح لك فتح مصنف والوصول إلى القيم الخام للخلايا (الأرقام والنصوص أو المنطقي أو الخطأ) أو احصل على النص المنسق للخلايا. نظرا لأن Spreadshetegear يعمل كجزء من تطبيقك بدلا من COM Interop كما هو الحال مع Excel، فسيتم تشغيله بشكل أسرع (انظر التعليقات على هذه الصفحة لمعرفة ما قاله بعض عملائنا حول الأداء).

يمكنك أن ترى العينات الحية هنا وتنزيل نسخة تجريبية مجانية هنا.

إخلاء المسئولية: أنا أملك

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