Navigatie

Contact

Send mail to the author(s) E-mail

View Richard Soeteman's profile on LinkedIn

RSS 2.0 | Atom 1.0 | CDF

Archief

Categorieën

Blogroll

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

Sign In

Zoeken

# Monday, 21 August 2006
Monday, 21 August 2006 14:42:16 (GMT Daylight Time, UTC+01:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Normaliter blog ik niet over Excel, echter een probleemmelding waar ik vandaag betrokken bij was heeft me doen besluiten deze blogpost te plaatsen.

Een Excel document met vele Worksheets wordt geopend daarin worden 28 cellen aangepast waar de berekening van afhankelijk is. De output cellen worden door een applicatie gevuld en uitgelezen. Dit hele proces doet er ongeveer 5 seconde over. Na een aantal tests kwam ik erachter dat dit komt doordat de berekening elke keer uitgevoerd wordt wanneer een cel wordt aangepast. Dus de berekening werd 28 maal uitgevoerd.

In Excel kan je aangeven hoe berekeningen uitgevoerd moeten worden, dit gaat door property Calculation op Excel.Application te initialiseren, deze verwacht enumerator XlCalculation. XlCalculation kent de volgende waarden:

- XlCalculation.xlCalculationAutomatic, het berekenen start automatisch an het aanpassen van een cel. De standaard instelling van Excel
- XlCalculation.xlCalculationSemiautomatic, het berekenen start automatisch an het aanpassen van een cel. Echter worden tabellen worden niet meegenomen in berekening.
- XlCalculation.xlCalculationManual, Automatisch berekenen is uitgeschakeld. Berekenen dient handmatig te gebeuren.

Uiteraard wil ik uiteindelijk wel de berekening uitvoeren. Excel.Application kent hiervoor de volgende methoden:

- Calculate(), de berekening wordt uitgevoerd. De Calculate methode kan je overigens ook gebruiken op worksheets, cellen etc. Met de Calculate methode is het dus mogelijk een aparte cel opnieuw te berekenen
- CalculateFull(),de berekening wordt uitgevoerd op alle geopende workbooks
- CalculateFullRebuild(),de berekening wordt uitgevoerd en berekend tevens alle afhankelijke worksheets opnieuw.

Verder kent Excel.Application de property CalculateBeforeSave, waarmeer je aangeeft of de Calculate methode uitgevoerd moet worden voordat het Excel sheet opgeslagen wordt.Onderstaand mijn applicatie in VB.Net, de relevante regels heb ik in bold weergegeven.

Dim
excelApp As New Excel.Application()
Dim excelWorkBook As Excel.Workbook()
Dim excelworkSheet As Excel.Worksheet()

excelApp.Workbooks.Open("C:\Exceldoc.xls")
excelWorkBook = excelApp.ActiveWorkbook
excelworkSheet = excelWorkBook.Worksheets.Item(1) 'Eerste sheet

excelApp.Calculation = XlCalculation.xlCalculationManual
'Zet waarden…..

excelApp.CalculateFullRebuild() 'Bereken het Excel sheet opnieuw

excelApp.ActiveWorkbook.Saved = True
excelApp.ActiveWindow.Close()
excelApp.Quit()

'Release objects
Marshal.ReleaseComObject(excelworkSheet)
Marshal.ReleaseComObject(excelWorkBook)
Marshal.ReleaseComObject(excelApp)

Door bovenstaande aanpassing duurt het proces nog geen seconde. Een aardige performance boost door het plaatsen van twee regels code.

Comments [0] | | # 
Monday, 21 August 2006 06:56:21 (GMT Daylight Time, UTC+01:00) ( Tools )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Nadat de eerste CTPvan Sandcastle uitkwam was op vele weblogs te lezen dat het documenteren middels Sandcastle niet gemakkelijk was. Enkele dagen na de release waren er tools ontwikkeld om het gebruik van Sandcastle te vereenvoudigen.

Een tool die ik zelf erg prettig vind is Sandcastle Help File Builder. De tool heeft een gebruikersinterface die afgeleid is van nDoc, sterker nog je nDoc project files kan je binnen deze tool ook gebruiken. Ook is het mogelijk deze tool deel uit te laten maken van je build proces, zodat je documentatie tijdens de build automatisch gegenereerd wordt. 

Download Sandcastle Help File Builder

Comments [0] | | # 
# Thursday, 17 August 2006
Thursday, 17 August 2006 20:38:57 (GMT Daylight Time, UTC+01:00) ( ASP.NET )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

De bekende ASP.NET Page lifecycle poster gemaakt door Léon Andrianarivony. Aangezien de link naar zijn site niet meer werkt heb ik besloten hem op mijn eigen weblog te plaatsen.



Download de poster op ware grootte

Comments [1] | | # 
# Sunday, 13 August 2006
Sunday, 13 August 2006 14:15:38 (GMT Daylight Time, UTC+01:00) ( ASP.NET | C# )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Afgelopen week wilde ik het standaard Xml Control wilde gebruiken, echter was het niet mogelijk XSLT direct als String door te geven, wat voor mijn toepassing wel nodig was. Voor de rest doet het Xml Control exact wat ik wil, dus uitbreiden maar.

Allereerst maken we een nieuwe klasse aan welke erft van System.Web.UI.WebControls.Xml. 
public class XmlExtender : System.Web.UI.WebControls.Xml

Op dit punt kunnen we exact hetzelfde dat het Xml Control kan. Vervolgens maken we een extra property TransformContent.

public string TransformContent
{
  set
  {
    XslTransform xslTrans = new XslTransform();
    xslTrans.Load(XmlReader.Create(new StringReader(value)));
    this.Transform = xslTrans;
  }
}

De naam is zorgvuldig gekozen, er bestaat reeds een property DocumentContent welke xml als string verwacht. TransformContent creeert een xslTransformer en leest de string in. Vervolgens geef ik de de xslTransformer aan Property Transform van het Xml control en heb ik exact de functionaliteit die ik wil hebben. Simpel maar doeltreffend.

Nu kunnen we het control gebruiken in een webapplicatie. Voor het testen van het control heb ik een  demo site ontwikkeld wat een kleine lijst met boeken toont. 

In default.aspx registreren we ons control

<%@ Register Assembly="XmlControlExtender" Namespace="ControlExtenders" TagPrefix="ext" %>

Vervolgens plaatsen we het control op de pagina.

<ext:XmlExtender ID="xmlDemo" runat="server" />

In ons codebehind geven we de documentContent en de Transformcontent mee.

xmlDemo.DocumentContent = GetXml();
xmlDemo.TransformContent = GetXslt();

GetXml geeft het xml document als string terug.

private string GetXml()
{
     StringBuilder s = new StringBuilder();
     s.Append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
     s.Append("<books>");
     s.Append("<book><title>Programming .Net Components</title><author>Juval L&#246;wy</author></book>");
     s.Append("<book><title>.Net 2.0 Generics</title><author>Tod Golding</author></book>");
     s.Append("<book><title>Head First Design Patterns</title><author>Freeman &amp; Freeman</author></book>");
     s.Append("</books>");
     return s.ToString();
}

GetXslt geeft de xslt als string terug.

private string GetXslt()
{
   StringBuilder s = new StringBuilder();
   s.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?><xsl:stylesheet version=\"1.0\"  xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">");
   s.Append("<xsl:template match=\"/books\">");
   s.Append("<html><body>");
   s.Append("<xsl:for-each select=\"book\">");
   s.Append("Titel: <xsl:value-of select=\"title\"/><br/>");
   s.Append("Auteur: <xsl:value-of select=\"author\"/><br/><br/>");
   s.Append("</xsl:for-each>");
   s.Append("</body></html>");
   s.Append("</xsl:template>");
   s.Append("</xsl:stylesheet> ");
   return s.ToString();
}

Na het starten van de webapplicatie wordt het XML document netjes opgemaakt door de opgegeven stylesheet.

Met deze blogpost hoop ik aangetoond te hebben dat standaard Webcontrols zich makkelijk laten uitbreiden en moedig een ieder zeker aan dit ook eens te doen. 

XmlControlExtender is vrij te gebruiken in je eigen applicatie. Download de Sourcecode inclusief demo of alleen het control.

Comments [0] | | # 
# Friday, 11 August 2006
Friday, 11 August 2006 22:25:39 (GMT Daylight Time, UTC+01:00) ( ASP.NET )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Onlangs heb ik een project moeten migreren van .Net 1.1 naar .Net 2.0. Vele warnings kreeg ik omdat klassen obsolete waren. Vandaag had ik het Xml Webcontrol nodig en wilde daar dynamisch xslt aan meegeven. Hiervoor had ik de Transform property nodig, welke een XslTransform object verwacht. Hey was deze niet obsolete? Raar dat je tijdens een migratie eerst alle obsolete klassen moet vervangen en dan vervolgens  bij de eerstvolgende toevoeging weer een obsolete klasse moet gebruiken. Ik weet wel dat de warnings te omzeilen zijn maar ik vind het niet netjes van Microsoft ze hier geen aandacht aan hebben geschonken.

Comments [0] | | #