Электронная таблица Microsoft Excel, используемая в качестве вычислительного механизма, вызываемого из кода - PullRequest
3 голосов
/ 16 марта 2012

У меня есть электронная таблица MS Excel, которая выполняет сложные вычисления.Я хотел бы создать скрипт, который будет создавать файл CSV с результатами, полученными из электронной таблицы.

Я мог бы переписать логику из электронной таблицы на моем языке программирования (например, Ruby, но я открытиспользовать другой язык), но тогда мне придется обновлять мой код всякий раз, когда кто-то меняет логику в электронной таблице.Можно ли использовать электронную таблицу MS Excel в качестве черного ящика, вычислительного механизма, который может быть вызван из моего кода?Тогда мне нужно было бы записать только часть CSV и загрузить входные данные в мой код, вся логика вычислений могла бы остаться в электронной таблице и легко обновляться.

В идеале я не хочу добавлять какое-либо поколение CSVили код загрузки данных в электронную таблицу, поскольку он используется экспертами в области (а не программистами).Кроме того, мне нужно загрузить некоторые данные из Интернета и передать их в электронную таблицу в качестве входных значений.Я хотел бы сохранить эту часть кода снаружи, в системе контроля версий, такой как Git.Еще одно замечание: в электронной таблице используется плагин Solver Excel.

Любая помощь в этом вопросе будет принята с благодарностью.

Спасибо, Михал

1 Ответ

2 голосов
/ 16 марта 2012

Чтобы манипулировать электронной таблицей Excel с использованием Ruby, вы можете использовать win32ole

Вот пример сценария:

data = [["Hello", "World"]]

# Require the WIN32OLE library
require 'win32ole'
# Create an instance of the Excel application object
xl = WIN32OLE.new('Excel.Application')
# Make Excel visible
xl.Visible = 1
# Add a new Workbook object
wb = xl.Workbooks.Add
# Get the first Worksheet
ws = wb.Worksheets(1)
# Set the name of the worksheet tab
ws.Name = 'Sample Worksheet'
# For each row in the data set
data.each_with_index do |row, r|
  # For each field in the row
  row.each_with_index do |field, c|
      # Write the data to the Worksheet
      ws.Cells(r+1, c+1).Value = field.to_s
  end
end
# Save the workbook
wb.SaveAs('workbook.xls')
# Close the workbook
wb.Close
# Quit Excel
xl.Quit

Чтобы разработать более сложный код, просто запишите макрос того, что вы хотите сделать, а затем посмотрите на код вашего макроса и преобразовайте его из VB в Ruby.

...