Bash Script skal skrivee til excel ark

peque
Antal: 826
Tilmeldt:
20-04-2005
User is offline
Bash Script skal skrivee til excel ark

Hej Forum
Jeg har fået en lille opgave som jeg har et par spørgsmål til
Jeg har en MySQL database med nogle parametre i der logger hvert minut.
Der ønskes en rapport over de sidste 24 timer.
Denne rapport ligger i en excel skabelon hvor det er feltet H19 som jeg skal skrive min værdi til.

Min tanke er følgende:
Script starter og forespørger MySQL om parametre - Disse indlæses i variabler i mit bashscript som indsætter denne værdi i H19
Herefter converterer den excelarket til pdf via Libreoffice og leverer den færdige rapport til en netværkslokation.

Mit sopørgsmål er så - hvordan får jeg bsh til at skrive i den bestemte kolonne!

PFT
P


frogmaster
frogmaster's picture
Antal: 3107
Tilmeldt:
20-05-2010
User is offline
En txt fil (fx input.txt)

#0 Mit sopørgsmål er så - hvordan får jeg bsh til at skrive i den bestemte kolonne!

En tekst fil, fx input.txt eller input.csv med indholdet ...:

,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,1234

... vil kommasepareret skrive '1234' til celle H19 i et regneark (xlsx i dette eksempel). Det kan nemt exporteres fra LibreOffice Calc (i modsætning fra Excel) som kommasepareret (fx som input.csv).

Et bash kunne se sådan ud (bemærk at hvis du kommasepareret åbner input.txt eller input.csv direkte i Calc, så står der også '1234' i celle H19):

#!/bin/bash

awk 'BEGIN{ OFS=","; print ""};
NR > 1{print $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $15, $17, $18 $19;}' input.txt > output.xlsx

Du kan muligvis forkorte bash, hvis det udelukkende er celle H19 du vil skrive til:

#!/bin/bash

awk 'BEGIN{ OFS=","; print ""};
NR > 1{print $1, $19;}' input.csv > output.xlsx

Skriver du noget i print "", tilføjes kolonne overskrifter og skriver du noget i NR > 1{}, skrives det som række overskrifter. Hvis du vil have bash til at tilføje række overskrifter, skal du korrigere så værdien bliver stående i H19.

Eksempelvis kommer værdien til at stå i J19 i følgende:

#!/bin/bash

awk 'BEGIN{ OFS=","; print "Tekst1,Tekst2,Tekst3,Tekst4,Tekst5,Tekst6,Tekst7,Tekst8"};
NR > 1{print "Tekst1", "Tekst2",  $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $15, $17, $18 $19;}' input.csv > output.xlsx

----------

For at skrive til H19 i Excel og Windows med fx et kommasepareret (eller andet separator tegn) input.txt, først oprette det i notepad. Så åbne Excel og importere input.txt fra DATA > Fra tekst og følge guiden.


peque
Antal: 826
Tilmeldt:
20-04-2005
User is offline
Hej Frogmaster. Tak for et

Hej Frogmaster.
Tak for et svar - jeg må fordybe mig lidt og teste frem og tilbage.
Problemet som jeg ser det er at det er kun enkelte felter i Excel arket som skal udfykdes.
Reelt set henter man 2 variabler og trækker dem fra hinanden og indsætter resultatet i H4 ( eller enden defineret felt.
Selve excel skabelonen er fastlåst med farver logo og en masse fast tekst - derfdor er det kun i besatemte felter der skal indsættes data


frogmaster
frogmaster's picture
Antal: 3107
Tilmeldt:
20-05-2010
User is offline
Hej PequeDet er nødvendigt

Hej Peque

Det er nødvendigt at fordybe sig, teste løs og finde andre mulige løsninger.

Jeg vil godt give et eksempel på et kommasepareret input.csv og et bash der ikke udskifter mellemrum med kommaer ($1 osv ...). Det sætter to værdier ind i regnearket. Det første 6666666 i B3 og 1234 i D26.

Farver og formateringer i arket kan ikke lade sig gøre så vidt jeg ved. Ikke med denne metode, men muligvis vha VBA eller macro programmering i regnearket. Så skal du have fat i en programmør. Det er jeg ikke.

"Vægttabel,Med personlig foretrukken idealvægt angivelse",,,
,,,,
,666666666,,
,,,,
,,,,
"Model 1",,,
"Når regnearket bruger denne model vurderes en persons vægt i forhold til en såkaldt idealvægt ved hjælp af BMI",,,
"BMI er en forkortelse for Body Mass Index Du skal kun indtaste data i de lysorange felter",,"Dreng"
,,,,
"Begynd med at angive et 0 eller ingenting hvis du er en pige og 1 hvis du er en dreng",,"1"
,,,,
"BMI Din vægt i kg divideret med din højde i cm gange din højde i cm",,,
"Din vægt i kg,Din højde i cm,BMI,Konklusion",,,
,,"Indtast Vægt i kg i celle A14",
"Model 2",,,
"Model 2 beregner idealvægten som et gennemsnit af en persons øvre og nedre idealvægt sat i forhold til køn og højde",,,
"Når regnearket bruger denne model vurderes en persons vægt på følgende måde",,,
"Legemsvægt for mænd er lige så mange kilo som man er centimeter over 100 minus 10% minus 1kg",,,
"Legemsvægt for kvinder er lige så mange kilo som man er centimeter over 100 minus 10% minus 4kg",,,
,,,,
,,,,
,,,,
,,,,
"Din højde i cm Din ideal vægt er,Din vægt i kg Din beregnede vægt i kg er",,,
,,,,
"Min foretrukne vægt er",,,1234

-----------

#!/bin/bash
awk 'BEGIN{ OFS=","; print};
NR > 1{print ;}' input.csv > output.xlsx

phoenix
Antal: 14
Tilmeldt:
23-03-2004
User is offline
Skrive til excel ark

Jeg tror ikke du kan skrive til Excel filer fra bash direkte, du skal have fat i et programmeringssprog som f.eks. Java eller Python.
Hvis det kun er kommaseparerede filer (.csv) kan du godt nøjes med bash, men det lyder som om dit Excel ark indeholder formler etc.

Jeg har selv lidt erfaring med at skrive Excel filer ved hjælp af Groovy (http://groovy-lang.org/).
Her er et eksempel der skriver et tal til et felt i et Excel ark:

@Grapes([
    @Grab('org.apache.poi:poi:3.10.1'),
    @Grab('org.apache.poi:poi-ooxml:3.10.1')
])

import org.apache.poi.xssf.usermodel.XSSFWorkbook
import static org.apache.poi.ss.usermodel.Cell.*
import org.apache.poi.hssf.util.CellReference
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator

def input = new FileInputStream("Tester.xlsx")
def workbook = new XSSFWorkbook(input)
def field = workbook.getSheetAt(0).getRow(19).getCell(7)
field.setCellValue(42)
XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook)
FileOutputStream fileOut = new FileOutputStream("wb.xlsx")
workbook.write(fileOut)
fileOut.close()

Fra Python kan du bruge dette bibliotek:
http://xlsxwriter.readthedocs.io/


frogmaster
frogmaster's picture
Antal: 3107
Tilmeldt:
20-05-2010
User is offline
Jeg tror ikke du kan

#4: Jeg tror ikke du kan skrive til Excel filer fra bash direkte, du skal have fat i et programmeringssprog som f.eks. Java eller Python.
Hvis det kun er kommaseparerede filer (.csv) kan du godt nøjes med bash, men det lyder som om dit Excel ark indeholder formler etc.

Ja, jeg tror også man skal ud noget andet end bash. Jeg tror heller ikke man kan skrive til et regneark. Der er mere tale om at oprette et regneark, og derfor bliver indhold overskrevet.

Der er ingen kommasepareret fil her, kun en function. Jeg kan godt få den til at skrive i en bestemt celle, men så vil den samtidig skrive til de overliggende celler i kolonnen. Dvs den kommer ikke til opfylde #0 's ønske. Hvis nogen kan få det til at lykkes, så hører jeg gerne hvordan.

#!/bin/bash

FUNK ()
{ # A somewhat more complex function.
  i=0
  REPEATS=3

while [ $i -lt $REPEATS ]
  do
    awk 'BEGIN{ OFS=","; print ",,,text"};
    NR > 1{print ;}' > output.xlsx
    let "i+=1"
  done
}

FUNK

$SHELL