crude way to speed up excel buffer

Reinhard
Member Posts: 249
If you have tried to use the excel buffer you have problably seen how slow it is. Recently I noticed someone running a report that was taking several hours...
A big part of the problem lies in the fact that the excel buffer checks every single possible formatting option for every single cell that you write to. Now, most likely you aren't using italics, bold, colors, number formatting, formulas, comments, or line styles. So by simply formatting out those checks it becomes pretty quick:
Again, very crude, but it only takes a moment and you will be able to run a report in a couple minutes instead of a couple hours.
A big part of the problem lies in the fact that the excel buffer checks every single possible formatting option for every single cell that you write to. Now, most likely you aren't using italics, bold, colors, number formatting, formulas, comments, or line styles. So by simply formatting out those checks it becomes pretty quick:
REPEAT InfoRecNo := InfoRecNo + 1; Window.UPDATE(1,ROUND((RecNo + InfoRecNo) / TotalRecNo * 10000,1)); // IF InfoExcelBuf.NumberFormat <> '' THEN // XlWrkSht.Range(InfoExcelBuf.xlColID + InfoExcelBuf.xlRowID).NumberFormat := // InfoExcelBuf.NumberFormat; IF InfoExcelBuf.Formula = '' THEN XlWrkSht.Range(InfoExcelBuf.xlColID + InfoExcelBuf.xlRowID).Value := InfoExcelBuf."Cell Value as Text" ELSE XlWrkSht.Range(InfoExcelBuf.xlColID + InfoExcelBuf.xlRowID).Formula := InfoExcelBuf.GetFormula; { IF InfoExcelBuf.Comment <> '' THEN XlWrkSht.Range(InfoExcelBuf.xlColID + InfoExcelBuf.xlRowID).AddComment := InfoExcelBuf.Comment; IF InfoExcelBuf.Bold THEN XlWrkSht.Range(InfoExcelBuf.xlColID + InfoExcelBuf.xlRowID).Font.Bold := InfoExcelBuf.Bold; IF InfoExcelBuf.Italic THEN XlWrkSht.Range(InfoExcelBuf.xlColID + InfoExcelBuf.xlRowID).Font.Italic := InfoExcelBuf.Italic; XlWrkSht.Range(InfoExcelBuf.xlColID + InfoExcelBuf.xlRowID).Borders.LineStyle := XlLineStyleNone; IF InfoExcelBuf.Underline THEN XlWrkSht.Range(InfoExcelBuf.xlColID + InfoExcelBuf.xlRowID).Borders.Item(XlEdgeBottom).LineStyle := XlContinuous; } UNTIL InfoExcelBuf.NEXT = 0;
Again, very crude, but it only takes a moment and you will be able to run a report in a couple minutes instead of a couple hours.
0
Comments
-
You have commented out two places. This is odd that simply checking for a boolean field in a table would make a difference of hours.
I'm guessing the report that calls the excel buffer sets them to true. So I would change report to set them to false.0 -
0
Categories
- All Categories
- 73 General
- 73 Announcements
- 66.6K Microsoft Dynamics NAV
- 18.7K NAV Three Tier
- 38.4K NAV/Navision Classic Client
- 3.6K Navision Attain
- 2.4K Navision Financials
- 116 Navision DOS
- 851 Navision e-Commerce
- 1K NAV Tips & Tricks
- 772 NAV Dutch speaking only
- 617 NAV Courses, Exams & Certification
- 2K Microsoft Dynamics-Other
- 1.5K Dynamics AX
- 320 Dynamics CRM
- 111 Dynamics GP
- 10 Dynamics SL
- 1.5K Other
- 990 SQL General
- 383 SQL Performance
- 34 SQL Tips & Tricks
- 35 Design Patterns (General & Best Practices)
- 1 Architectural Patterns
- 10 Design Patterns
- 5 Implementation Patterns
- 53 3rd Party Products, Services & Events
- 1.6K General
- 1.1K General Chat
- 1.6K Website
- 83 Testing
- 1.2K Download section
- 23 How Tos section
- 252 Feedback
- 12 NAV TechDays 2013 Sessions
- 13 NAV TechDays 2012 Sessions