Когда мне нужно извлечь значения из книги 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.