You could model this:
- Establish Basic geometry, (mine is an extruded half round-cube) and reserve a highly-subdivided copy, you're going to shrinkwrap to it later
- X Delete > Only Faces
- Edge Menu > Subdivide
- F refill the faces, and Face Menu > Poke them
- Select one of the new vertices, and Shift G Select Similar > Number of Connecting Edges. Deselect the ones you don't want to be holes.
- CtrlShiftB Bevel the remaining selected vertices, with an offset. Note the offset setting.
You can use the shipped add-on Loop Tools > Circle if necessary, to round the holes to a dimension slightly smaller than the bevel offset you noted. Delete the hole faces. Now you use the Srinkwrap modifier targeted on your reserved intact copy to ensure the surface has not been distorted by the edge subdivision, poking, etc, and apply it.
The rest is modifiers: Solidify, Bevel (by angle), Subdivision Surface...