Hi,
I do this all the time.
I use Excel datasource for the params to call any given services for a single discrete test. I use Groovy scripts to run checks (not assertions) on the response in order to work out what has passed or failed for that test.
I then use a datastore step to write out the data. I do not put the results back into the same Excel spreadsheet as the datasource, this doesn't make sense for future tests runs. But, using the datastore step, you could pretty much write back out each column from the current row in the datasource as well was well the results from Groovy steps containing assertions. I do this too.
For the datastore setup, you can even use a groovy step to define the datastore filename. I do this to give my datastore file a timestamp.
I haven't actually used Excel as a datastore, I use (a kind of) CSV and define the pipe symbol as my separator. Can't always trust commas because, y'know, sentences or strings. I then import these into a nicely formatted spreadsheet that is full of conditional formatting to colour the passes and fails.
Each Groovy script will perform some sort of test. E.g. customer surname in response matches the expected customer surname in the datasource by using a simple 'if' statement, then return the result. I don't use assertions because the test will fail at that point. I don't want that. I'd rather I run tests for every row and then see what has failed. Some of my data-driven (aka functional tests) contain over 1,000 rows. If I used assertions I'd have to continually have to stop-fix-retest.
When setting up the datastore, you can use the nifty 'get data' by right-clicking in the value cell for the datastore prop, simply navigate to the Groovy step and then select Groovy Step result. What this does is run the check and pull out the return value and shove it in the datastore.
Sounds complicated, and it can be tricky to set up, so just try and get the flow working for one or two values. Once you manage this, you'll be flying in no time.