In the comments, using SQL Server Reporting Services was suggested as an option. I started doing some research on that as an option but I need a really quick solution so I ended up doing the following:
I managed to find some posts online with some code that lead me to a solution.
http://www.mattmasson.com/2013/03/refresh-an-excel-workbook-with-a-script-task/
and
https://social.msdn.microsoft.com/Forums/vstudio/en-US/8bce17fb-eacd-4df3-8c10-bf8ae8a93c55/c-code-to-refresh-excel-data?forum=csharpgeneral
The code in both are very similar. It is written in c# and looks something like this:
var filename = "SomePath\\Book2.xlsx";
object missingValue = System.Reflection.Missing.Value;
var excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
excelApp.DisplayAlerts = false;
var Workbook = excelApp.Workbooks.Open(filename, missingValue, missingValue,
missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue,
missingValue, missingValue, missingValue, missingValue, missingValue);
Workbook.RefreshAll();
System.Threading.Thread.Sleep(30000);
Workbook.Save();
Workbook.Close(false, filename, null);
excelApp.Quit();
Workbook = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
The call to Thread.Sleep() ensures that the data gets refreshed before the Workbook is saved and closed. If you call Workbook.Save() before the refresh is complete, then the data does not get updated. There has to be a better way to do this, but I don't know what it is yet.
I am just using Windows task scheduler to call this script to run at specific times. It is not the most elegant solution but it works.