تحسين أداء كتابة MS Excel
-
27-09-2019 - |
سؤال
أواجه مشكلات في الأداء أثناء قراءة/كتابة البيانات من/إلى خلايا MS-Excel. أنا أستخدم مكتبة كائن MS Excel 11.0 للأتمتة مع VB.NET.
حاليًا يستغرق الكثير من الوقت للقراءة والكتابة من/إلى ملفات Excel. (10 دقائق لقراءة 1000 صف :(). يبدو أن نهج القراءة والكتابة الخلية على حدة ليس ذلك غير ذلك. هل هناك أي طريقة لقراءة/كتابة البيانات باستخدام التشغيل بالجملة؟
المحلول
بدلاً من قراءة الخلية بواسطة الخلية ، يمكنك قراءة مجموعة كاملة وحفظها في Arrray ثنائي الأبعاد. يمكنك بعد ذلك الوصول إلى صفيف ثنائي الأبعاد حيث يمكنك الوصول إلى خلية في Excel.
لست على دراية جيدة بـ VB.NET لكائنات Excel ، ولكن إذا فهمت C# ، فقم بإعطاء هذا الرابط قراءة سريعة وحاول تنفيذه.
http://dotnetperls.com/excel-interop اقرأ قسم "الحصول على بيانات المصنف"
نصائح أخرى
عظيم!!!
لقد استخدمت نهج المصفوفة ثنائية الأبعاد وحققت دفعة الأداء الهائلة !!.
في السابق ، استخدمت خلية خلايا خلية كما هو موضح أدناه ،
Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"
اعتدت على التكرار على مجموعة من الخلايا واستخدمت لنسخ القيمة في كل خلية. هنا كل sheet.Cells
و cell.Value
هي مكالمة interop وللكل مكالمة ، تعطي مكالمة إلى excel.exe ، والتي تكلف المزيد من الوقت.
في النهج ثنائي الأبعاد ، قمت بملأ البيانات ، والتي سيتم نسخها في خلايا Excel ، في صفيف ثنائي الأبعاد ثم قمت بتعيين صفيف ثنائي الأبعاد لقيمة إعادة النظر في الخلايا المحددة. هو كما هو موضح أدناه ،
Dim darray(recordCount - 1, noOfCol - 1) As String
//Fill the data in darray
//startPosRange = Get the range of cell from where to start writing data
startPosRange = startPosRange.Resize(recordCount, noOfCol)
startPosRange.Value = darray
بعد هذه التعديلات ، جمعت بيانات الأداء لكل من المقاربات والنتائج رائعة بشكل مدهش !!. النهج اللاحق هو 25 مرة بالسرعة السابقة.
وبالمثل ، لقد استخدمت نهج صفيف ثنائي الأبعاد لقراءة البيانات من الخلايا وشاهدت دفعة الأداء المماثلة. عينات الرمز كما هو موضح أدناه.
نهج الخلايا على حدة ،
Dim usedRange As Excel.Range = sheet.UsedRange
For Each row As Excel.Range In usedRange.Rows()
For Each cellData As Excel.Range In row.Cells
//Gather cellData.Value in some container.
Next
نهج صفيف 2D ،
Dim usedRange As Excel.Range = sheet.UsedRange
//Here the array index starts from 1. why???
Dim darray(,) As Object = CType(usedRange.Value, Object(,))
Dim rows As Integer = darray.GetUpperBound(0)
Dim cols As Integer = darray.GetUpperBound(1)
For i As Integer = 1 To rows
For j As Integer = 1 To cols
Dim str As String
If darray(i, j) Is Nothing Then
str = ""
Else
str = darray(i, j).ToString
End If
//Use value of str
Next
Next
يرجى الرجوع،http://support.microsoft.com/kb/306023 , http://dotnetperls.com/excel-interop (شكرًا ChicksentMehighe على الرابط)
استمتع بالأداء !!!