Question EoF dans un fichier Excel

Plus d'informations
il y a 16 ans 8 mois #4874 par Jaggi Laurent
Bonjour,

Comme beaucoup sur ce forum, je débute en PowerShell et je suis tombé sur votre site qui a été d'un grand secours pour faire mes premiers pas dans ce language.

Je dois réaliser un script qui va récupérer, quotidienement, via une url des valeurs de température et d'humidité sur un boîtier qui est branché sur notre Lan. Ces valeurs doivent être inscrites dans un fichier Excel ou je vais rajouter chaque jour les nouvelles données. J'ai passablement avancé dans mon script mais je n'arrive pas à trouver le moyen de connaître la dernière ligne qui a été écrite dans mon fichier Excel.

Encore bravo pour votre site et merci d'avance de votre réponse.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 8 mois #4875 par Laurent Dardenne
Salut,
essaie ceci :
[code:1]
$filepath=\"fichierExcel\"
$excel=new-object -comobject excel.application
$classeur=$excel.workbooks.open($filepath)
$feuille=$classeur.worksheets.item(1)

$LastRow=$feuille.Rows.Count
Write-warning \"nb de ligne : $LastRow\"
$LastRow=$feuille.UsedRange.Rows.Count
Write-warning \"nb de ligne : $LastRow\"


$excel.quit()
#Force la libération des ressources

$null=[System.Runtime.InteropServices.Marshal]::ReleaseComObject($feuille)
$null=[System.Runtime.InteropServices.Marshal]::ReleaseComObject($classeur)
$null=[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
[System.GC]::Collect([System.GC]::MaxGeneration)
[/code:1]
Sache que le nb de ligne renvoyé par UsedRange prend en compte les lignes vides s'il en existe.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 8 mois #4877 par Arnaud Petitjean
Bonjour ljaggi, soit le bienvenu dans notre communauté ;)

Pour ma culture, pourrais tu me dire la marque de ces boitiers ? Dans ma boite on utilise des sondes de marque Testo. Est-ce la même chose ?

Sinon pour ce qui concerne ton script, le plus simple serait de générer un fichier CSV (fichier texte plat dont les champs sont séparés par des virgules ou autre séparateur).
Pour toi ce sera bien plus simple à faire que de manipuler l'objet COM d'Excel et Excel le mettra en forme tout seul dès son ouverture. Qu'en dis tu ?

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 8 mois #4878 par Jaggi Laurent
Réponse de Jaggi Laurent sur le sujet Re:EoF dans un fichier Excel
Bonjour à vous deux,

Merci pour la rapidité et la pertinence de votre réponse.
@Laurent Dardenne
Je vais essayer ta solution au plus vite et je vous tiens au courant.

@Arnaud
Il s'agit d'un boîtier Infratec RMS200. Il n'est pas cher mais par contre il n'offre pas beaucoup de solution d'export des données. Ce qui explique le script PS.

Effectivement ton idée de générer un fichier csv aurait été beaucoup plus simple. Mais bon cela me fait un bon exercice de le faire avec Excel. Surtout que le scripting n'est pas mon fort.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 8 mois #4887 par Arnaud Petitjean
Salut ljaggi,

Justement si le scripting n'est pas ton fort, à ta place je commencerais par des choses simples pour bien assimiler les concepts plutot que manipuler des objets COM.

Après, tout dépend du temps dont tu disposes pour faire ton script...

Bon week-end,

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 8 mois #4916 par Jaggi Laurent
Réponse de Jaggi Laurent sur le sujet Re:EoF dans un fichier Excel
Me voilà de retour avec mon script,

Actuellement mon script fonctionne bien. Maintenant j'essaie de l'exécuter via une tâche planifié sur un serveur TS W2K3. Cela fonctionne quand l'utilisateur à une session ouverte mais pas quand sa session est fermé. Le problème se produit que l'utilisateur ait des droits admin ou non. Avez-vous une idée?

[code:1]$sUrl = \"http://192.168.1.229/si?u=admin&p=admin\"
$sPathXls= \"c:\PrjTemperature\temperature.xls\"
$aTemp =@()
$oIe = New-Object -ComObject InternetExplorer.Application
$oXls = New-Object -ComObject Excel.Application

$sDate = Get-Date -format \"dd MMM yyyy à H:m\"

#$oIe.Visible = $True
#$oXls.Visible = $True
$oIe.navigate($sUrl)

do {Start-Sleep -s 1} while ($oIe.busy -like \"True\" )

$sTemp = $oIe.document.documentelement.InnerText
#Write-Host $str
$aTemp = $sTemp.split() | select-string \"\d{2,4}\"

If (Test-Path($sPathXls)) {

$oClass = $oXls.Workbooks.Open($sPathXls)
$oSheet = $oClass.Worksheets.Item(1)
Write-Warning \"Ouverture du fichier Excel $iLastRow\"
}
Else {
$oClass = $oXls.Workbooks.Add()
$oClass.SaveAs($sPathXls)
$oSheet = $oClass.Worksheets.Item(1)
$oSheet.Cells.Item(1,1) = \"Date\"
$oSheet.Cells.Item(1,2) = \"Tempé. 1\"
$oSheet.Cells.Item(1,3) = \"Tempé. 2\"
$oSheet.Cells.Item(1,4) = \"Tempé. 3\"
$oSheet.Cells.Item(1,5) = \"Tempé. 4\"
$oSheet.Cells.Item(1,6) = \"Hum. 1\"
$oSheet.Cells.Item(1,7) = \"Hum. 2\"
$oSheet.Cells.Item(1,8) = \"Hum. 3\"
$oSheet.Cells.Item(1,9) = \"Hum. 4\"
for ($b = 1; $b -le 10; $b++)
{
$oSheet.Cells.Item(1,$b).Font.Bold = $true
}
$iLastRow = 2
Write-Warning \"Création du fichier Excel $iLastRow\"
}

do {Start-Sleep -s 1} while ($oXls.busy -like \"True\" )
$iLastRow = $oSheet.UsedRange.Rows.Count + 1
$oSheet.Cells.Item($iLastRow,1) = $sDate
$iLastColl = 2
ForEach ($sValeur in $aTemp) {

$sValeur = [string]$sValeur
if ($sValeur -eq \"-27300\"«») {
$sValeur = \"N/A\"
}
elseif ($sValeur -eq \"255\"«»){
$sValeur = \"N/A\"
}
else
{
if ($iLastColl -lt 6) {
$sValeur = $sValeur.Insert($sValeur.length-2,\".\"«»)
}

}

$oSheet.Cells.Item($iLastRow,$iLastColl) = $svaleur
$iLastColl++
#Write-Host $i $valeur
}
$oClass.Save()
$oIe.quit()
$oXls.quit()[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.083 secondes
Propulsé par Kunena