Question
EoF dans un fichier Excel
- Jaggi Laurent
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 8
- Remerciements reçus 0
il y a 16 ans 8 mois #4874
par Jaggi Laurent
EoF dans un fichier Excel a été créé 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.
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 8 mois #4875
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:EoF dans un fichier Excel
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.
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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 16 ans 8 mois #4877
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:EoF dans un fichier Excel
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
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.
- Jaggi Laurent
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 8
- Remerciements reçus 0
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.
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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 16 ans 8 mois #4887
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:EoF dans un fichier Excel
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
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.
- Jaggi Laurent
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 8
- Remerciements reçus 0
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]
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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- EoF dans un fichier Excel