вставка значения в xlsx с помощью оболочки - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть файл шаблона в формате xlsx, и я хочу вставить динамическое значение в одну конкретную ячейку, т.е. в зависимости от потока программы, значение в этой ячейке изменится, что, в свою очередь, изменит условия в файле xlsx для другого процесса.

Я пробовал коды типа

awk -v value=$value -v row=$row -v col=$col 'BEGIN{FS=OFS="@"} NR==row {$col=value}1' file.csv 

, но проблема в том, что я не могу использовать этот код для формата файла xlsx.Есть ли способ сделать это для формата файла xlsx, так как это файл шаблона, мне нужно сохранить формат файла xlsx.

1 Ответ

0 голосов
/ 17 декабря 2018

Когда мне нужно извлечь значения из книги Excel на моем ПК с Windows, я устанавливаю cygwin, а затем пишу небольшой скрипт оболочки, который выполняет:

cygstart "/path/to/xls2csv.vbs" 'C:/cygwin64/path/to/bookName.xlsx'
awk 'whatever' '/path/to/bookName/sheetName.csv'

и работу по извлечению каждого листа из книги какотдельный CSV, названный на основе имени листа с суффиксом «.csv» в общем каталоге, названном в честь рабочей книги, выполняется с помощью этого визуального базового сценария:

$ cat xls2csv.vbs
csv_format = 6

Dim strFilename
Dim objFSO
Set objFSO = CreateObject("scripting.filesystemobject")
strFilename = objFSO.GetAbsolutePathName(WScript.Arguments(0))
If objFSO.fileexists(strFilename) Then
  Call Writefile(strFilename)
Else
  wscript.echo "no such file!"
  wscript.echo strFilename
End If
Set objFSO = Nothing

Sub Writefile(ByVal strFilename)
Dim objExcel
Dim objWB
Dim objws

Set objExcel = CreateObject("Excel.Application")
Set objWB = objExcel.Workbooks.Open(strFilename)

For Each objws In objWB.Sheets
  objws.Copy
  objExcel.ActiveWorkbook.SaveAs objWB.Path & "\" & objws.Name & ".csv", csv_format
  objExcel.ActiveWorkbook.Close False
Next

objWB.Close False
objExcel.Quit
Set objExcel = Nothing
End Sub

Эта команда не будет выполнена из-за пробелов в файле или каталогеимена, поэтому мы должны заменить их, скажем, подчеркиванием.На самом деле я обычно копирую файл Xls во временный каталог и присваиваю ему временное имя перед запуском вышеупомянутого файла, так что я могу запустить его выше, не затрагивая оригинальный файл и не заботясь о пути к исходному файлу.Для этого требуется абсолютный путь к входной книге Excel.

Возможно, вам придется добавить wait и / или sleep перед командой awk, чтобы убедиться, что сценарий VB выполнен перед командой awk.пробеги.Мой не показанный шелл-код является своего рода извилистым тестированием для сценария VB, создающим, затем удаляющим файлы tmp, чтобы убедиться, что сценарий VB выполнен, и циклически пытающимся, а затем убивая Excel, если он не запускается или зависает перед вызовом awk - я написал это долгое времяназад, это беспорядок, и я сомневаюсь, действительно ли это необходимо или хороший подход, поэтому я не включаю его здесь.

Чтобы вернуть эти значения обратно в многолистовую книгу, вам придетсяоткрыть любой обновленный / сгенерированный CSV с Excel (или скопировать / вставить).Вероятно, можно было бы написать какой-нибудь другой VB-скрипт для импорта CSV-файлов, точно так же, как я их экспортировал выше, но мне никогда не требовалась эта функциональность, так что подумайте, как это будет выглядеть.

Я не знаю, еслихотя вам это нужно - если ваш awk-скрипт записывает CSV, вы можете просто дважды щелкнуть по выходному файлу .csv, и Excel с радостью откроет и отобразит его так же, как любой файл Excel .xls или .xlsx.

Итак, чтобы делать то, что вы хотите, предполагая, что ваш исходный контент находится в «Листе 1» одностраничной книги Excel «MyStuff.xlsx», вы должны сделать это из cygwin:

cygstart "/path/to/xls2csv.vbs" 'C:/cygwin64/path/to/MyStuff.xlsx'
wait; sleep 10     # or similar
awk -v value="$value" -v row="$row" -v col="$col" 'BEGIN{FS=OFS=","} NR==row {$col=value}1' '/path/to/MyStuff/Sheet1.csv' > "/tmp/tmp$$" &&
mv "/tmp/tmp$$" '/path/to/MyStuff/Sheet1.csv'

, а затем в Windows просто дважды-нажмите /path/to/MyStuff/Sheet1.csv, чтобы открыть его в Excel (вам может понадобиться связать суффикс файла .csv с Excel, когда вы это делаете в первый раз).

Обратите внимание, что приведенное выше будет работать только с простыми CSV, см. Каков наиболее надежный способ эффективного анализа CSV с использованием awk? , как в целом эффективно обрабатывать CSV с помощью awk.

...