You can do this in both ways - one of them (say one protobuf message per row - for example) is scalable, but admittedly slightly complicated. The other is simple, but wouldn’t scale well.
For the first approach, you would define a message as follows (for eg):
message Row {
Col1 string
Col2 int
}
Combine it with client side streaming.
For the second approach, you would define instead:
message excelData {
data bytes
}
In the first approach, you do more work on both the client side (reading the excel file, construing a protobuf message) and the same work in reverse on the server side.
In the second approach, you do all the work on the server side.
However, the recommended approach is the first one.
Hope that helps.